Skip to content

perf: fast-path substring guards + short-circuit ordering fixes in parser matches()#36

Merged
anmorgunov merged 2 commits into
masterfrom
perf/short-circuit
Mar 12, 2026
Merged

perf: fast-path substring guards + short-circuit ordering fixes in parser matches()#36
anmorgunov merged 2 commits into
masterfrom
perf/short-circuit

Conversation

@anmorgunov

@anmorgunov anmorgunov commented Mar 12, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Fast-path in guards added to 22 matches() methods (15 Q-Chem + 7 ORCA parsers): each now begins with a cheap if "KEYWORD" not in line: return False before invoking the regex engine. On non-matching lines (the common case), this reduces matches() cost from O(regex) to O(substring).

  • Short-circuit ordering fixed in 5 parsers where regex ran before the boolean state flag: GeometryParser (Q-Chem), MullikenParser, HirshfeldParser, Cm5Parser, MultipoleParser. The O(1) state flag check now always precedes the O(n) regex.

  • ORCA ChargesParser had no state guard at all — it ran two regex searches on every line for the entire file even after both Mulliken and Loewdin were parsed. Added a combined completion guard (if state.parsed_mulliken and state.parsed_loewdin: return False) plus a keyword fast-path ("MULLIKEN" / "LOEWDIN").

  • Q-Chem TerminationParser intentionally left without a fast-path guard: its ERROR_TERM_PAT is a broad 4-keyword IGNORECASE catch-all; the existing termination_status != "UNKNOWN" guard already short-circuits once the status is decided.

Files changed (22)

Q-Chem: metadata.py, geometry.py, scf.py, charges.py, hirshfeld.py, cm5.py, orbitals.py, multipole.py, timing.py, tddft/excitations.py, tddft/nto.py, tddft/gs_ref.py, tddft/unrel_dm.py, tddft/trans_dm.py, adc/ground_state.py, adc/excited_states.py

ORCA: charges.py, geometry.py, orbitals.py, dispersion.py, finalization.py (both parsers), timing.py

Verification

All 1924 tests pass (uv run pytest --tb=short -q). uvx ruff check clean on all changed files.

Greptile Summary

This PR adds O(substring) fast-path keyword guards to 22 matches() methods across Q-Chem and ORCA parsers, and fixes short-circuit evaluation ordering in 5 parsers so that cheap O(1) state-flag checks always precede O(n) regex searches. The net effect is that the hot path — the overwhelming majority of lines in an output file that don't begin any block — now returns False after a single in membership test rather than invoking the regex engine.

Key changes:

  • 22 keyword guards added: each matches() now opens with if "LITERAL" not in line: return False, where "LITERAL" is always a substring of the corresponding compiled regex pattern, guaranteeing no false negatives.
  • 5 short-circuit ordering fixes (GeometryParser, MullikenParser, HirshfeldParser, Cm5Parser, MultipoleParser): expressions like bool(PAT.search(line)) and not state.parsed_X were reversed to not state.parsed_X and bool(PAT.search(line)) so the O(1) flag is evaluated first under Python's short-circuit and.
  • ORCA ChargesParser received a combined completion guard (if state.parsed_mulliken and state.parsed_loewdin: return False) plus keyword guards, eliminating two unbounded regex searches per line for the entire file length once both charge types are captured.
  • All 1924 existing tests pass with no behaviour changes.

Confidence Score: 5/5

  • This PR is safe to merge — it is a pure performance optimisation with no semantic behaviour changes.
  • Every keyword guard string is a literal substring of its corresponding compiled regex, so no guard can produce a false negative. The five short-circuit reorderings are straightforward Python and-expression swaps. The ORCA ChargesParser combined guard is logically correct for both Mulliken-only and Loewdin-only files (the guard only exits early when both flags are true, so a single-type file continues matching as before). All 1924 tests pass.
  • No files require special attention.

Important Files Changed

Filename Overview
src/calcflow/io/orca/blocks/charges.py Added combined completion guard (parsed_mulliken AND parsed_loewdin) and keyword fast-path for "MULLIKEN"/"LOEWDIN". Logic is correct; combined guard correctly defers exit until both charge types are parsed regardless of order.
src/calcflow/io/orca/blocks/finalization.py Added keyword guards for both FinalEnergyParser ("FINAL SINGLE POINT ENERGY") and TerminationParser ("ORCA TERMINATED"). Both guards are exact substrings of their corresponding regex patterns.
src/calcflow/io/orca/blocks/timing.py Added dual keyword guard: "..." for module timing lines and "TOTAL RUN TIME" for the total time line. The "..." guard is broad (passes any line with three consecutive dots) but correctly covers all MODULE_TIME_PAT matches.
src/calcflow/io/qchem/blocks/geometry.py Added keyword guard using line.lower() for "$molecule" (handling IGNORECASE flag) and direct "Standard Nuclear Orientation" check. Short-circuit ordering also fixed: state flag now precedes regex in both branches.
src/calcflow/io/qchem/blocks/charges.py Fixed short-circuit order (state flag now before regex) and added "Mulliken" keyword guard. Pattern MULLIKEN_START_PAT contains "Mulliken" so the guard is a correct pre-filter.
src/calcflow/io/qchem/blocks/scf.py Added "General SCF" keyword guard; matches prefix of SCF_START_PAT ("General SCF calculation program by"). Clean and correct.
src/calcflow/io/qchem/blocks/multipole.py Fixed short-circuit order and added "Multipole Moments" keyword guard. MULTIPOLE_START_PAT ("Cartesian Multipole Moments") contains the guard substring.
src/calcflow/io/qchem/blocks/tddft/excitations.py Added "Excitation" keyword guard before the combined TDA/TDDFT state check. Both TDA_START_PAT and TDDFT_START_PAT contain "Excitation", making this guard correct.
src/calcflow/io/qchem/blocks/adc/ground_state.py Added "A D C" keyword guard for BANNER_PAT ("A D C\s+M A N"). The guard is a substring of the pattern. Correctly placed before state flag.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[CoreParser: next line] --> B{Keyword guard}
    B -->|KEYWORD not in line - skip| A
    B -->|KEYWORD in line - proceed| C{State flag check}
    C -->|already parsed - skip| A
    C -->|not yet parsed - proceed| D[Regex search]
    D -->|no match| A
    D -->|match| E[parse called - state updated]
    E --> A
Loading

Last reviewed commit: 77044d1

…n all parser matches() methods

- Add 'if KEYWORD not in line: return False' fast-path guards to 22 parsers
  (15 Q-Chem + 7 ORCA), reducing matches() cost from O(regex) to O(substring)
  on non-matching lines for the common case
- Fix reversed short-circuit ordering in 5 parsers where regex ran before the
  state flag check: GeometryParser (qchem), MullikenParser, HirshfeldParser,
  Cm5Parser, MultipoleParser — state flag (O(1)) now always precedes regex
- Add combined state guard to ORCA ChargesParser (no guard existed): stops
  after both Mulliken and Loewdin are parsed; also adds MULLIKEN/LOEWDIN
  fast-path keyword check
- Q-Chem TerminationParser intentionally left without a fast-path guard: its
  ERROR_TERM_PAT is a broad 4-keyword IGNORECASE catch-all; the existing
  termination_status guard already short-circuits once status is decided
@github-actions github-actions Bot added the scope/performance optimizations for speed, memory usage, or resource efficiency label Mar 12, 2026
@github-actions

Copy link
Copy Markdown

Pytest Coverage Report 🧪

============================= test session starts ==============================
platform linux -- Python 3.13.12, pytest-8.4.2, pluggy-1.6.0
rootdir: /home/runner/work/project-prometheus/project-prometheus
configfile: pyproject.toml
plugins: cov-7.0.0
collected 1924 items

tests/common/test_api_docs.py .......................                    [  1%]
tests/common/test_atomic_charges_ergonomics.py ........................  [  2%]
tests/common/test_input_serialization.py ............................... [  4%]
...................................................                      [  6%]
tests/common/test_results_serialization.py ............................. [  8%]
.....................                                                    [  9%]
tests/common/test_version.py ..                                          [  9%]
tests/geometry/test_annotated.py ....................................... [ 11%]
....                                                                     [ 11%]
tests/geometry/test_static.py ..................                         [ 12%]
tests/geometry/test_topology.py ........................................ [ 14%]
............................                                             [ 16%]
tests/geometry/test_trajectory.py .......                                [ 16%]
tests/io/orca/orca_builders/test_builder_basic.py ...................... [ 17%]
............................                                             [ 19%]
tests/io/orca/orca_builders/test_builder_ri.py ......................... [ 20%]
.....                                                                    [ 20%]
tests/io/orca/orca_builders/test_builder_solvation.py .................. [ 21%]
.............                                                            [ 22%]
tests/io/orca/orca_builders/test_builder_tddft.py ...................... [ 23%]
............                                                             [ 24%]
tests/io/orca/orca_builders/test_builder_validation.py ................. [ 24%]
........                                                                 [ 25%]
tests/io/orca/orca_parsers/test_orca_sp_charges.py ..............        [ 26%]
tests/io/orca/orca_parsers/test_orca_sp_dipole.py ..........             [ 26%]
tests/io/orca/orca_parsers/test_orca_sp_dispersion.py .................. [ 27%]
....                                                                     [ 27%]
tests/io/orca/orca_parsers/test_orca_sp_finalization.py ......           [ 28%]
tests/io/orca/orca_parsers/test_orca_sp_orbitals.py ...........          [ 28%]
tests/io/orca/orca_parsers/test_orca_sp_scf.py .................         [ 29%]
tests/io/orca/orca_parsers/test_orca_sp_timing.py .......                [ 29%]
tests/io/qchem/qchem_builders/test_builder_basic.py .................... [ 30%]
........................................                                 [ 32%]
tests/io/qchem/qchem_builders/test_builder_charges.py .................. [ 33%]
....                                                                     [ 34%]
tests/io/qchem/qchem_builders/test_builder_helpers.py .................. [ 35%]
.....                                                                    [ 35%]
tests/io/qchem/qchem_builders/test_builder_mom.py ...................... [ 36%]
.........................                                                [ 37%]
tests/io/qchem/qchem_builders/test_builder_solvation.py ................ [ 38%]
................................                                         [ 40%]
tests/io/qchem/qchem_builders/test_builder_tddft.py .................... [ 41%]
.......................                                                  [ 42%]
tests/io/qchem/qchem_builders/test_builder_validation.py ............... [ 43%]
....                                                                     [ 43%]
tests/io/qchem/qchem_parsers/adc/test_qchem_adc_excited_states.py ...... [ 43%]
................                                                         [ 44%]
tests/io/qchem/qchem_parsers/adc/test_qchem_adc_ground_state.py ........ [ 45%]
.........                                                                [ 45%]
tests/io/qchem/qchem_parsers/tddft/test_qchem_tddft_excitations.py ..... [ 45%]
.......................................................................  [ 49%]
tests/io/qchem/qchem_parsers/tddft/test_qchem_tddft_gs_ref.py .......... [ 49%]
.....................                                                    [ 51%]
tests/io/qchem/qchem_parsers/tddft/test_qchem_tddft_nto.py ............. [ 51%]
...........................                                              [ 53%]
tests/io/qchem/qchem_parsers/tddft/test_qchem_tddft_trans_dm.py ........ [ 53%]
....................................                                     [ 55%]
tests/io/qchem/qchem_parsers/tddft/test_qchem_tddft_unrel_dm.py ........ [ 55%]
..............................                                           [ 57%]
tests/io/qchem/qchem_parsers/tddft/test_qchem_xas_excitations.py ....... [ 57%]
.......................                                                  [ 58%]
tests/io/qchem/qchem_parsers/test_qchem_scf_mom.py ..................... [ 60%]
...................................................                      [ 62%]
tests/io/qchem/qchem_parsers/test_qchem_sp_charges.py .................. [ 63%]
......................                                                   [ 64%]
tests/io/qchem/qchem_parsers/test_qchem_sp_cm5.py ....................   [ 65%]
tests/io/qchem/qchem_parsers/test_qchem_sp_finalization.py ............. [ 66%]
.............                                                            [ 67%]
tests/io/qchem/qchem_parsers/test_qchem_sp_geometry.py ................. [ 68%]
......................................................................   [ 71%]
tests/io/qchem/qchem_parsers/test_qchem_sp_hirshfeld.py ................ [ 72%]
...                                                                      [ 72%]
tests/io/qchem/qchem_parsers/test_qchem_sp_meta.py .....                 [ 72%]
tests/io/qchem/qchem_parsers/test_qchem_sp_multipole.py ................ [ 73%]
................................................................         [ 77%]
tests/io/qchem/qchem_parsers/test_qchem_sp_orbitals.py ................. [ 77%]
..........................................................               [ 80%]
tests/io/qchem/qchem_parsers/test_qchem_sp_scf.py ...................... [ 82%]
........................................................................ [ 85%]
..........                                                               [ 86%]
tests/io/qchem/qchem_parsers/test_qchem_sp_timing.py ................... [ 87%]
...............................                                          [ 88%]
tests/io/qchem/qchem_parsers/test_qchem_tddft_basics.py ................ [ 89%]
........................................................................ [ 93%]
........                                                                 [ 93%]
tests/io/qchem/test_parse_helpers.py ............                        [ 94%]
tests/io/test_peekable.py .................                              [ 95%]
tests/postprocess/test_postprocess.py ........................           [ 96%]
tests/smoke_test.py ...........                                          [ 97%]
tests/test_slurm.py ....................................................
WARNING: Failed to generate report: No data to report.

                                                                         [100%]

================================ tests coverage ================================
_______________ coverage: platform linux, python 3.13.12-final-0 _______________

============================= 1924 passed in 5.48s =============================

@gemini-code-assist

Copy link
Copy Markdown
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request significantly enhances the performance of the parsing logic within the calcflow library for both Q-Chem and ORCA output files. By introducing early exit conditions and optimizing the order of checks in "matches()" methods, the changes aim to reduce computational overhead, particularly when processing large files with many non-matching lines.

Highlights

  • Performance Optimization: Implemented fast-path "in" guards in 22 "matches()" methods across Q-Chem and ORCA parsers, reducing the cost of non-matching lines from O(regex) to O(substring).
  • Logic Correction: Fixed short-circuit ordering in 5 parsers (Q-Chem's GeometryParser, MullikenParser, HirshfeldParser, Cm5Parser, MultipoleParser) to ensure O(1) state flag checks precede O(n) regex operations.
  • ORCA ChargesParser Enhancement: Added a combined completion guard and keyword fast-path to ORCA's ChargesParser to prevent unnecessary regex searches after both Mulliken and Loewdin charges are parsed.
  • Intentional Exclusion: Q-Chem TerminationParser was intentionally left without a fast-path guard due to its broad regex pattern and existing "termination_status" short-circuiting logic.
Changelog
  • src/calcflow/io/orca/blocks/charges.py
    • Added a combined state guard for "parsed_mulliken" and "parsed_loewdin".
    • Introduced a keyword fast-path check for "MULLIKEN" or "LOEWDIN".
  • src/calcflow/io/orca/blocks/dispersion.py
    • Added a keyword fast-path check for "DISPERSION CORRECTION".
  • src/calcflow/io/orca/blocks/finalization.py
    • FinalEnergyParser: Added a keyword fast-path check for "FINAL SINGLE POINT ENERGY".
    • TerminationParser: Added a keyword fast-path check for "ORCA TERMINATED".
  • src/calcflow/io/orca/blocks/geometry.py
    • Added a keyword fast-path check for "CARTESIAN COORDINATES".
  • src/calcflow/io/orca/blocks/orbitals.py
    • Added a keyword fast-path check for "ORBITAL ENERGIES".
  • src/calcflow/io/orca/blocks/timing.py
    • Added a keyword fast-path check for "..." or "TOTAL RUN TIME".
  • src/calcflow/io/qchem/blocks/adc/excited_states.py
    • Added a keyword fast-path check for "Excited State Summary".
  • src/calcflow/io/qchem/blocks/adc/ground_state.py
    • Added a keyword fast-path check for "A D C".
  • src/calcflow/io/qchem/blocks/charges.py
    • Added a keyword fast-path check for "Mulliken".
    • Reordered checks to prioritize "not state.parsed_mulliken".
  • src/calcflow/io/qchem/blocks/cm5.py
    • Added a keyword fast-path check for "Charge Model 5".
    • Reordered checks to prioritize "not state.parsed_cm5".
  • src/calcflow/io/qchem/blocks/geometry.py
    • Added a keyword fast-path check for "$molecule" or "Standard Nuclear Orientation".
    • Reordered checks to prioritize "not state.parsed_geometry" and "state.final_geometry is None".
  • src/calcflow/io/qchem/blocks/hirshfeld.py
    • Added a keyword fast-path check for "Hirshfeld".
    • Reordered checks to prioritize "not state.parsed_hirshfeld".
  • src/calcflow/io/qchem/blocks/metadata.py
    • Added a keyword fast-path check for "Q-Chem".
  • src/calcflow/io/qchem/blocks/multipole.py
    • Added a keyword fast-path check for "Multipole Moments".
    • Reordered checks to prioritize "not state.parsed_multipole".
  • src/calcflow/io/qchem/blocks/orbitals.py
    • Added a keyword fast-path check for "Orbital Energies".
  • src/calcflow/io/qchem/blocks/scf.py
    • Added a keyword fast-path check for "General SCF".
  • src/calcflow/io/qchem/blocks/tddft/excitations.py
    • Added a keyword fast-path check for "Excitation".
  • src/calcflow/io/qchem/blocks/tddft/gs_ref.py
    • Added a keyword fast-path check for "Ground State".
  • src/calcflow/io/qchem/blocks/tddft/nto.py
    • Added a keyword fast-path check for "NTO".
  • src/calcflow/io/qchem/blocks/tddft/trans_dm.py
    • Added a keyword fast-path check for "Transition Density".
  • src/calcflow/io/qchem/blocks/tddft/unrel_dm.py
    • Added a keyword fast-path check for "Unrelaxed".
  • src/calcflow/io/qchem/blocks/timing.py
    • Added a keyword fast-path check for "Total job time".
Activity
  • No human activity detected in the pull request.
  • All 1924 tests passed.
  • "uvx ruff check" reported no issues on changed files.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Code Review

This pull request introduces significant performance improvements by adding fast-path substring guards to matches() methods and fixing short-circuit ordering. The changes are well-implemented across numerous parsers for both ORCA and Q-Chem. I've identified a few minor areas for further improvement: one for an additional performance gain in the ORCA charges parser, and a couple of minor style consistency suggestions for regex checks.

Comment thread src/calcflow/io/orca/blocks/charges.py Outdated
Comment thread src/calcflow/io/qchem/blocks/geometry.py Outdated
Comment thread src/calcflow/io/qchem/blocks/metadata.py Outdated
…ataParser

- ORCA ChargesParser: check each flag individually before its regex so
  Loewdin regex is skipped after Mulliken is parsed (and vice versa),
  rather than waiting until both flags are set
- Q-Chem GeometryParser, MetadataParser: replace 'is not None' with
  bool() for consistency with all other parsers in the codebase
@github-actions

Copy link
Copy Markdown

Pytest Coverage Report 🧪

============================= test session starts ==============================
platform linux -- Python 3.13.12, pytest-8.4.2, pluggy-1.6.0
rootdir: /home/runner/work/project-prometheus/project-prometheus
configfile: pyproject.toml
plugins: cov-7.0.0
collected 1924 items

tests/common/test_api_docs.py .......................                    [  1%]
tests/common/test_atomic_charges_ergonomics.py ........................  [  2%]
tests/common/test_input_serialization.py ............................... [  4%]
...................................................                      [  6%]
tests/common/test_results_serialization.py ............................. [  8%]
.....................                                                    [  9%]
tests/common/test_version.py ..                                          [  9%]
tests/geometry/test_annotated.py ....................................... [ 11%]
....                                                                     [ 11%]
tests/geometry/test_static.py ..................                         [ 12%]
tests/geometry/test_topology.py ........................................ [ 14%]
............................                                             [ 16%]
tests/geometry/test_trajectory.py .......                                [ 16%]
tests/io/orca/orca_builders/test_builder_basic.py ...................... [ 17%]
............................                                             [ 19%]
tests/io/orca/orca_builders/test_builder_ri.py ......................... [ 20%]
.....                                                                    [ 20%]
tests/io/orca/orca_builders/test_builder_solvation.py .................. [ 21%]
.............                                                            [ 22%]
tests/io/orca/orca_builders/test_builder_tddft.py ...................... [ 23%]
............                                                             [ 24%]
tests/io/orca/orca_builders/test_builder_validation.py ................. [ 24%]
........                                                                 [ 25%]
tests/io/orca/orca_parsers/test_orca_sp_charges.py ..............        [ 26%]
tests/io/orca/orca_parsers/test_orca_sp_dipole.py ..........             [ 26%]
tests/io/orca/orca_parsers/test_orca_sp_dispersion.py .................. [ 27%]
....                                                                     [ 27%]
tests/io/orca/orca_parsers/test_orca_sp_finalization.py ......           [ 28%]
tests/io/orca/orca_parsers/test_orca_sp_orbitals.py ...........          [ 28%]
tests/io/orca/orca_parsers/test_orca_sp_scf.py .................         [ 29%]
tests/io/orca/orca_parsers/test_orca_sp_timing.py .......                [ 29%]
tests/io/qchem/qchem_builders/test_builder_basic.py .................... [ 30%]
........................................                                 [ 32%]
tests/io/qchem/qchem_builders/test_builder_charges.py .................. [ 33%]
....                                                                     [ 34%]
tests/io/qchem/qchem_builders/test_builder_helpers.py .................. [ 35%]
.....                                                                    [ 35%]
tests/io/qchem/qchem_builders/test_builder_mom.py ...................... [ 36%]
.........................                                                [ 37%]
tests/io/qchem/qchem_builders/test_builder_solvation.py ................ [ 38%]
................................                                         [ 40%]
tests/io/qchem/qchem_builders/test_builder_tddft.py .................... [ 41%]
.......................                                                  [ 42%]
tests/io/qchem/qchem_builders/test_builder_validation.py ............... [ 43%]
....                                                                     [ 43%]
tests/io/qchem/qchem_parsers/adc/test_qchem_adc_excited_states.py ...... [ 43%]
................                                                         [ 44%]
tests/io/qchem/qchem_parsers/adc/test_qchem_adc_ground_state.py ........ [ 45%]
.........                                                                [ 45%]
tests/io/qchem/qchem_parsers/tddft/test_qchem_tddft_excitations.py ..... [ 45%]
.......................................................................  [ 49%]
tests/io/qchem/qchem_parsers/tddft/test_qchem_tddft_gs_ref.py .......... [ 49%]
.....................                                                    [ 51%]
tests/io/qchem/qchem_parsers/tddft/test_qchem_tddft_nto.py ............. [ 51%]
...........................                                              [ 53%]
tests/io/qchem/qchem_parsers/tddft/test_qchem_tddft_trans_dm.py ........ [ 53%]
....................................                                     [ 55%]
tests/io/qchem/qchem_parsers/tddft/test_qchem_tddft_unrel_dm.py ........ [ 55%]
..............................                                           [ 57%]
tests/io/qchem/qchem_parsers/tddft/test_qchem_xas_excitations.py ....... [ 57%]
.......................                                                  [ 58%]
tests/io/qchem/qchem_parsers/test_qchem_scf_mom.py ..................... [ 60%]
...................................................                      [ 62%]
tests/io/qchem/qchem_parsers/test_qchem_sp_charges.py .................. [ 63%]
......................                                                   [ 64%]
tests/io/qchem/qchem_parsers/test_qchem_sp_cm5.py ....................   [ 65%]
tests/io/qchem/qchem_parsers/test_qchem_sp_finalization.py ............. [ 66%]
.............                                                            [ 67%]
tests/io/qchem/qchem_parsers/test_qchem_sp_geometry.py ................. [ 68%]
......................................................................   [ 71%]
tests/io/qchem/qchem_parsers/test_qchem_sp_hirshfeld.py ................ [ 72%]
...                                                                      [ 72%]
tests/io/qchem/qchem_parsers/test_qchem_sp_meta.py .....                 [ 72%]
tests/io/qchem/qchem_parsers/test_qchem_sp_multipole.py ................ [ 73%]
................................................................         [ 77%]
tests/io/qchem/qchem_parsers/test_qchem_sp_orbitals.py ................. [ 77%]
..........................................................               [ 80%]
tests/io/qchem/qchem_parsers/test_qchem_sp_scf.py ...................... [ 82%]
........................................................................ [ 85%]
..........                                                               [ 86%]
tests/io/qchem/qchem_parsers/test_qchem_sp_timing.py ................... [ 87%]
...............................                                          [ 88%]
tests/io/qchem/qchem_parsers/test_qchem_tddft_basics.py ................ [ 89%]
........................................................................ [ 93%]
........                                                                 [ 93%]
tests/io/qchem/test_parse_helpers.py ............                        [ 94%]
tests/io/test_peekable.py .................                              [ 95%]
tests/postprocess/test_postprocess.py ........................           [ 96%]
tests/smoke_test.py ...........                                          [ 97%]
tests/test_slurm.py ....................................................
WARNING: Failed to generate report: No data to report.

                                                                         [100%]

================================ tests coverage ================================
_______________ coverage: platform linux, python 3.13.12-final-0 _______________

============================= 1924 passed in 5.58s =============================

@anmorgunov anmorgunov added the scope/domain the core logic, abstractions, and internal workings of the package or application label Mar 12, 2026
@anmorgunov
anmorgunov merged commit f65df97 into master Mar 12, 2026
4 checks passed
@anmorgunov
anmorgunov deleted the perf/short-circuit branch March 12, 2026 22:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

scope/domain the core logic, abstractions, and internal workings of the package or application scope/performance optimizations for speed, memory usage, or resource efficiency

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant