Settings introspection

vibeqc.print_settings() walks every user-tunable option struct (RHFOptions, UHFOptions, RKSOptions, UKSOptions, PeriodicSCFOptions, PeriodicRHFOptions, PeriodicKSOptions, LatticeSumOptions, EwaldOptions, GridOptions, HessianFDOptions, CPHFOptions, ThermoOptions, D3BJParams) plus the runtime env vars vibe-qc reads (OMP_NUM_THREADS, LIBINT_DATA_PATH, VIBEQC_ECP_SHARE_DIR, VIBEQC_LIVE_LOGGING, VIBEQC_NO_HOSTNAME, VIBEQC_PERFLOG, VIBEQC_BUILD_BRANCH, VIBEQC_BUILD_SHA, VIBEQC_BUILD_TAG) and prints each attribute with its current value next to the default. Pass an option-struct instance to dump just that struct with * markers next to every attribute that differs from the default; pass nothing to dump every struct’s defaults. vibeqc.format_settings(...) returns the same content as a string, useful for embedding in custom job logs. Example:

import vibeqc

opts = vibeqc.RHFOptions()
opts.max_iter = 250
opts.damping = 0.7
vibeqc.print_settings(opts)
======================================================================
RHFOptions
======================================================================
    attribute                    current                   default
  ----------------------------------------------------------------------
    conv_tol_energy              1e-08                     1e-08
    conv_tol_grad                1e-06                     1e-06
  * damping                      0.7                       0.5
    diis_start_iter              2                         2
    ...
  * max_iter                     250                       100
    ...

The * columns make it obvious at a glance which knobs you turned versus which ones came along for the ride at their factory defaults.