Warning: Permanently added '32.199.160.177' (ED25519) to the list of known hosts. You can reproduce this build on your computer by running: sudo dnf install copr-rpmbuild /usr/bin/copr-rpmbuild --verbose --drop-resultdir --task-url https://copr.fedorainfracloud.org/backend/get-build-task/11283246-fedora-rawhide-aarch64 --chroot fedora-rawhide-aarch64 Version: 1.11 PID: 11802 Logging PID: 11804 Task: {'allow_user_ssh': False, 'appstream': False, 'background': False, 'build_id': 11283246, 'buildroot_pkgs': [], 'chroot': 'fedora-rawhide-aarch64', 'enable_net': False, 'fedora_review': False, 'git_hash': '0cf6bdb9f45cbfcbd95c656ed02fcc80a2144fc9', 'git_repo': 'https://copr-dist-git.fedorainfracloud.org/git/mhough/neurofedora/python-ipax', 'isolation': 'default', 'memory_reqs': 2048, 'package_name': 'python-ipax', 'package_version': '0.13.0-1', 'project_dirname': 'neurofedora', 'project_name': 'neurofedora', 'project_owner': 'mhough', 'repo_priority': None, 'repos': [{'baseurl': 'https://download.copr.fedorainfracloud.org/results/mhough/neurofedora/fedora-rawhide-aarch64/', 'id': 'copr_base', 'name': 'Copr repository', 'priority': None, 'repo_gpgcheck': False}], 'sandbox': 'mhough/neurofedora--mhough', 'source_json': {}, 'source_type': None, 'ssh_public_keys': None, 'storage': 1, 'submitter': 'mhough', 'tags': [], 'task_id': '11283246-fedora-rawhide-aarch64', 'timeout': 86400, 'uses_devel_repo': False, 'with_opts': [], 'without_opts': []} Running: git clone https://copr-dist-git.fedorainfracloud.org/git/mhough/neurofedora/python-ipax /var/lib/copr-rpmbuild/workspace/workdir-9v6db_9g/python-ipax --depth 500 --no-single-branch --recursive cmd: ['git', 'clone', 'https://copr-dist-git.fedorainfracloud.org/git/mhough/neurofedora/python-ipax', '/var/lib/copr-rpmbuild/workspace/workdir-9v6db_9g/python-ipax', '--depth', '500', '--no-single-branch', '--recursive'] cwd: . rc: 0 stdout: stderr: Cloning into '/var/lib/copr-rpmbuild/workspace/workdir-9v6db_9g/python-ipax'... Running: git checkout 0cf6bdb9f45cbfcbd95c656ed02fcc80a2144fc9 -- cmd: ['git', 'checkout', '0cf6bdb9f45cbfcbd95c656ed02fcc80a2144fc9', '--'] cwd: /var/lib/copr-rpmbuild/workspace/workdir-9v6db_9g/python-ipax rc: 0 stdout: stderr: Note: switching to '0cf6bdb9f45cbfcbd95c656ed02fcc80a2144fc9'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by switching back to a branch. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -c with the switch command. Example: git switch -c Or undo this operation with: git switch - Turn off this advice by setting config variable advice.detachedHead to false HEAD is now at 0cf6bdb automatic import of python-ipax Running: dist-git-client sources cmd: ['dist-git-client', 'sources'] cwd: /var/lib/copr-rpmbuild/workspace/workdir-9v6db_9g/python-ipax rc: 0 stdout: stderr: INFO: Reading stdout from command: git rev-parse --abbrev-ref HEAD INFO: Reading stdout from command: git rev-parse HEAD INFO: Reading sources specification file: sources INFO: Downloading ipax-0.13.0.tar.gz INFO: Reading stdout from command: curl --help all INFO: Calling: curl -H Pragma: -H 'Accept-Encoding: identity' -o ipax-0.13.0.tar.gz --location --connect-timeout 60 --retry 3 --retry-delay 10 --remote-time --show-error --fail --retry-all-errors https://copr-dist-git.fedorainfracloud.org/repo/pkgs/mhough/neurofedora/python-ipax/ipax-0.13.0.tar.gz/md5/332d8edd266b67219785f589efc65f28/ipax-0.13.0.tar.gz % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 1.07M 100 1.07M 0 0 59.20M 0 0 INFO: Reading stdout from command: md5sum ipax-0.13.0.tar.gz tail: /var/lib/copr-rpmbuild/main.log: file truncated Running (timeout=86400): unbuffer mock --spec /var/lib/copr-rpmbuild/workspace/workdir-9v6db_9g/python-ipax/python-ipax.spec --sources /var/lib/copr-rpmbuild/workspace/workdir-9v6db_9g/python-ipax --resultdir /var/lib/copr-rpmbuild/results --uniqueext 1794038830.969969 -r /var/lib/copr-rpmbuild/results/configs/child.cfg INFO: mock.py version 6.9 starting (python version = 3.14.5, NVR = mock-6.9-1.fc44), args: /usr/libexec/mock/mock --spec /var/lib/copr-rpmbuild/workspace/workdir-9v6db_9g/python-ipax/python-ipax.spec --sources /var/lib/copr-rpmbuild/workspace/workdir-9v6db_9g/python-ipax --resultdir /var/lib/copr-rpmbuild/results --uniqueext 1794038830.969969 -r /var/lib/copr-rpmbuild/results/configs/child.cfg Start(bootstrap): init plugins INFO: tmpfs initialized INFO: selinux enabled INFO: chroot_scan: initialized INFO: compress_logs: initialized Finish(bootstrap): init plugins Start: init plugins INFO: tmpfs initialized INFO: selinux enabled INFO: chroot_scan: initialized INFO: compress_logs: initialized Finish: init plugins INFO: Signal handler active Start: run INFO: Start(/var/lib/copr-rpmbuild/workspace/workdir-9v6db_9g/python-ipax/python-ipax.spec) Config(fedora-rawhide-aarch64) Start: clean chroot Finish: clean chroot Mock Version: 6.9 INFO: Mock Version: 6.9 Start(bootstrap): chroot init INFO: mounting tmpfs at /var/lib/mock/fedora-rawhide-aarch64-bootstrap-1794038830.969969/root. INFO: calling preinit hooks INFO: enabled root cache INFO: enabled package manager cache Start(bootstrap): cleaning package manager metadata Finish(bootstrap): cleaning package manager metadata INFO: Guessed host environment type: unknown INFO: Using container image: registry.fedoraproject.org/fedora:rawhide INFO: Pulling image: registry.fedoraproject.org/fedora:rawhide INFO: Tagging container image as mock-bootstrap-039243a1-f15f-40aa-9442-80f5aa6a8644 INFO: Checking that cd9ec0ef4dbf54176d3ace7b26cfc1f5ae37b559391213dfb4f62ce88de8240d image matches host's architecture INFO: Copy content of container cd9ec0ef4dbf54176d3ace7b26cfc1f5ae37b559391213dfb4f62ce88de8240d to /var/lib/mock/fedora-rawhide-aarch64-bootstrap-1794038830.969969/root INFO: mounting cd9ec0ef4dbf54176d3ace7b26cfc1f5ae37b559391213dfb4f62ce88de8240d with podman image mount INFO: image cd9ec0ef4dbf54176d3ace7b26cfc1f5ae37b559391213dfb4f62ce88de8240d as /var/lib/containers/storage/overlay/aa8b876decdfa9d356746d545ee695754093877e13ad0c1653a6647fc4baa12a/merged INFO: umounting image cd9ec0ef4dbf54176d3ace7b26cfc1f5ae37b559391213dfb4f62ce88de8240d (/var/lib/containers/storage/overlay/aa8b876decdfa9d356746d545ee695754093877e13ad0c1653a6647fc4baa12a/merged) with podman image umount INFO: Removing image mock-bootstrap-039243a1-f15f-40aa-9442-80f5aa6a8644 INFO: Package manager dnf5 detected and used (fallback) INFO: Not updating bootstrap chroot, bootstrap_image_ready=True Start(bootstrap): creating root cache Finish(bootstrap): creating root cache Finish(bootstrap): chroot init Start: chroot init INFO: mounting tmpfs at /var/lib/mock/fedora-rawhide-aarch64-1794038830.969969/root. INFO: calling preinit hooks INFO: enabled root cache INFO: enabled package manager cache Start: cleaning package manager metadata Finish: cleaning package manager metadata INFO: enabled HW Info plugin INFO: Package manager dnf5 detected and used (direct choice) INFO: Buildroot is handled by package management downloaded with a bootstrap image: rpm-6.1.0-1.fc46.aarch64 rpm-sequoia-1.10.3-1.fc46.aarch64 dnf5-5.4.6.0-1.fc46.aarch64 dnf5-plugins-5.4.6.0-1.fc46.aarch64 Start: installing minimal buildroot with dnf5 Updating and loading repositories: Copr repository 100% | 1.4 MiB/s | 858.6 KiB | 00m01s fedora 100% | 1.2 MiB/s | 21.0 MiB | 00m17s Repositories loaded. Package Arch Version Repository Size Installing group/module packages: bash aarch64 0:5.3.20-2.fc46 fedora 8.4 MiB bzip2 aarch64 0:1.0.8-24.fc45 fedora 171.2 KiB coreutils aarch64 0:9.12-1.fc46 fedora 8.6 MiB cpio aarch64 0:2.15-10.fc45 fedora 1.1 MiB diffutils aarch64 0:3.12-6.fc45 fedora 1.6 MiB fedora-release-common noarch 0:46-0.1 fedora 4.6 KiB findutils aarch64 1:4.11.0-2.fc45 fedora 2.0 MiB gawk aarch64 0:5.4.1-1.fc45 fedora 2.9 MiB glibc-minimal-langpack aarch64 0:2.44.9000-6.fc46 fedora 0.0 B grep aarch64 0:3.12-4.fc45 fedora 1.0 MiB gzip aarch64 0:1.15-1.fc46 fedora 469.0 KiB info aarch64 0:7.3-3.fc45 fedora 424.4 KiB patch aarch64 0:2.8-6.fc46 fedora 262.4 KiB redhat-rpm-config noarch 0:345-7.fc46 fedora 184.3 KiB rpm-build aarch64 0:6.1.0-1.fc46 fedora 616.1 KiB sed aarch64 0:4.10-2.fc45 fedora 878.4 KiB shadow-utils aarch64 2:4.20.0-2.fc46 fedora 4.4 MiB tar aarch64 2:1.35-9.fc45 fedora 3.0 MiB unzip aarch64 0:6.0-71.fc45 fedora 469.9 KiB util-linux aarch64 0:2.42.4-2.fc46 fedora 6.9 MiB which aarch64 0:2.25-2.fc45 fedora 123.6 KiB xz aarch64 1:5.8.4-3.fc46 fedora 1.5 MiB Installing dependencies: R-srpm-macros noarch 0:1.3.7-3.fc45 fedora 3.5 KiB add-determinism aarch64 0:0.7.3-3.fc45 fedora 1.9 MiB alternatives aarch64 0:1.33-6.fc45 fedora 90.1 KiB ansible-srpm-macros noarch 0:1-22.fc45 fedora 35.7 KiB audit-libs aarch64 0:4.2.1-2.fc45 fedora 486.7 KiB binutils aarch64 0:2.47.50-21.fc46 fedora 27.2 MiB build-reproducibility-srpm-macros noarch 0:0.7.3-3.fc45 fedora 1.2 KiB bzip2-libs aarch64 0:1.0.8-24.fc45 fedora 72.5 KiB ca-certificates noarch 0:2026.2.92_v9.0.319-2.fc46 fedora 2.7 MiB cmake-srpm-macros noarch 0:4.3.0-5.fc45 fedora 524.0 B coreutils-common aarch64 0:9.12-1.fc46 fedora 11.5 MiB crypto-policies noarch 0:20260713-2.gitc42da77.fc45 fedora 134.3 KiB curl aarch64 0:8.23.0-3.fc46 fedora 526.1 KiB cyrus-sasl-lib aarch64 0:2.1.28-37.fc45 fedora 2.4 MiB debugedit aarch64 0:5.4-1.fc46 fedora 320.9 KiB dwz aarch64 0:0.17-3.fc45 fedora 322.7 KiB ed aarch64 0:1.22.6-1.fc46 fedora 158.9 KiB efi-srpm-macros noarch 0:6-9.fc45 fedora 40.3 KiB elfutils aarch64 0:0.197-2.fc46 fedora 3.6 MiB elfutils-debuginfod-client aarch64 0:0.197-2.fc46 fedora 144.0 KiB elfutils-libelf aarch64 0:0.197-2.fc46 fedora 1.6 MiB elfutils-libs aarch64 0:0.197-2.fc46 fedora 747.1 KiB erlang-srpm-macros noarch 0:0.4.1-1.fc46 fedora 2.0 KiB fedora-gpg-keys noarch 0:46-0.3 fedora 130.3 KiB fedora-release noarch 0:46-0.1 fedora 0.0 B fedora-release-identity-basic noarch 0:46-0.1 fedora 664.0 B fedora-repos noarch 0:46-0.3 fedora 4.9 KiB fedora-repos-rawhide noarch 0:46-0.3 fedora 2.2 KiB file aarch64 0:5.48-3.fc46 fedora 141.9 KiB file-libs aarch64 0:5.48-3.fc46 fedora 12.4 MiB filesystem aarch64 0:3.18-59.fc45 fedora 112.0 B filesystem-srpm-macros noarch 0:3.18-59.fc45 fedora 38.2 KiB fips-provider aarch64 0:1.5.3-3.fc46 fedora 3.8 MiB fonts-srpm-macros noarch 1:5.0.0-4.fc45 fedora 55.8 KiB forge-srpm-macros noarch 0:0.4.0-5.fc45 fedora 38.9 KiB fpc-srpm-macros noarch 0:1.3-17.fc45 fedora 144.0 B gap-srpm-macros noarch 0:2-3.fc45 fedora 2.1 KiB gdb-minimal aarch64 0:18.1-1.fc46 fedora 13.8 MiB gdbm-libs aarch64 1:1.26-1.fc46 fedora 234.3 KiB ghc-srpm-macros noarch 0:1.10-2.fc45 fedora 792.0 B glibc aarch64 0:2.44.9000-6.fc46 fedora 6.6 MiB glibc-common aarch64 0:2.44.9000-6.fc46 fedora 1.3 MiB glibc-gconv-extra aarch64 0:2.44.9000-6.fc46 fedora 18.6 MiB gmp aarch64 1:6.3.0-6.fc45 fedora 657.9 KiB gnat-srpm-macros noarch 0:7-3.fc45 fedora 1.0 KiB gnome-srpm-macros noarch 0:1.0-2.fc45 fedora 3.5 KiB gnulib-l10n noarch 0:20241231-4.fc45 fedora 655.0 KiB gnupg2 aarch64 0:2.4.9-18.fc45 fedora 6.4 MiB gnupg2-dirmngr aarch64 0:2.4.9-18.fc45 fedora 646.1 KiB gnupg2-gpg-agent aarch64 0:2.4.9-18.fc45 fedora 846.9 KiB gnupg2-gpgconf aarch64 0:2.4.9-18.fc45 fedora 321.8 KiB gnupg2-keyboxd aarch64 0:2.4.9-18.fc45 fedora 233.2 KiB gnupg2-verify aarch64 0:2.4.9-18.fc45 fedora 364.3 KiB gnutls aarch64 0:3.8.13-6.fc46 fedora 3.7 MiB go-srpm-macros noarch 0:3.8.0-3.fc45 fedora 61.9 KiB gpgverify noarch 0:2.2-5.fc45 fedora 8.7 KiB ima-evm-utils-libs aarch64 0:1.6.2-12.fc45 fedora 92.6 KiB jansson aarch64 0:2.14-5.fc45 fedora 93.0 KiB java-srpm-macros noarch 0:1-9.fc45 fedora 870.0 B json-c aarch64 0:0.18-9.fc45 fedora 138.5 KiB kernel-srpm-macros noarch 0:1.0-30.fc45 fedora 1.9 KiB keyutils-libs aarch64 0:1.6.3-8.fc45 fedora 98.2 KiB krb5-libs aarch64 0:1.22.2-11.fc46 fedora 2.5 MiB libacl aarch64 0:2.4.0-2.fc45 fedora 67.9 KiB libarchive aarch64 0:3.8.9-2.fc46 fedora 975.7 KiB libassuan aarch64 0:2.5.7-6.fc45 fedora 215.9 KiB libattr aarch64 0:2.6.0-2.fc45 fedora 68.4 KiB libblkid aarch64 0:2.42.4-2.fc46 fedora 290.3 KiB libbrotli aarch64 0:1.2.1-1.fc46 fedora 909.2 KiB libcap aarch64 0:2.78-2.fc45 fedora 508.4 KiB libcap-ng aarch64 0:0.9.6-1.fc46 fedora 160.9 KiB libcbor aarch64 0:0.14.0-3.fc45 fedora 139.6 KiB libcom_err aarch64 0:1.47.4-2.fc45 fedora 111.1 KiB libcurl aarch64 0:8.23.0-3.fc46 fedora 1.0 MiB libeconf aarch64 0:0.8.6-1.fc46 fedora 81.7 KiB libevent aarch64 0:2.1.13-1.fc46 fedora 1.1 MiB libfdisk aarch64 0:2.42.4-2.fc46 fedora 418.8 KiB libffi aarch64 0:3.8.0-1.fc46 fedora 159.6 KiB libfido2 aarch64 0:1.17.0-7.fc46 fedora 280.7 KiB libfsverity aarch64 0:1.7-4.fc45 fedora 68.4 KiB libgcc aarch64 0:16.2.1-3.fc46 fedora 222.3 KiB libgcrypt aarch64 0:1.12.4-1.fc46 fedora 1.2 MiB libgomp aarch64 0:16.2.1-3.fc46 fedora 592.9 KiB libgpg-error aarch64 0:1.61-2.fc45 fedora 997.9 KiB libidn2 aarch64 0:2.3.8-4.fc45 fedora 560.5 KiB libksba aarch64 0:1.8.1-1.fc46 fedora 407.8 KiB liblastlog2 aarch64 0:2.42.4-2.fc46 fedora 137.8 KiB libmount aarch64 0:2.42.4-2.fc46 fedora 420.4 KiB libnghttp2 aarch64 0:1.69.0-6.fc46 fedora 197.9 KiB libnghttp3 aarch64 0:1.18.0-1.fc45 fedora 206.8 KiB libpfm aarch64 0:4.14.1-2.fc46 fedora 513.2 KiB libpkgconf aarch64 0:2.5.1-2.fc45 fedora 134.0 KiB libpsl aarch64 0:0.23.3-1.fc46 fedora 132.5 KiB libselinux aarch64 0:3.11-5.fc46 fedora 265.2 KiB libselinux-utils aarch64 0:3.11-5.fc46 fedora 1.3 MiB libsemanage aarch64 0:3.11-4.fc46 fedora 360.3 KiB libsepol aarch64 0:3.11-2.fc45 fedora 809.9 KiB libsmartcols aarch64 0:2.42.4-2.fc46 fedora 224.4 KiB libssh aarch64 0:0.12.2-1.fc45 fedora 721.4 KiB libssh-config noarch 0:0.12.2-1.fc45 fedora 277.0 B libstdc++ aarch64 0:16.2.1-3.fc46 fedora 3.0 MiB libtasn1 aarch64 0:4.21.0-2.fc45 fedora 220.7 KiB libtool-ltdl aarch64 0:2.6.2-1.fc46 fedora 93.9 KiB libunistring aarch64 0:1.1-12.fc45 fedora 1.7 MiB libusb1 aarch64 0:1.0.30-2.fc45 fedora 179.7 KiB libuuid aarch64 0:2.42.4-2.fc46 fedora 69.3 KiB libverto aarch64 0:0.3.2-13.fc45 fedora 69.3 KiB libxcrypt aarch64 0:4.5.2-4.fc45 fedora 273.2 KiB libxml2 aarch64 0:2.15.4-1.fc46 fedora 1.7 MiB libzstd aarch64 0:1.5.7-6.fc45 fedora 860.3 KiB linkdupes aarch64 0:0.7.3-3.fc45 fedora 711.0 KiB lua-libs aarch64 0:5.5.1-2.fc46 fedora 330.0 KiB lua-srpm-macros noarch 0:1-18.fc45 fedora 1.3 KiB lz4-libs aarch64 0:1.10.0-5.fc45 fedora 197.3 KiB meson-srpm-macros noarch 0:1.12.1-2.fc46 fedora 1.7 KiB mpfr aarch64 0:4.2.2-4.fc45 fedora 755.4 KiB ncurses-base noarch 0:6.6-3.fc45 fedora 329.7 KiB ncurses-libs aarch64 0:6.6-3.fc45 fedora 1.2 MiB nettle aarch64 0:4.0-5.fc45 fedora 836.7 KiB ngtcp2 aarch64 0:1.22.1-3.fc45 fedora 341.1 KiB ngtcp2-crypto-ossl aarch64 0:1.22.1-3.fc45 fedora 67.5 KiB npth aarch64 0:1.8-5.fc45 fedora 93.4 KiB ocaml-srpm-macros noarch 0:11-4.fc45 fedora 1.9 KiB openblas-srpm-macros noarch 0:2-23.fc46 fedora 124.0 B openldap aarch64 0:2.6.16-1.fc46 fedora 766.1 KiB openssl-libs aarch64 1:4.0.3-1.fc46 fedora 5.8 MiB p11-kit aarch64 0:0.26.5-1.fc45 fedora 2.8 MiB p11-kit-trust aarch64 0:0.26.5-1.fc45 fedora 530.1 KiB package-notes-srpm-macros noarch 0:0.20-2.fc45 fedora 1.6 KiB pam-libs aarch64 0:1.7.2-4.fc45 fedora 222.7 KiB pcre2 aarch64 0:10.49-1.fc46 fedora 714.3 KiB pcre2-syntax noarch 0:10.49-1.fc46 fedora 292.5 KiB perl-srpm-macros noarch 0:1-65.fc45 fedora 861.0 B pkgconf aarch64 0:2.5.1-2.fc45 fedora 116.8 KiB pkgconf-m4 noarch 0:2.5.1-2.fc45 fedora 14.3 KiB pkgconf-pkg-config aarch64 0:2.5.1-2.fc45 fedora 990.0 B policycoreutils aarch64 0:3.11-2.fc45 fedora 1.5 MiB popt aarch64 0:1.19-11.fc45 fedora 144.7 KiB publicsuffix-list-dafsa noarch 0:20260624-2.fc45 fedora 71.3 KiB pyproject-srpm-macros noarch 0:1.24.0-1.fc46 fedora 3.4 KiB python-srpm-macros noarch 0:3.15-2.fc45 fedora 51.6 KiB qt5-srpm-macros noarch 0:5.15.18-3.fc45 fedora 500.0 B qt6-srpm-macros noarch 0:6.12.0-1.fc46 fedora 472.0 B readline aarch64 0:8.3-7.fc46 fedora 563.6 KiB redhat-systemd-presets noarch 0:102-3.fc45 fedora 1.0 KiB redhat-systemd-presets-common noarch 0:102-3.fc45 fedora 16.9 KiB rpm aarch64 0:6.1.0-1.fc46 fedora 3.3 MiB rpm-build-libs aarch64 0:6.1.0-1.fc46 fedora 264.0 KiB rpm-libs aarch64 0:6.1.0-1.fc46 fedora 1.1 MiB rpm-plugin-selinux aarch64 0:6.1.0-1.fc46 fedora 67.9 KiB rpm-sequoia aarch64 0:1.10.3-1.fc46 fedora 2.3 MiB rpm-sign-libs aarch64 0:6.1.0-1.fc46 fedora 67.7 KiB rust-srpm-macros noarch 0:28.5-2.fc45 fedora 5.5 KiB selinux-policy noarch 0:45.23-1.fc46 fedora 32.1 KiB selinux-policy-targeted noarch 0:45.23-1.fc46 fedora 18.9 MiB setup noarch 0:2.15.1-2.fc45 fedora 725.6 KiB sqlite-libs aarch64 0:3.54.1-1.fc46 fedora 1.6 MiB systemd-libs aarch64 0:262.2-1.fc46 fedora 2.8 MiB systemd-standalone-sysusers aarch64 0:262.2-1.fc46 fedora 979.4 KiB tpm2-tss aarch64 0:4.2.1-1.fc46 fedora 2.2 MiB tree-sitter-srpm-macros noarch 0:0.4.6-2.fc45 fedora 8.6 KiB util-linux-core aarch64 0:2.42.4-2.fc46 fedora 2.5 MiB xxhash-libs aarch64 0:0.8.4-2.fc46 fedora 85.8 KiB xz-libs aarch64 1:5.8.4-3.fc46 fedora 265.5 KiB zig-srpm-macros noarch 0:1-9.fc45 fedora 1.3 KiB zip aarch64 0:3.0-46.fc45 fedora 762.2 KiB zlib-ng-compat aarch64 0:2.3.3-6.fc45 fedora 133.4 KiB zstd aarch64 0:1.5.7-6.fc45 fedora 562.3 KiB Installing groups: Buildsystem building group Transaction Summary: Installing: 190 packages Total size of inbound packages is 69 MiB. Need to download 69 MiB. After this operation, 254 MiB extra will be used (install 254 MiB, remove 0 B). [ 1/190] bzip2-0:1.0.8-24.fc45.aarch64 100% | 265.1 KiB/s | 52.2 KiB | 00m00s [ 2/190] cpio-0:2.15-10.fc45.aarch64 100% | 883.1 KiB/s | 289.7 KiB | 00m00s [ 3/190] diffutils-0:3.12-6.fc45.aarch 100% | 995.7 KiB/s | 392.3 KiB | 00m00s [ 4/190] fedora-release-common-0:46-0. 100% | 271.8 KiB/s | 18.2 KiB | 00m00s [ 5/190] coreutils-0:9.12-1.fc46.aarch 100% | 1.0 MiB/s | 1.2 MiB | 00m01s [ 6/190] findutils-1:4.11.0-2.fc45.aar 100% | 965.9 KiB/s | 569.9 KiB | 00m01s [ 7/190] glibc-minimal-langpack-0:2.44 100% | 736.7 KiB/s | 145.1 KiB | 00m00s [ 8/190] bash-0:5.3.20-2.fc46.aarch64 100% | 993.9 KiB/s | 1.8 MiB | 00m02s [ 9/190] gzip-0:1.15-1.fc46.aarch64 100% | 952.3 KiB/s | 186.6 KiB | 00m00s [ 10/190] grep-0:3.12-4.fc45.aarch64 100% | 902.5 KiB/s | 296.0 KiB | 00m00s [ 11/190] patch-0:2.8-6.fc46.aarch64 100% | 839.5 KiB/s | 110.8 KiB | 00m00s [ 12/190] gawk-0:5.4.1-1.fc45.aarch64 100% | 1.1 MiB/s | 1.1 MiB | 00m01s [ 13/190] info-0:7.3-3.fc45.aarch64 100% | 933.7 KiB/s | 183.9 KiB | 00m00s [ 14/190] redhat-rpm-config-0:345-7.fc4 100% | 598.3 KiB/s | 78.4 KiB | 00m00s [ 15/190] rpm-build-0:6.1.0-1.fc46.aarc 100% | 756.8 KiB/s | 152.9 KiB | 00m00s [ 16/190] sed-0:4.10-2.fc45.aarch64 100% | 975.9 KiB/s | 319.1 KiB | 00m00s [ 17/190] unzip-0:6.0-71.fc45.aarch64 100% | 1.0 MiB/s | 199.1 KiB | 00m00s [ 18/190] tar-2:1.35-9.fc45.aarch64 100% | 1.2 MiB/s | 854.2 KiB | 00m01s [ 19/190] which-0:2.25-2.fc45.aarch64 100% | 612.6 KiB/s | 41.7 KiB | 00m00s [ 20/190] xz-1:5.8.4-3.fc46.aarch64 100% | 1.2 MiB/s | 653.8 KiB | 00m01s [ 21/190] shadow-utils-2:4.20.0-2.fc46. 100% | 1.0 MiB/s | 1.4 MiB | 00m01s [ 22/190] util-linux-0:2.42.4-2.fc46.aa 100% | 1.0 MiB/s | 1.2 MiB | 00m01s [ 23/190] ncurses-libs-0:6.6-3.fc45.aar 100% | 989.7 KiB/s | 324.6 KiB | 00m00s [ 24/190] bzip2-libs-0:1.0.8-24.fc45.aa 100% | 624.4 KiB/s | 41.2 KiB | 00m00s [ 25/190] filesystem-0:3.18-59.fc45.aar 100% | 1.2 MiB/s | 1.8 MiB | 00m01s [ 26/190] gmp-1:6.3.0-6.fc45.aarch64 100% | 1.0 MiB/s | 270.7 KiB | 00m00s [ 27/190] glibc-0:2.44.9000-6.fc46.aarc 100% | 1.2 MiB/s | 2.1 MiB | 00m02s [ 28/190] libacl-0:2.4.0-2.fc45.aarch64 100% | 392.7 KiB/s | 26.7 KiB | 00m00s [ 29/190] libattr-0:2.6.0-2.fc45.aarch6 100% | 270.0 KiB/s | 17.8 KiB | 00m00s [ 30/190] libcap-0:2.78-2.fc45.aarch64 100% | 654.7 KiB/s | 88.4 KiB | 00m00s [ 31/190] libselinux-0:3.11-5.fc46.aarc 100% | 763.7 KiB/s | 100.0 KiB | 00m00s [ 32/190] coreutils-common-0:9.12-1.fc4 100% | 1.1 MiB/s | 2.2 MiB | 00m02s [ 33/190] systemd-libs-0:262.2-1.fc46.a 100% | 1.1 MiB/s | 881.8 KiB | 00m01s [ 34/190] fedora-repos-0:46-0.3.noarch 100% | 147.1 KiB/s | 9.6 KiB | 00m00s [ 35/190] redhat-systemd-presets-0:102- 100% | 129.4 KiB/s | 8.5 KiB | 00m00s [ 36/190] readline-0:8.3-7.fc46.aarch64 100% | 1.1 MiB/s | 220.9 KiB | 00m00s [ 37/190] mpfr-0:4.2.2-4.fc45.aarch64 100% | 976.7 KiB/s | 319.4 KiB | 00m00s [ 38/190] pcre2-0:10.49-1.fc46.aarch64 100% | 1.3 MiB/s | 252.6 KiB | 00m00s [ 39/190] glibc-common-0:2.44.9000-6.fc 100% | 1.0 MiB/s | 423.2 KiB | 00m00s [ 40/190] ed-0:1.22.6-1.fc46.aarch64 100% | 641.3 KiB/s | 84.0 KiB | 00m00s [ 41/190] R-srpm-macros-0:1.3.7-3.fc45. 100% | 168.9 KiB/s | 11.1 KiB | 00m00s [ 42/190] ansible-srpm-macros-0:1-22.fc 100% | 305.3 KiB/s | 19.8 KiB | 00m00s [ 43/190] build-reproducibility-srpm-ma 100% | 164.1 KiB/s | 10.8 KiB | 00m00s [ 44/190] cmake-srpm-macros-0:4.3.0-5.f 100% | 156.6 KiB/s | 10.3 KiB | 00m00s [ 45/190] efi-srpm-macros-0:6-9.fc45.no 100% | 324.9 KiB/s | 21.4 KiB | 00m00s [ 46/190] dwz-0:0.17-3.fc45.aarch64 100% | 1.0 MiB/s | 132.9 KiB | 00m00s [ 47/190] erlang-srpm-macros-0:0.4.1-1. 100% | 151.0 KiB/s | 10.0 KiB | 00m00s [ 48/190] file-0:5.48-3.fc46.aarch64 100% | 768.8 KiB/s | 50.7 KiB | 00m00s [ 49/190] openssl-libs-1:4.0.3-1.fc46.a 100% | 1.2 MiB/s | 2.1 MiB | 00m02s [ 50/190] filesystem-srpm-macros-0:3.18 100% | 400.1 KiB/s | 26.4 KiB | 00m00s [ 51/190] fonts-srpm-macros-1:5.0.0-4.f 100% | 411.4 KiB/s | 27.2 KiB | 00m00s [ 52/190] forge-srpm-macros-0:0.4.0-5.f 100% | 290.1 KiB/s | 19.7 KiB | 00m00s [ 53/190] fpc-srpm-macros-0:1.3-17.fc45 100% | 117.6 KiB/s | 7.8 KiB | 00m00s [ 54/190] gap-srpm-macros-0:2-3.fc45.no 100% | 141.0 KiB/s | 9.3 KiB | 00m00s [ 55/190] ghc-srpm-macros-0:1.10-2.fc45 100% | 124.9 KiB/s | 8.5 KiB | 00m00s [ 56/190] gnat-srpm-macros-0:7-3.fc45.n 100% | 129.8 KiB/s | 8.6 KiB | 00m00s [ 57/190] gnome-srpm-macros-0:1.0-2.fc4 100% | 133.8 KiB/s | 8.8 KiB | 00m00s [ 58/190] go-srpm-macros-0:3.8.0-3.fc45 100% | 408.9 KiB/s | 27.8 KiB | 00m00s [ 59/190] java-srpm-macros-0:1-9.fc45.n 100% | 127.4 KiB/s | 8.3 KiB | 00m00s [ 60/190] kernel-srpm-macros-0:1.0-30.f 100% | 125.6 KiB/s | 8.3 KiB | 00m00s [ 61/190] lua-srpm-macros-0:1-18.fc45.n 100% | 127.7 KiB/s | 8.7 KiB | 00m00s [ 62/190] meson-srpm-macros-0:1.12.1-2. 100% | 178.9 KiB/s | 11.8 KiB | 00m00s [ 63/190] ocaml-srpm-macros-0:11-4.fc45 100% | 135.6 KiB/s | 9.0 KiB | 00m00s [ 64/190] openblas-srpm-macros-0:2-23.f 100% | 111.0 KiB/s | 7.5 KiB | 00m00s [ 65/190] package-notes-srpm-macros-0:0 100% | 159.1 KiB/s | 10.5 KiB | 00m00s [ 66/190] perl-srpm-macros-0:1-65.fc45. 100% | 126.6 KiB/s | 8.4 KiB | 00m00s [ 67/190] pyproject-srpm-macros-0:1.24. 100% | 225.9 KiB/s | 15.4 KiB | 00m00s [ 68/190] python-srpm-macros-0:3.15-2.f 100% | 361.4 KiB/s | 23.9 KiB | 00m00s [ 69/190] qt5-srpm-macros-0:5.15.18-3.f 100% | 122.2 KiB/s | 8.1 KiB | 00m00s [ 70/190] qt6-srpm-macros-0:6.12.0-1.fc 100% | 133.6 KiB/s | 9.1 KiB | 00m00s [ 71/190] rust-srpm-macros-0:28.5-2.fc4 100% | 172.3 KiB/s | 11.4 KiB | 00m00s [ 72/190] tree-sitter-srpm-macros-0:0.4 100% | 205.9 KiB/s | 14.0 KiB | 00m00s [ 73/190] zig-srpm-macros-0:1-9.fc45.no 100% | 133.5 KiB/s | 8.8 KiB | 00m00s [ 74/190] zip-0:3.0-46.fc45.aarch64 100% | 984.9 KiB/s | 265.9 KiB | 00m00s [ 75/190] rpm-0:6.1.0-1.fc46.aarch64 100% | 1.1 MiB/s | 573.1 KiB | 00m01s [ 76/190] debugedit-0:5.4-1.fc46.aarch6 100% | 640.9 KiB/s | 86.5 KiB | 00m00s [ 77/190] elfutils-libelf-0:0.197-2.fc4 100% | 990.1 KiB/s | 267.3 KiB | 00m00s [ 78/190] elfutils-0:0.197-2.fc46.aarch 100% | 1.1 MiB/s | 610.1 KiB | 00m01s [ 79/190] libarchive-0:3.8.9-2.fc46.aar 100% | 1.2 MiB/s | 418.3 KiB | 00m00s [ 80/190] libgcc-0:16.2.1-3.fc46.aarch6 100% | 919.1 KiB/s | 121.3 KiB | 00m00s [ 81/190] pkgconf-pkg-config-0:2.5.1-2. 100% | 143.8 KiB/s | 9.5 KiB | 00m00s [ 82/190] popt-0:1.19-11.fc45.aarch64 100% | 986.5 KiB/s | 65.1 KiB | 00m00s [ 83/190] rpm-build-libs-0:6.1.0-1.fc46 100% | 920.9 KiB/s | 120.6 KiB | 00m00s [ 84/190] rpm-libs-0:6.1.0-1.fc46.aarch 100% | 1.1 MiB/s | 429.5 KiB | 00m00s [ 85/190] libstdc++-0:16.2.1-3.fc46.aar 100% | 1.2 MiB/s | 923.5 KiB | 00m01s [ 86/190] zstd-0:1.5.7-6.fc45.aarch64 100% | 929.1 KiB/s | 183.0 KiB | 00m00s [ 87/190] audit-libs-0:4.2.1-2.fc45.aar 100% | 699.6 KiB/s | 142.0 KiB | 00m00s [ 88/190] libeconf-0:0.8.6-1.fc46.aarch 100% | 538.7 KiB/s | 35.6 KiB | 00m00s [ 89/190] libsemanage-0:3.11-4.fc46.aar 100% | 906.5 KiB/s | 122.4 KiB | 00m00s [ 90/190] libxcrypt-0:4.5.2-4.fc45.aarc 100% | 955.7 KiB/s | 125.2 KiB | 00m00s [ 91/190] pam-libs-0:1.7.2-4.fc45.aarch 100% | 835.2 KiB/s | 56.8 KiB | 00m00s [ 92/190] libblkid-0:2.42.4-2.fc46.aarc 100% | 930.4 KiB/s | 126.5 KiB | 00m00s [ 93/190] setup-0:2.15.1-2.fc45.noarch 100% | 804.2 KiB/s | 157.6 KiB | 00m00s [ 94/190] libcap-ng-0:0.9.6-1.fc46.aarc 100% | 516.6 KiB/s | 35.1 KiB | 00m00s [ 95/190] libfdisk-0:2.42.4-2.fc46.aarc 100% | 1.2 MiB/s | 156.2 KiB | 00m00s [ 96/190] liblastlog2-0:2.42.4-2.fc46.a 100% | 366.0 KiB/s | 24.9 KiB | 00m00s [ 97/190] libsmartcols-0:2.42.4-2.fc46. 100% | 629.6 KiB/s | 85.0 KiB | 00m00s [ 98/190] libmount-0:2.42.4-2.fc46.aarc 100% | 851.6 KiB/s | 166.9 KiB | 00m00s [ 99/190] libuuid-0:2.42.4-2.fc46.aarch 100% | 397.7 KiB/s | 27.0 KiB | 00m00s [100/190] zlib-ng-compat-0:2.3.3-6.fc45 100% | 534.3 KiB/s | 72.1 KiB | 00m00s [101/190] xz-libs-1:5.8.4-3.fc46.aarch6 100% | 824.9 KiB/s | 111.4 KiB | 00m00s [102/190] util-linux-core-0:2.42.4-2.fc 100% | 1.1 MiB/s | 568.7 KiB | 00m01s [103/190] ncurses-base-0:6.6-3.fc45.noa 100% | 667.6 KiB/s | 88.1 KiB | 00m00s [104/190] gnulib-l10n-0:20241231-4.fc45 100% | 767.5 KiB/s | 150.4 KiB | 00m00s [105/190] libsepol-0:3.11-2.fc45.aarch6 100% | 997.1 KiB/s | 326.0 KiB | 00m00s [106/190] binutils-0:2.47.50-21.fc46.aa 100% | 1.3 MiB/s | 5.4 MiB | 00m04s [107/190] crypto-policies-0:20260713-2. 100% | 738.8 KiB/s | 97.5 KiB | 00m00s [108/190] glibc-gconv-extra-0:2.44.9000 100% | 1.2 MiB/s | 1.8 MiB | 00m02s [109/190] fedora-gpg-keys-0:46-0.3.noar 100% | 1.0 MiB/s | 143.8 KiB | 00m00s [110/190] ca-certificates-0:2026.2.92_v 100% | 1.1 MiB/s | 971.9 KiB | 00m01s [111/190] fedora-repos-rawhide-0:46-0.3 100% | 132.7 KiB/s | 9.0 KiB | 00m00s [112/190] redhat-systemd-presets-common 100% | 203.5 KiB/s | 13.2 KiB | 00m00s [113/190] pcre2-syntax-0:10.49-1.fc46.n 100% | 832.6 KiB/s | 168.2 KiB | 00m00s [114/190] linkdupes-0:0.7.3-3.fc45.aarc 100% | 1.2 MiB/s | 322.6 KiB | 00m00s [115/190] add-determinism-0:0.7.3-3.fc4 100% | 1.2 MiB/s | 788.1 KiB | 00m01s [116/190] fips-provider-0:1.5.3-3.fc46. 100% | 1.3 MiB/s | 1.5 MiB | 00m01s [117/190] alternatives-0:1.33-6.fc45.aa 100% | 587.1 KiB/s | 38.7 KiB | 00m00s [118/190] elfutils-debuginfod-client-0: 100% | 699.3 KiB/s | 46.2 KiB | 00m00s [119/190] curl-0:8.23.0-3.fc46.aarch64 100% | 915.3 KiB/s | 239.8 KiB | 00m00s [120/190] jansson-0:2.14-5.fc45.aarch64 100% | 703.4 KiB/s | 46.4 KiB | 00m00s [121/190] elfutils-libs-0:0.197-2.fc46. 100% | 1.3 MiB/s | 271.1 KiB | 00m00s [122/190] libzstd-0:1.5.7-6.fc45.aarch6 100% | 1.2 MiB/s | 329.8 KiB | 00m00s [123/190] json-c-0:0.18-9.fc45.aarch64 100% | 683.3 KiB/s | 45.1 KiB | 00m00s [124/190] file-libs-0:5.48-3.fc46.aarch 100% | 1.1 MiB/s | 878.1 KiB | 00m01s [125/190] libpfm-0:4.14.1-2.fc46.aarch6 100% | 632.7 KiB/s | 82.9 KiB | 00m00s [126/190] lz4-libs-0:1.10.0-5.fc45.aarc 100% | 590.0 KiB/s | 80.2 KiB | 00m00s [127/190] pkgconf-0:2.5.1-2.fc45.aarch6 100% | 733.7 KiB/s | 48.4 KiB | 00m00s [128/190] pkgconf-m4-0:2.5.1-2.fc45.noa 100% | 203.1 KiB/s | 13.8 KiB | 00m00s [129/190] lua-libs-0:5.5.1-2.fc46.aarch 100% | 1.0 MiB/s | 137.7 KiB | 00m00s [130/190] rpm-sign-libs-0:6.1.0-1.fc46. 100% | 383.9 KiB/s | 26.1 KiB | 00m00s [131/190] libxml2-0:2.15.4-1.fc46.aarch 100% | 1.2 MiB/s | 637.2 KiB | 00m01s [132/190] libgomp-0:16.2.1-3.fc46.aarch 100% | 979.8 KiB/s | 384.1 KiB | 00m00s [133/190] libffi-0:3.8.0-1.fc46.aarch64 100% | 637.7 KiB/s | 42.1 KiB | 00m00s [134/190] p11-kit-0:0.26.5-1.fc45.aarch 100% | 1.1 MiB/s | 534.6 KiB | 00m00s [135/190] rpm-sequoia-0:1.10.3-1.fc46.a 100% | 1.3 MiB/s | 885.3 KiB | 00m01s [136/190] sqlite-libs-0:3.54.1-1.fc46.a 100% | 1.3 MiB/s | 774.9 KiB | 00m01s [137/190] libpkgconf-0:2.5.1-2.fc45.aar 100% | 589.8 KiB/s | 40.7 KiB | 00m00s [138/190] p11-kit-trust-0:0.26.5-1.fc45 100% | 1.0 MiB/s | 139.5 KiB | 00m00s [139/190] ima-evm-utils-libs-0:1.6.2-12 100% | 435.9 KiB/s | 29.6 KiB | 00m00s [140/190] libfsverity-0:1.7-4.fc45.aarc 100% | 285.3 KiB/s | 18.5 KiB | 00m00s [141/190] gpgverify-0:2.2-5.fc45.noarch 100% | 171.4 KiB/s | 11.3 KiB | 00m00s [142/190] libtasn1-0:4.21.0-2.fc45.aarc 100% | 543.4 KiB/s | 73.4 KiB | 00m00s [143/190] gnupg2-dirmngr-0:2.4.9-18.fc4 100% | 1.0 MiB/s | 263.1 KiB | 00m00s [144/190] gnupg2-gpg-agent-0:2.4.9-18.f 100% | 985.1 KiB/s | 266.0 KiB | 00m00s [145/190] gnupg2-gpgconf-0:2.4.9-18.fc4 100% | 861.4 KiB/s | 113.7 KiB | 00m00s [146/190] gnupg2-keyboxd-0:2.4.9-18.fc4 100% | 671.7 KiB/s | 90.7 KiB | 00m00s [147/190] libassuan-0:2.5.7-6.fc45.aarc 100% | 981.0 KiB/s | 66.7 KiB | 00m00s [148/190] gnupg2-verify-0:2.4.9-18.fc45 100% | 831.9 KiB/s | 163.1 KiB | 00m00s [149/190] libgpg-error-0:1.61-2.fc45.aa 100% | 947.4 KiB/s | 248.2 KiB | 00m00s [150/190] npth-0:1.8-5.fc45.aarch64 100% | 381.5 KiB/s | 24.8 KiB | 00m00s [151/190] libgcrypt-0:1.12.4-1.fc46.aar 100% | 1.1 MiB/s | 539.5 KiB | 00m00s [152/190] gnupg2-0:2.4.9-18.fc45.aarch6 100% | 1.3 MiB/s | 1.6 MiB | 00m01s [153/190] libksba-0:1.8.1-1.fc46.aarch6 100% | 1.2 MiB/s | 162.3 KiB | 00m00s [154/190] tpm2-tss-0:4.2.1-1.fc46.aarch 100% | 1.2 MiB/s | 414.9 KiB | 00m00s [155/190] openldap-0:2.6.16-1.fc46.aarc 100% | 1.3 MiB/s | 253.0 KiB | 00m00s [156/190] libusb1-0:1.0.30-2.fc45.aarch 100% | 604.2 KiB/s | 79.2 KiB | 00m00s [157/190] libidn2-0:2.3.8-4.fc45.aarch6 100% | 1.3 MiB/s | 174.3 KiB | 00m00s [158/190] libunistring-0:1.1-12.fc45.aa 100% | 1.1 MiB/s | 538.4 KiB | 00m00s [159/190] nettle-0:4.0-5.fc45.aarch64 100% | 1.1 MiB/s | 428.3 KiB | 00m00s [160/190] gnutls-0:3.8.13-6.fc46.aarch6 100% | 1.2 MiB/s | 1.3 MiB | 00m01s [161/190] libtool-ltdl-0:2.6.2-1.fc46.a 100% | 523.4 KiB/s | 35.6 KiB | 00m00s [162/190] libevent-0:2.1.13-1.fc46.aarc 100% | 1.0 MiB/s | 272.8 KiB | 00m00s [163/190] gdbm-libs-1:1.26-1.fc46.aarch 100% | 848.6 KiB/s | 57.7 KiB | 00m00s [164/190] fedora-release-0:46-0.1.noarc 100% | 180.2 KiB/s | 11.9 KiB | 00m00s [165/190] cyrus-sasl-lib-0:2.1.28-37.fc 100% | 1.3 MiB/s | 766.6 KiB | 00m01s [166/190] xxhash-libs-0:0.8.4-2.fc46.aa 100% | 515.6 KiB/s | 34.0 KiB | 00m00s [167/190] systemd-standalone-sysusers-0 100% | 1.1 MiB/s | 397.7 KiB | 00m00s [168/190] fedora-release-identity-basic 100% | 191.8 KiB/s | 12.7 KiB | 00m00s [169/190] libcurl-0:8.23.0-3.fc46.aarch 100% | 1.1 MiB/s | 464.5 KiB | 00m00s [170/190] krb5-libs-0:1.22.2-11.fc46.aa 100% | 1.3 MiB/s | 761.1 KiB | 00m01s [171/190] libbrotli-0:1.2.1-1.fc46.aarc 100% | 1.0 MiB/s | 349.0 KiB | 00m00s [172/190] libnghttp2-0:1.69.0-6.fc46.aa 100% | 570.6 KiB/s | 74.7 KiB | 00m00s [173/190] libpsl-0:0.23.3-1.fc46.aarch6 100% | 1.0 MiB/s | 67.4 KiB | 00m00s [174/190] libnghttp3-0:1.18.0-1.fc45.aa 100% | 1.0 MiB/s | 70.1 KiB | 00m00s [175/190] ngtcp2-0:1.22.1-3.fc45.aarch6 100% | 1.1 MiB/s | 147.5 KiB | 00m00s [176/190] ngtcp2-crypto-ossl-0:1.22.1-3 100% | 384.7 KiB/s | 26.2 KiB | 00m00s [177/190] libssh-0:0.12.2-1.fc45.aarch6 100% | 1.0 MiB/s | 277.2 KiB | 00m00s [178/190] keyutils-libs-0:1.6.3-8.fc45. 100% | 463.8 KiB/s | 31.5 KiB | 00m00s [179/190] libcom_err-0:1.47.4-2.fc45.aa 100% | 401.6 KiB/s | 26.5 KiB | 00m00s [180/190] libverto-0:0.3.2-13.fc45.aarc 100% | 300.5 KiB/s | 20.4 KiB | 00m00s [181/190] publicsuffix-list-dafsa-0:202 100% | 925.2 KiB/s | 61.1 KiB | 00m00s [182/190] libssh-config-0:0.12.2-1.fc45 100% | 135.4 KiB/s | 8.9 KiB | 00m00s [183/190] libfido2-0:1.17.0-7.fc46.aarc 100% | 735.3 KiB/s | 99.3 KiB | 00m00s [184/190] libcbor-0:0.14.0-3.fc45.aarch 100% | 532.2 KiB/s | 35.1 KiB | 00m00s [185/190] policycoreutils-0:3.11-2.fc45 100% | 1.0 MiB/s | 262.3 KiB | 00m00s [186/190] selinux-policy-0:45.23-1.fc46 100% | 659.7 KiB/s | 43.5 KiB | 00m00s [187/190] libselinux-utils-0:3.11-5.fc4 100% | 969.3 KiB/s | 127.0 KiB | 00m00s [188/190] rpm-plugin-selinux-0:6.1.0-1. 100% | 276.2 KiB/s | 18.0 KiB | 00m00s [189/190] gdb-minimal-0:18.1-1.fc46.aar 100% | 1.3 MiB/s | 4.4 MiB | 00m03s [190/190] selinux-policy-targeted-0:45. 100% | 1.2 MiB/s | 6.8 MiB | 00m06s -------------------------------------------------------------------------------- [190/190] Total 100% | 2.7 MiB/s | 68.8 MiB | 00m25s Running transaction Importing OpenPGP key 0x91211FCE: UserID : "Fedora (46) " Fingerprint: D924B10D3E810DABDD8B56B596E7E91491211FCE From : file:///usr/share/distribution-gpg-keys/fedora/RPM-GPG-KEY-fedora-46-primary The key was successfully imported. Importing OpenPGP key 0x91211FCE: UserID : "Fedora (46) " Fingerprint: D924B10D3E810DABDD8B56B596E7E91491211FCE From : file:///usr/share/distribution-gpg-keys/fedora/RPM-GPG-KEY-fedora-46-primary The key was successfully imported. Importing OpenPGP key 0xF577861E: UserID : "Fedora (45) " Fingerprint: 4F50A6114CD5C6976A7F1179655A4B02F577861E From : file:///usr/share/distribution-gpg-keys/fedora/RPM-GPG-KEY-fedora-45-primary The key was successfully imported. Importing OpenPGP key 0x9488FB64: UserID : "Fedora (47) " Fingerprint: B2E766FA50CA6FA2D5ED06FC09D879E09488FB64 From : file:///usr/share/distribution-gpg-keys/fedora/RPM-GPG-KEY-fedora-47-primary The key was successfully imported. [ 1/192] Verify package files 100% | 733.0 B/s | 190.0 B | 00m00s >>> Running %pretrans scriptlet: filesystem-0:3.18-59.fc45.aarch64 >>> Finished %pretrans scriptlet: filesystem-0:3.18-59.fc45.aarch64 >>> [RPM] failed to open /var/lib/mock/fedora-rawhide-aarch64-1794038830.969969/root/etc/group for id/name lookup: No such file or directory [ 2/192] Prepare transaction 100% | 2.3 KiB/s | 190.0 B | 00m00s [ 3/192] Installing libgcc-0:16.2.1-3. 100% | 109.4 MiB/s | 224.0 KiB | 00m00s [ 4/192] Installing redhat-systemd-pre 100% | 0.0 B/s | 1.5 KiB | 00m00s [ 5/192] Installing redhat-systemd-pre 100% | 17.7 MiB/s | 18.1 KiB | 00m00s [ 6/192] Installing libssh-config-0:0. 100% | 0.0 B/s | 816.0 B | 00m00s [ 7/192] Installing publicsuffix-list- 100% | 70.3 MiB/s | 72.0 KiB | 00m00s [ 8/192] Installing fedora-release-ide 100% | 898.4 KiB/s | 920.0 B | 00m00s [ 9/192] Installing fedora-gpg-keys-0: 100% | 29.6 MiB/s | 181.7 KiB | 00m00s [ 10/192] Installing fedora-repos-rawhi 100% | 0.0 B/s | 2.5 KiB | 00m00s [ 11/192] Installing fedora-repos-0:46- 100% | 0.0 B/s | 5.9 KiB | 00m00s [ 12/192] Installing fedora-release-com 100% | 7.8 MiB/s | 8.0 KiB | 00m00s [ 13/192] Installing fedora-release-0:4 100% | 20.2 KiB/s | 124.0 B | 00m00s >>> Running sysusers scriptlet: setup-0:2.15.1-2.fc45.noarch >>> Finished sysusers scriptlet: setup-0:2.15.1-2.fc45.noarch >>> Scriptlet output: >>> Creating group 'adm' with GID 4. >>> Creating group 'audio' with GID 63. >>> Creating group 'cdrom' with GID 11. >>> Creating group 'clock' with GID 103. >>> Creating group 'dialout' with GID 18. >>> Creating group 'disk' with GID 6. >>> Creating group 'floppy' with GID 19. >>> Creating group 'ftp' with GID 50. >>> Creating group 'games' with GID 20. >>> Creating group 'input' with GID 104. >>> Creating group 'kmem' with GID 9. >>> Creating group 'kvm' with GID 36. >>> Creating group 'lock' with GID 54. >>> Creating group 'lp' with GID 7. >>> Creating group 'mail' with GID 12. >>> Creating group 'man' with GID 15. >>> Creating group 'mem' with GID 8. >>> Creating group 'nobody' with GID 65534. >>> Creating group 'render' with GID 105. >>> Creating group 'root' with GID 0. >>> Creating group 'sgx' with GID 106. >>> Creating group 'sys' with GID 3. >>> Creating group 'tape' with GID 33. >>> Creating group 'tty' with GID 5. >>> Creating group 'users' with GID 100. >>> Creating group 'utmp' with GID 22. >>> Creating group 'video' with GID 39. >>> Creating group 'wheel' with GID 10. >>> Creating user 'adm' (adm) with UID 3 and GID 4. >>> Creating group 'bin' with GID 1. >>> Creating user 'bin' (bin) with UID 1 and GID 1. >>> Creating group 'daemon' with GID 2. >>> Creating user 'daemon' (daemon) with UID 2 and GID 2. >>> Creating user 'ftp' (FTP User) with UID 14 and GID 50. >>> Creating user 'games' (games) with UID 12 and GID 100. >>> Creating user 'halt' (halt) with UID 7 and GID 0. >>> Creating user 'lp' (lp) with UID 4 and GID 7. >>> Creating user 'mail' (mail) with UID 8 and GID 12. >>> Creating user 'nobody' (Kernel Overflow User) with UID 65534 and GID 65534. >>> Creating user 'operator' (operator) with UID 11 and GID 0. >>> Creating user 'root' (Super User) with UID 0 and GID 0. >>> Creating user 'shutdown' (shutdown) with UID 6 and GID 0. >>> Creating user 'sync' (sync) with UID 5 and GID 0. >>> [ 14/192] Installing setup-0:2.15.1-2.f 100% | 29.8 MiB/s | 731.3 KiB | 00m00s >>> [RPM] /etc/hosts created as /etc/hosts.rpmnew [ 15/192] Installing filesystem-0:3.18- 100% | 1.6 MiB/s | 253.6 KiB | 00m00s [ 16/192] Installing pkgconf-m4-0:2.5.1 100% | 14.4 MiB/s | 14.7 KiB | 00m00s [ 17/192] Installing pcre2-syntax-0:10. 100% | 144.0 MiB/s | 295.0 KiB | 00m00s [ 18/192] Installing gnulib-l10n-0:2024 100% | 129.3 MiB/s | 661.9 KiB | 00m00s [ 19/192] Installing coreutils-common-0 100% | 296.4 MiB/s | 11.6 MiB | 00m00s [ 20/192] Installing ncurses-base-0:6.6 100% | 43.4 MiB/s | 355.3 KiB | 00m00s [ 21/192] Installing bash-0:5.3.20-2.fc 100% | 175.7 MiB/s | 8.4 MiB | 00m00s [ 22/192] Installing glibc-common-0:2.4 100% | 44.4 MiB/s | 1.3 MiB | 00m00s [ 23/192] Installing glibc-gconv-extra- 100% | 359.3 MiB/s | 18.7 MiB | 00m00s [ 24/192] Installing glibc-0:2.44.9000- 100% | 129.3 MiB/s | 6.6 MiB | 00m00s [ 25/192] Installing ncurses-libs-0:6.6 100% | 207.6 MiB/s | 1.2 MiB | 00m00s [ 26/192] Installing glibc-minimal-lang 100% | 0.0 B/s | 124.0 B | 00m00s [ 27/192] Installing zlib-ng-compat-0:2 100% | 131.1 MiB/s | 134.3 KiB | 00m00s [ 28/192] Installing bzip2-libs-0:1.0.8 100% | 71.9 MiB/s | 73.6 KiB | 00m00s [ 29/192] Installing libgpg-error-0:1.6 100% | 36.3 MiB/s | 1.0 MiB | 00m00s [ 30/192] Installing readline-0:8.3-7.f 100% | 184.1 MiB/s | 565.7 KiB | 00m00s [ 31/192] Installing libstdc++-0:16.2.1 100% | 297.2 MiB/s | 3.0 MiB | 00m00s [ 32/192] Installing libzstd-0:1.5.7-6. 100% | 280.5 MiB/s | 861.6 KiB | 00m00s [ 33/192] Installing elfutils-libelf-0: 100% | 329.6 MiB/s | 1.6 MiB | 00m00s [ 34/192] Installing libassuan-0:2.5.7- 100% | 212.6 MiB/s | 217.7 KiB | 00m00s [ 35/192] Installing libgcrypt-0:1.12.4 100% | 240.7 MiB/s | 1.2 MiB | 00m00s [ 36/192] Installing gmp-1:6.3.0-6.fc45 100% | 214.9 MiB/s | 660.1 KiB | 00m00s [ 37/192] Installing libacl-0:2.4.0-2.f 100% | 67.1 MiB/s | 68.8 KiB | 00m00s [ 38/192] Installing systemd-libs-0:262 100% | 309.0 MiB/s | 2.8 MiB | 00m00s [ 39/192] Installing libuuid-0:2.42.4-2 100% | 68.8 MiB/s | 70.4 KiB | 00m00s [ 40/192] Installing popt-0:1.19-11.fc4 100% | 49.3 MiB/s | 151.3 KiB | 00m00s [ 41/192] Installing xz-libs-1:5.8.4-3. 100% | 260.4 MiB/s | 266.6 KiB | 00m00s [ 42/192] Installing sqlite-libs-0:3.54 100% | 261.4 MiB/s | 1.6 MiB | 00m00s [ 43/192] Installing npth-0:1.8-5.fc45. 100% | 92.3 MiB/s | 94.5 KiB | 00m00s [ 44/192] Installing elfutils-libs-0:0. 100% | 243.7 MiB/s | 748.8 KiB | 00m00s [ 45/192] Installing libblkid-0:2.42.4- 100% | 284.5 MiB/s | 291.3 KiB | 00m00s [ 46/192] Installing libsepol-0:3.11-2. 100% | 264.0 MiB/s | 810.9 KiB | 00m00s [ 47/192] Installing gnupg2-gpgconf-0:2 100% | 13.2 MiB/s | 323.9 KiB | 00m00s [ 48/192] Installing pcre2-0:10.49-1.fc 100% | 233.0 MiB/s | 715.8 KiB | 00m00s [ 49/192] Installing libselinux-0:3.11- 100% | 130.1 MiB/s | 266.5 KiB | 00m00s [ 50/192] Installing grep-0:3.12-4.fc45 100% | 37.1 MiB/s | 1.0 MiB | 00m00s [ 51/192] Installing sed-0:4.10-2.fc45. 100% | 30.9 MiB/s | 886.9 KiB | 00m00s [ 52/192] Installing findutils-1:4.11.0 100% | 65.0 MiB/s | 2.0 MiB | 00m00s [ 53/192] Installing libxcrypt-0:4.5.2- 100% | 134.7 MiB/s | 275.9 KiB | 00m00s [ 54/192] Installing json-c-0:0.18-9.fc 100% | 136.5 MiB/s | 139.8 KiB | 00m00s [ 55/192] Installing libtasn1-0:4.21.0- 100% | 217.3 MiB/s | 222.5 KiB | 00m00s [ 56/192] Installing libunistring-0:1.1 100% | 291.0 MiB/s | 1.7 MiB | 00m00s [ 57/192] Installing libidn2-0:2.3.8-4. 100% | 61.5 MiB/s | 566.6 KiB | 00m00s [ 58/192] Installing crypto-policies-0: 100% | 19.5 MiB/s | 159.5 KiB | 00m00s [ 59/192] Installing xz-1:5.8.4-3.fc46. 100% | 47.0 MiB/s | 1.5 MiB | 00m00s [ 60/192] Installing libmount-0:2.42.4- 100% | 205.8 MiB/s | 421.5 KiB | 00m00s [ 61/192] Installing gnupg2-verify-0:2. 100% | 14.9 MiB/s | 365.7 KiB | 00m00s [ 62/192] Installing mpfr-0:4.2.2-4.fc4 100% | 184.8 MiB/s | 757.1 KiB | 00m00s [ 63/192] Installing gawk-0:5.4.1-1.fc4 100% | 91.4 MiB/s | 2.9 MiB | 00m00s [ 64/192] Installing dwz-0:0.17-3.fc45. 100% | 13.2 MiB/s | 324.0 KiB | 00m00s [ 65/192] Installing libksba-0:1.8.1-1. 100% | 200.3 MiB/s | 410.3 KiB | 00m00s [ 66/192] Installing unzip-0:6.0-71.fc4 100% | 18.5 MiB/s | 473.4 KiB | 00m00s [ 67/192] Installing file-libs-0:5.48-3 100% | 561.8 MiB/s | 12.4 MiB | 00m00s [ 68/192] Installing file-0:5.48-3.fc46 100% | 6.1 MiB/s | 143.4 KiB | 00m00s [ 69/192] Installing diffutils-0:3.12-6 100% | 54.1 MiB/s | 1.6 MiB | 00m00s [ 70/192] Installing libattr-0:2.6.0-2. 100% | 67.7 MiB/s | 69.3 KiB | 00m00s [ 71/192] Installing libeconf-0:0.8.6-1 100% | 81.4 MiB/s | 83.3 KiB | 00m00s [ 72/192] Installing libcap-ng-0:0.9.6- 100% | 159.0 MiB/s | 162.8 KiB | 00m00s [ 73/192] Installing audit-libs-0:4.2.1 100% | 238.9 MiB/s | 489.3 KiB | 00m00s [ 74/192] Installing pam-libs-0:1.7.2-4 100% | 219.8 MiB/s | 225.1 KiB | 00m00s [ 75/192] Installing libcap-0:2.78-2.fc 100% | 20.1 MiB/s | 513.5 KiB | 00m00s [ 76/192] Installing libsemanage-0:3.11 100% | 176.8 MiB/s | 362.0 KiB | 00m00s [ 77/192] Installing libsmartcols-0:2.4 100% | 220.1 MiB/s | 225.4 KiB | 00m00s [ 78/192] Installing alternatives-0:1.3 100% | 3.9 MiB/s | 91.7 KiB | 00m00s [ 79/192] Installing lua-libs-0:5.5.1-2 100% | 161.9 MiB/s | 331.5 KiB | 00m00s [ 80/192] Installing libffi-0:3.8.0-1.f 100% | 157.2 MiB/s | 161.0 KiB | 00m00s [ 81/192] Installing p11-kit-0:0.26.5-1 100% | 80.0 MiB/s | 2.8 MiB | 00m00s [ 82/192] Installing p11-kit-trust-0:0. 100% | 17.9 MiB/s | 531.9 KiB | 00m00s [ 83/192] Installing ngtcp2-0:1.22.1-3. 100% | 167.3 MiB/s | 342.7 KiB | 00m00s [ 84/192] Installing util-linux-core-0: 100% | 76.8 MiB/s | 2.5 MiB | 00m00s [ 85/192] Installing liblastlog2-0:2.42 100% | 27.3 MiB/s | 139.8 KiB | 00m00s [ 86/192] Installing zip-0:3.0-46.fc45. 100% | 28.8 MiB/s | 766.1 KiB | 00m00s [ 87/192] Installing gnupg2-keyboxd-0:2 100% | 45.8 MiB/s | 234.5 KiB | 00m00s [ 88/192] Installing libpsl-0:0.23.3-1. 100% | 130.4 MiB/s | 133.6 KiB | 00m00s [ 89/192] Installing tar-2:1.35-9.fc45. 100% | 88.4 MiB/s | 3.0 MiB | 00m00s [ 90/192] Installing linkdupes-0:0.7.3- 100% | 27.8 MiB/s | 712.4 KiB | 00m00s [ 91/192] Installing libselinux-utils-0 100% | 50.3 MiB/s | 1.4 MiB | 00m00s [ 92/192] Installing libfdisk-0:2.42.4- 100% | 205.0 MiB/s | 419.9 KiB | 00m00s [ 93/192] Installing fips-provider-0:1. 100% | 315.8 MiB/s | 3.8 MiB | 00m00s [ 94/192] Installing openssl-libs-1:4.0 100% | 305.9 MiB/s | 5.8 MiB | 00m00s [ 95/192] Installing coreutils-0:9.12-1 100% | 162.4 MiB/s | 8.6 MiB | 00m00s [ 96/192] Installing ca-certificates-0: 100% | 1.6 MiB/s | 2.5 MiB | 00m02s [ 97/192] Installing gzip-0:1.15-1.fc46 100% | 17.2 MiB/s | 474.6 KiB | 00m00s [ 98/192] Installing util-linux-0:2.42. 100% | 123.0 MiB/s | 7.0 MiB | 00m00s [ 99/192] Installing policycoreutils-0: 100% | 39.2 MiB/s | 1.5 MiB | 00m00s [100/192] Installing selinux-policy-0:4 100% | 1.9 MiB/s | 34.5 KiB | 00m00s [101/192] Installing selinux-policy-tar 100% | 130.1 MiB/s | 15.1 MiB | 00m00s [102/192] Installing rpm-sequoia-0:1.10 100% | 286.5 MiB/s | 2.3 MiB | 00m00s [103/192] Installing libfsverity-0:1.7- 100% | 67.8 MiB/s | 69.4 KiB | 00m00s [104/192] Installing libevent-0:2.1.13- 100% | 271.7 MiB/s | 1.1 MiB | 00m00s [105/192] Installing ngtcp2-crypto-ossl 100% | 66.7 MiB/s | 68.3 KiB | 00m00s [106/192] Installing libusb1-0:1.0.30-2 100% | 14.8 MiB/s | 181.4 KiB | 00m00s >>> Running sysusers scriptlet: tpm2-tss-0:4.2.1-1.fc46.aarch64 >>> Finished sysusers scriptlet: tpm2-tss-0:4.2.1-1.fc46.aarch64 >>> Scriptlet output: >>> Creating group 'tss' with GID 59. >>> Creating user 'tss' (Account used for TPM access) with UID 59 and GID 59. >>> [107/192] Installing tpm2-tss-0:4.2.1-1 100% | 248.5 MiB/s | 2.2 MiB | 00m00s [108/192] Installing ima-evm-utils-libs 100% | 91.7 MiB/s | 93.9 KiB | 00m00s [109/192] Installing gnupg2-gpg-agent-0 100% | 27.7 MiB/s | 850.8 KiB | 00m00s [110/192] Installing nettle-0:4.0-5.fc4 100% | 205.0 MiB/s | 839.8 KiB | 00m00s [111/192] Installing gnutls-0:3.8.13-6. 100% | 285.4 MiB/s | 3.7 MiB | 00m00s [112/192] Installing zstd-0:1.5.7-6.fc4 100% | 21.3 MiB/s | 565.9 KiB | 00m00s [113/192] Installing libxml2-0:2.15.4-1 100% | 59.3 MiB/s | 1.7 MiB | 00m00s [114/192] Installing bzip2-0:1.0.8-24.f 100% | 7.1 MiB/s | 175.7 KiB | 00m00s [115/192] Installing add-determinism-0: 100% | 65.7 MiB/s | 1.9 MiB | 00m00s [116/192] Installing build-reproducibil 100% | 1.5 MiB/s | 1.5 KiB | 00m00s [117/192] Installing cpio-0:2.15-10.fc4 100% | 39.1 MiB/s | 1.1 MiB | 00m00s [118/192] Installing ed-0:1.22.6-1.fc46 100% | 6.6 MiB/s | 161.2 KiB | 00m00s [119/192] Installing patch-0:2.8-6.fc46 100% | 10.7 MiB/s | 263.9 KiB | 00m00s [120/192] Installing jansson-0:2.14-5.f 100% | 92.2 MiB/s | 94.4 KiB | 00m00s [121/192] Installing libpfm-0:4.14.1-2. 100% | 251.3 MiB/s | 514.6 KiB | 00m00s [122/192] Installing lz4-libs-0:1.10.0- 100% | 193.8 MiB/s | 198.4 KiB | 00m00s [123/192] Installing libarchive-0:3.8.9 100% | 238.7 MiB/s | 977.6 KiB | 00m00s [124/192] Installing libgomp-0:16.2.1-3 100% | 290.2 MiB/s | 594.3 KiB | 00m00s [125/192] Installing libpkgconf-0:2.5.1 100% | 132.0 MiB/s | 135.2 KiB | 00m00s [126/192] Installing pkgconf-0:2.5.1-2. 100% | 5.1 MiB/s | 119.3 KiB | 00m00s [127/192] Installing pkgconf-pkg-config 100% | 80.6 KiB/s | 1.8 KiB | 00m00s [128/192] Installing libtool-ltdl-0:2.6 100% | 92.8 MiB/s | 95.0 KiB | 00m00s [129/192] Installing gdbm-libs-1:1.26-1 100% | 230.5 MiB/s | 236.0 KiB | 00m00s [130/192] Installing cyrus-sasl-lib-0:2 100% | 78.0 MiB/s | 2.4 MiB | 00m00s [131/192] Installing openldap-0:2.6.16- 100% | 188.0 MiB/s | 769.9 KiB | 00m00s [132/192] Installing gnupg2-dirmngr-0:2 100% | 21.9 MiB/s | 648.9 KiB | 00m00s [133/192] Installing gnupg2-0:2.4.9-18. 100% | 143.5 MiB/s | 6.5 MiB | 00m00s [134/192] Installing gpgverify-0:2.2-5. 100% | 9.2 MiB/s | 9.4 KiB | 00m00s [135/192] Installing systemd-standalone 100% | 36.8 MiB/s | 979.9 KiB | 00m00s [136/192] Installing rpm-libs-0:6.1.0-1 100% | 220.1 MiB/s | 1.1 MiB | 00m00s [137/192] Installing rpm-sign-libs-0:6. 100% | 66.9 MiB/s | 68.5 KiB | 00m00s [138/192] Installing rpm-build-libs-0:6 100% | 129.3 MiB/s | 264.9 KiB | 00m00s [139/192] Installing xxhash-libs-0:0.8. 100% | 85.1 MiB/s | 87.2 KiB | 00m00s [140/192] Installing libbrotli-0:1.2.1- 100% | 222.5 MiB/s | 911.5 KiB | 00m00s [141/192] Installing libnghttp2-0:1.69. 100% | 194.4 MiB/s | 199.0 KiB | 00m00s [142/192] Installing libnghttp3-0:1.18. 100% | 203.3 MiB/s | 208.2 KiB | 00m00s [143/192] Installing keyutils-libs-0:1. 100% | 97.3 MiB/s | 99.7 KiB | 00m00s [144/192] Installing libcom_err-0:1.47. 100% | 109.6 MiB/s | 112.2 KiB | 00m00s [145/192] Installing libverto-0:0.3.2-1 100% | 69.5 MiB/s | 71.1 KiB | 00m00s [146/192] Installing krb5-libs-0:1.22.2 100% | 253.4 MiB/s | 2.5 MiB | 00m00s [147/192] Installing libcbor-0:0.14.0-3 100% | 137.7 MiB/s | 141.0 KiB | 00m00s [148/192] Installing libfido2-0:1.17.0- 100% | 137.8 MiB/s | 282.2 KiB | 00m00s [149/192] Installing libssh-0:0.12.2-1. 100% | 235.5 MiB/s | 723.4 KiB | 00m00s [150/192] Installing libcurl-0:8.23.0-3 100% | 255.7 MiB/s | 1.0 MiB | 00m00s [151/192] Installing elfutils-debuginfo 100% | 5.7 MiB/s | 146.3 KiB | 00m00s [152/192] Installing binutils-0:2.47.50 100% | 254.7 MiB/s | 27.3 MiB | 00m00s [153/192] Installing elfutils-0:0.197-2 100% | 104.5 MiB/s | 3.7 MiB | 00m00s [154/192] Installing gdb-minimal-0:18.1 100% | 218.9 MiB/s | 13.8 MiB | 00m00s [155/192] Installing debugedit-0:5.4-1. 100% | 12.7 MiB/s | 324.2 KiB | 00m00s [156/192] Installing curl-0:8.23.0-3.fc 100% | 16.1 MiB/s | 528.8 KiB | 00m00s [157/192] Installing rpm-0:6.1.0-1.fc46 100% | 56.2 MiB/s | 2.8 MiB | 00m00s [158/192] Installing cmake-srpm-macros- 100% | 785.2 KiB/s | 804.0 B | 00m00s [159/192] Installing efi-srpm-macros-0: 100% | 40.3 MiB/s | 41.3 KiB | 00m00s [160/192] Installing java-srpm-macros-0 100% | 0.0 B/s | 1.1 KiB | 00m00s [161/192] Installing lua-srpm-macros-0: 100% | 0.0 B/s | 1.9 KiB | 00m00s [162/192] Installing tree-sitter-srpm-m 100% | 9.4 MiB/s | 9.6 KiB | 00m00s [163/192] Installing zig-srpm-macros-0: 100% | 0.0 B/s | 1.9 KiB | 00m00s [164/192] Installing filesystem-srpm-ma 100% | 38.0 MiB/s | 38.9 KiB | 00m00s [165/192] Installing rust-srpm-macros-0 100% | 0.0 B/s | 6.4 KiB | 00m00s [166/192] Installing qt6-srpm-macros-0: 100% | 0.0 B/s | 748.0 B | 00m00s [167/192] Installing qt5-srpm-macros-0: 100% | 0.0 B/s | 776.0 B | 00m00s [168/192] Installing perl-srpm-macros-0 100% | 0.0 B/s | 1.1 KiB | 00m00s [169/192] Installing package-notes-srpm 100% | 343.8 KiB/s | 2.1 KiB | 00m00s [170/192] Installing openblas-srpm-macr 100% | 0.0 B/s | 404.0 B | 00m00s [171/192] Installing ocaml-srpm-macros- 100% | 0.0 B/s | 2.1 KiB | 00m00s [172/192] Installing meson-srpm-macros- 100% | 0.0 B/s | 1.9 KiB | 00m00s [173/192] Installing kernel-srpm-macros 100% | 0.0 B/s | 2.3 KiB | 00m00s [174/192] Installing gnome-srpm-macros- 100% | 0.0 B/s | 4.1 KiB | 00m00s [175/192] Installing gnat-srpm-macros-0 100% | 0.0 B/s | 1.3 KiB | 00m00s [176/192] Installing ghc-srpm-macros-0: 100% | 0.0 B/s | 1.0 KiB | 00m00s [177/192] Installing gap-srpm-macros-0: 100% | 0.0 B/s | 2.7 KiB | 00m00s [178/192] Installing fpc-srpm-macros-0: 100% | 0.0 B/s | 420.0 B | 00m00s [179/192] Installing ansible-srpm-macro 100% | 35.4 MiB/s | 36.2 KiB | 00m00s [180/192] Installing redhat-rpm-config- 100% | 62.0 MiB/s | 190.5 KiB | 00m00s [181/192] Installing forge-srpm-macros- 100% | 39.3 MiB/s | 40.3 KiB | 00m00s [182/192] Installing rpm-build-0:6.1.0- 100% | 22.6 MiB/s | 626.1 KiB | 00m00s [183/192] Installing erlang-srpm-macros 100% | 2.5 MiB/s | 2.6 KiB | 00m00s [184/192] Installing pyproject-srpm-mac 100% | 0.0 B/s | 4.0 KiB | 00m00s [185/192] Installing fonts-srpm-macros- 100% | 55.7 MiB/s | 57.0 KiB | 00m00s [186/192] Installing go-srpm-macros-0:3 100% | 61.6 MiB/s | 63.0 KiB | 00m00s [187/192] Installing R-srpm-macros-0:1. 100% | 0.0 B/s | 4.4 KiB | 00m00s [188/192] Installing python-srpm-macros 100% | 51.7 MiB/s | 52.9 KiB | 00m00s [189/192] Installing rpm-plugin-selinux 100% | 67.3 MiB/s | 68.9 KiB | 00m00s [190/192] Installing which-0:2.25-2.fc4 100% | 4.9 MiB/s | 125.8 KiB | 00m00s [191/192] Installing shadow-utils-2:4.2 100% | 90.7 MiB/s | 4.4 MiB | 00m00s [192/192] Installing info-0:7.3-3.fc45. 100% | 48.7 KiB/s | 424.8 KiB | 00m09s Complete! Finish: installing minimal buildroot with dnf5 Start: creating root cache Finish: creating root cache Finish: chroot init INFO: Installed packages: INFO: R-srpm-macros-1.3.7-3.fc45.noarch add-determinism-0.7.3-3.fc45.aarch64 alternatives-1.33-6.fc45.aarch64 ansible-srpm-macros-1-22.fc45.noarch audit-libs-4.2.1-2.fc45.aarch64 bash-5.3.20-2.fc46.aarch64 binutils-2.47.50-21.fc46.aarch64 build-reproducibility-srpm-macros-0.7.3-3.fc45.noarch bzip2-1.0.8-24.fc45.aarch64 bzip2-libs-1.0.8-24.fc45.aarch64 ca-certificates-2026.2.92_v9.0.319-2.fc46.noarch cmake-srpm-macros-4.3.0-5.fc45.noarch coreutils-9.12-1.fc46.aarch64 coreutils-common-9.12-1.fc46.aarch64 cpio-2.15-10.fc45.aarch64 crypto-policies-20260713-2.gitc42da77.fc45.noarch curl-8.23.0-3.fc46.aarch64 cyrus-sasl-lib-2.1.28-37.fc45.aarch64 debugedit-5.4-1.fc46.aarch64 diffutils-3.12-6.fc45.aarch64 dwz-0.17-3.fc45.aarch64 ed-1.22.6-1.fc46.aarch64 efi-srpm-macros-6-9.fc45.noarch elfutils-0.197-2.fc46.aarch64 elfutils-debuginfod-client-0.197-2.fc46.aarch64 elfutils-libelf-0.197-2.fc46.aarch64 elfutils-libs-0.197-2.fc46.aarch64 erlang-srpm-macros-0.4.1-1.fc46.noarch fedora-gpg-keys-46-0.3.noarch fedora-release-46-0.1.noarch fedora-release-common-46-0.1.noarch fedora-release-identity-basic-46-0.1.noarch fedora-repos-46-0.3.noarch fedora-repos-rawhide-46-0.3.noarch file-5.48-3.fc46.aarch64 file-libs-5.48-3.fc46.aarch64 filesystem-3.18-59.fc45.aarch64 filesystem-srpm-macros-3.18-59.fc45.noarch findutils-4.11.0-2.fc45.aarch64 fips-provider-1.5.3-3.fc46.aarch64 fonts-srpm-macros-5.0.0-4.fc45.noarch forge-srpm-macros-0.4.0-5.fc45.noarch fpc-srpm-macros-1.3-17.fc45.noarch gap-srpm-macros-2-3.fc45.noarch gawk-5.4.1-1.fc45.aarch64 gdb-minimal-18.1-1.fc46.aarch64 gdbm-libs-1.26-1.fc46.aarch64 ghc-srpm-macros-1.10-2.fc45.noarch glibc-2.44.9000-6.fc46.aarch64 glibc-common-2.44.9000-6.fc46.aarch64 glibc-gconv-extra-2.44.9000-6.fc46.aarch64 glibc-minimal-langpack-2.44.9000-6.fc46.aarch64 gmp-6.3.0-6.fc45.aarch64 gnat-srpm-macros-7-3.fc45.noarch gnome-srpm-macros-1.0-2.fc45.noarch gnulib-l10n-20241231-4.fc45.noarch gnupg2-2.4.9-18.fc45.aarch64 gnupg2-dirmngr-2.4.9-18.fc45.aarch64 gnupg2-gpg-agent-2.4.9-18.fc45.aarch64 gnupg2-gpgconf-2.4.9-18.fc45.aarch64 gnupg2-keyboxd-2.4.9-18.fc45.aarch64 gnupg2-verify-2.4.9-18.fc45.aarch64 gnutls-3.8.13-6.fc46.aarch64 go-srpm-macros-3.8.0-3.fc45.noarch gpg-pubkey-4f50a6114cd5c6976a7f1179655a4b02f577861e-6888bc98 gpg-pubkey-b2e766fa50ca6fa2d5ed06fc09d879e09488fb64-6a6b46b4 gpg-pubkey-d924b10d3e810dabdd8b56b596e7e91491211fce-697c9899 gpgverify-2.2-5.fc45.noarch grep-3.12-4.fc45.aarch64 gzip-1.15-1.fc46.aarch64 ima-evm-utils-libs-1.6.2-12.fc45.aarch64 info-7.3-3.fc45.aarch64 jansson-2.14-5.fc45.aarch64 java-srpm-macros-1-9.fc45.noarch json-c-0.18-9.fc45.aarch64 kernel-srpm-macros-1.0-30.fc45.noarch keyutils-libs-1.6.3-8.fc45.aarch64 krb5-libs-1.22.2-11.fc46.aarch64 libacl-2.4.0-2.fc45.aarch64 libarchive-3.8.9-2.fc46.aarch64 libassuan-2.5.7-6.fc45.aarch64 libattr-2.6.0-2.fc45.aarch64 libblkid-2.42.4-2.fc46.aarch64 libbrotli-1.2.1-1.fc46.aarch64 libcap-2.78-2.fc45.aarch64 libcap-ng-0.9.6-1.fc46.aarch64 libcbor-0.14.0-3.fc45.aarch64 libcom_err-1.47.4-2.fc45.aarch64 libcurl-8.23.0-3.fc46.aarch64 libeconf-0.8.6-1.fc46.aarch64 libevent-2.1.13-1.fc46.aarch64 libfdisk-2.42.4-2.fc46.aarch64 libffi-3.8.0-1.fc46.aarch64 libfido2-1.17.0-7.fc46.aarch64 libfsverity-1.7-4.fc45.aarch64 libgcc-16.2.1-3.fc46.aarch64 libgcrypt-1.12.4-1.fc46.aarch64 libgomp-16.2.1-3.fc46.aarch64 libgpg-error-1.61-2.fc45.aarch64 libidn2-2.3.8-4.fc45.aarch64 libksba-1.8.1-1.fc46.aarch64 liblastlog2-2.42.4-2.fc46.aarch64 libmount-2.42.4-2.fc46.aarch64 libnghttp2-1.69.0-6.fc46.aarch64 libnghttp3-1.18.0-1.fc45.aarch64 libpfm-4.14.1-2.fc46.aarch64 libpkgconf-2.5.1-2.fc45.aarch64 libpsl-0.23.3-1.fc46.aarch64 libselinux-3.11-5.fc46.aarch64 libselinux-utils-3.11-5.fc46.aarch64 libsemanage-3.11-4.fc46.aarch64 libsepol-3.11-2.fc45.aarch64 libsmartcols-2.42.4-2.fc46.aarch64 libssh-0.12.2-1.fc45.aarch64 libssh-config-0.12.2-1.fc45.noarch libstdc++-16.2.1-3.fc46.aarch64 libtasn1-4.21.0-2.fc45.aarch64 libtool-ltdl-2.6.2-1.fc46.aarch64 libunistring-1.1-12.fc45.aarch64 libusb1-1.0.30-2.fc45.aarch64 libuuid-2.42.4-2.fc46.aarch64 libverto-0.3.2-13.fc45.aarch64 libxcrypt-4.5.2-4.fc45.aarch64 libxml2-2.15.4-1.fc46.aarch64 libzstd-1.5.7-6.fc45.aarch64 linkdupes-0.7.3-3.fc45.aarch64 lua-libs-5.5.1-2.fc46.aarch64 lua-srpm-macros-1-18.fc45.noarch lz4-libs-1.10.0-5.fc45.aarch64 meson-srpm-macros-1.12.1-2.fc46.noarch mpfr-4.2.2-4.fc45.aarch64 ncurses-base-6.6-3.fc45.noarch ncurses-libs-6.6-3.fc45.aarch64 nettle-4.0-5.fc45.aarch64 ngtcp2-1.22.1-3.fc45.aarch64 ngtcp2-crypto-ossl-1.22.1-3.fc45.aarch64 npth-1.8-5.fc45.aarch64 ocaml-srpm-macros-11-4.fc45.noarch openblas-srpm-macros-2-23.fc46.noarch openldap-2.6.16-1.fc46.aarch64 openssl-libs-4.0.3-1.fc46.aarch64 p11-kit-0.26.5-1.fc45.aarch64 p11-kit-trust-0.26.5-1.fc45.aarch64 package-notes-srpm-macros-0.20-2.fc45.noarch pam-libs-1.7.2-4.fc45.aarch64 patch-2.8-6.fc46.aarch64 pcre2-10.49-1.fc46.aarch64 pcre2-syntax-10.49-1.fc46.noarch perl-srpm-macros-1-65.fc45.noarch pkgconf-2.5.1-2.fc45.aarch64 pkgconf-m4-2.5.1-2.fc45.noarch pkgconf-pkg-config-2.5.1-2.fc45.aarch64 policycoreutils-3.11-2.fc45.aarch64 popt-1.19-11.fc45.aarch64 publicsuffix-list-dafsa-20260624-2.fc45.noarch pyproject-srpm-macros-1.24.0-1.fc46.noarch python-srpm-macros-3.15-2.fc45.noarch qt5-srpm-macros-5.15.18-3.fc45.noarch qt6-srpm-macros-6.12.0-1.fc46.noarch readline-8.3-7.fc46.aarch64 redhat-rpm-config-345-7.fc46.noarch redhat-systemd-presets-102-3.fc45.noarch redhat-systemd-presets-common-102-3.fc45.noarch rpm-6.1.0-1.fc46.aarch64 rpm-build-6.1.0-1.fc46.aarch64 rpm-build-libs-6.1.0-1.fc46.aarch64 rpm-libs-6.1.0-1.fc46.aarch64 rpm-plugin-selinux-6.1.0-1.fc46.aarch64 rpm-sequoia-1.10.3-1.fc46.aarch64 rpm-sign-libs-6.1.0-1.fc46.aarch64 rust-srpm-macros-28.5-2.fc45.noarch sed-4.10-2.fc45.aarch64 selinux-policy-45.23-1.fc46.noarch selinux-policy-targeted-45.23-1.fc46.noarch setup-2.15.1-2.fc45.noarch shadow-utils-4.20.0-2.fc46.aarch64 sqlite-libs-3.54.1-1.fc46.aarch64 systemd-libs-262.2-1.fc46.aarch64 systemd-standalone-sysusers-262.2-1.fc46.aarch64 tar-1.35-9.fc45.aarch64 tpm2-tss-4.2.1-1.fc46.aarch64 tree-sitter-srpm-macros-0.4.6-2.fc45.noarch unzip-6.0-71.fc45.aarch64 util-linux-2.42.4-2.fc46.aarch64 util-linux-core-2.42.4-2.fc46.aarch64 which-2.25-2.fc45.aarch64 xxhash-libs-0.8.4-2.fc46.aarch64 xz-5.8.4-3.fc46.aarch64 xz-libs-5.8.4-3.fc46.aarch64 zig-srpm-macros-1-9.fc45.noarch zip-3.0-46.fc45.aarch64 zlib-ng-compat-2.3.3-6.fc45.aarch64 zstd-1.5.7-6.fc45.aarch64 Start: buildsrpm Start: rpmbuild -bs Building target platforms: aarch64 Building for target aarch64 setting SOURCE_DATE_EPOCH=1793923200 Wrote: /builddir/build/SRPMS/python-ipax-0.13.0-1.fc46.src.rpm Finish: rpmbuild -bs INFO: chroot_scan: 1 files copied to /var/lib/copr-rpmbuild/results/chroot_scan INFO: /var/lib/mock/fedora-rawhide-aarch64-1794038830.969969/root/var/log/dnf5.log INFO: chroot_scan: creating tarball /var/lib/copr-rpmbuild/results/chroot_scan.tar.gz /bin/tar: Removing leading `/' from member names Finish: buildsrpm INFO: Done(/var/lib/copr-rpmbuild/workspace/workdir-9v6db_9g/python-ipax/python-ipax.spec) Config(child) 1 minutes 8 seconds INFO: Results and/or logs in: /var/lib/copr-rpmbuild/results INFO: Cleaning up build root ('cleanup_on_success=True') Start: clean chroot INFO: unmounting tmpfs. Finish: clean chroot INFO: Start(/var/lib/copr-rpmbuild/results/python-ipax-0.13.0-1.fc46.src.rpm) Config(fedora-rawhide-aarch64) Start(bootstrap): chroot init INFO: mounting tmpfs at /var/lib/mock/fedora-rawhide-aarch64-bootstrap-1794038830.969969/root. INFO: reusing tmpfs at /var/lib/mock/fedora-rawhide-aarch64-bootstrap-1794038830.969969/root. INFO: calling preinit hooks INFO: enabled root cache INFO: enabled package manager cache Start(bootstrap): cleaning package manager metadata Finish(bootstrap): cleaning package manager metadata Finish(bootstrap): chroot init Start: chroot init INFO: mounting tmpfs at /var/lib/mock/fedora-rawhide-aarch64-1794038830.969969/root. INFO: calling preinit hooks INFO: enabled root cache Start: unpacking root cache Finish: unpacking root cache INFO: enabled package manager cache Start: cleaning package manager metadata Finish: cleaning package manager metadata INFO: enabled HW Info plugin INFO: Buildroot is handled by package management downloaded with a bootstrap image: rpm-6.1.0-1.fc46.aarch64 rpm-sequoia-1.10.3-1.fc46.aarch64 dnf5-5.4.6.0-1.fc46.aarch64 dnf5-plugins-5.4.6.0-1.fc46.aarch64 Finish: chroot init Start: build phase for python-ipax-0.13.0-1.fc46.src.rpm Start: build setup for python-ipax-0.13.0-1.fc46.src.rpm Building target platforms: aarch64 Building for target aarch64 setting SOURCE_DATE_EPOCH=1793923200 Wrote: /builddir/build/SRPMS/python-ipax-0.13.0-1.fc46.src.rpm Updating and loading repositories: fedora 100% | 43.7 KiB/s | 7.6 KiB | 00m00s Copr repository 100% | 14.1 KiB/s | 1.5 KiB | 00m00s Repositories loaded. Package Arch Version Repository Size Installing: pyproject-rpm-macros noarch 0:1.24.0-1.fc46 fedora 169.0 KiB python3-array-api-strict noarch 0:2.0.1-10.fc45 fedora 702.8 KiB python3-devel aarch64 0:3.15.2-1.fc46 fedora 2.5 MiB python3-hypothesis noarch 0:6.151.9-4.fc45 fedora 5.5 MiB python3-numpy aarch64 1:2.5.4-2.fc46 fedora 37.7 MiB python3-pytest noarch 0:9.1.1-1.fc45 fedora 24.3 MiB python3-scipy aarch64 0:1.18.0-3.fc46 fedora 63.5 MiB python3-sympy noarch 0:1.14.0-18.fc46 fedora 84.5 MiB Installing dependencies: expat aarch64 0:2.9.0-1.fc46 fedora 389.5 KiB flexiblas aarch64 0:3.5.0-4.fc46 fedora 38.0 KiB flexiblas-netlib aarch64 0:3.5.0-4.fc46 fedora 14.2 MiB flexiblas-openblas-openmp aarch64 0:3.5.0-4.fc46 fedora 67.2 KiB libgfortran aarch64 0:16.2.1-3.fc46 fedora 1.7 MiB mpdecimal aarch64 0:4.0.1-4.fc45 fedora 281.1 KiB openblas aarch64 0:0.3.34-1.fc45 fedora 138.1 KiB openblas-openmp aarch64 0:0.3.34-1.fc45 fedora 22.2 MiB python-pip-wheel noarch 0:26.2.1-1.fc46 fedora 1.3 MiB python-rpm-macros noarch 0:3.15-2.fc45 fedora 28.0 KiB python3 aarch64 0:3.15.2-1.fc46 fedora 84.7 KiB python3-charset-normalizer noarch 0:3.5.2-2.fc46 fedora 477.6 KiB python3-idna noarch 0:3.20-1.fc46 fedora 519.5 KiB python3-iniconfig noarch 0:2.3.0-5.fc45 fedora 49.6 KiB python3-libs aarch64 0:3.15.2-1.fc46 fedora 49.9 MiB python3-mpmath noarch 0:1.4.1-5.fc45 fedora 4.1 MiB python3-numpy-f2py aarch64 1:2.5.4-2.fc46 fedora 2.1 MiB python3-packaging noarch 0:26.3-1.fc46 fedora 1.3 MiB python3-platformdirs noarch 0:4.13.3-1.fc46 fedora 360.4 KiB python3-pluggy noarch 0:1.7.0-1.fc46 fedora 246.1 KiB python3-pooch noarch 0:1.9.0-3.fc45 fedora 659.5 KiB python3-pygments noarch 0:2.21.0-1.fc46 fedora 11.5 MiB python3-requests noarch 0:2.34.2-2.fc45 fedora 679.2 KiB python3-rpm-generators noarch 0:14-35.fc46 fedora 81.9 KiB python3-rpm-macros noarch 0:3.15-2.fc45 fedora 6.5 KiB python3-sortedcontainers noarch 0:2.4.0-29.fc45 fedora 393.8 KiB python3-urllib3 noarch 0:2.8.0-3.fc46 fedora 1.2 MiB tzdata noarch 0:2026f-1.fc46 fedora 1.3 MiB Transaction Summary: Installing: 36 packages Total size of inbound packages is 70 MiB. Need to download 70 MiB. After this operation, 334 MiB extra will be used (install 334 MiB, remove 0 B). [ 1/36] pyproject-rpm-macros-0:1.24.0-1 100% | 291.4 KiB/s | 58.0 KiB | 00m00s [ 2/36] python3-array-api-strict-0:2.0. 100% | 483.9 KiB/s | 165.5 KiB | 00m00s [ 3/36] python3-devel-0:3.15.2-1.fc46.a 100% | 708.2 KiB/s | 492.2 KiB | 00m01s [ 4/36] python3-hypothesis-0:6.151.9-4. 100% | 1.0 MiB/s | 1.1 MiB | 00m01s [ 5/36] python3-pytest-0:9.1.1-1.fc45.n 100% | 1.2 MiB/s | 2.5 MiB | 00m02s [ 6/36] python3-numpy-1:2.5.4-2.fc46.aa 100% | 1.1 MiB/s | 7.2 MiB | 00m06s [ 7/36] python-rpm-macros-0:3.15-2.fc45 100% | 299.6 KiB/s | 19.8 KiB | 00m00s [ 8/36] python3-rpm-macros-0:3.15-2.fc4 100% | 185.3 KiB/s | 12.2 KiB | 00m00s [ 9/36] python3-0:3.15.2-1.fc46.aarch64 100% | 334.3 KiB/s | 28.1 KiB | 00m00s [10/36] python3-scipy-0:1.18.0-3.fc46.a 100% | 1.3 MiB/s | 15.7 MiB | 00m12s [11/36] python3-sortedcontainers-0:2.4. 100% | 702.7 KiB/s | 63.9 KiB | 00m00s [12/36] python3-sympy-0:1.14.0-18.fc46. 100% | 1.2 MiB/s | 15.9 MiB | 00m13s [13/36] python3-libs-0:3.15.2-1.fc46.aa 100% | 1.2 MiB/s | 10.9 MiB | 00m09s [14/36] python3-iniconfig-0:2.3.0-5.fc4 100% | 390.7 KiB/s | 25.8 KiB | 00m00s [15/36] python3-packaging-0:26.3-1.fc46 100% | 1.1 MiB/s | 293.6 KiB | 00m00s [16/36] python3-numpy-f2py-1:2.5.4-2.fc 100% | 1.0 MiB/s | 515.9 KiB | 00m00s [17/36] python3-pluggy-0:1.7.0-1.fc46.n 100% | 572.5 KiB/s | 75.0 KiB | 00m00s [18/36] libgfortran-0:16.2.1-3.fc46.aar 100% | 1.0 MiB/s | 472.8 KiB | 00m00s [19/36] python3-pooch-0:1.9.0-3.fc45.no 100% | 928.2 KiB/s | 146.7 KiB | 00m00s [20/36] flexiblas-netlib-0:3.5.0-4.fc46 100% | 1.2 MiB/s | 4.0 MiB | 00m03s [21/36] expat-0:2.9.0-1.fc46.aarch64 100% | 692.7 KiB/s | 130.9 KiB | 00m00s [22/36] python3-mpmath-0:1.4.1-5.fc45.n 100% | 1.1 MiB/s | 853.9 KiB | 00m01s [23/36] mpdecimal-0:4.0.1-4.fc45.aarch6 100% | 181.4 KiB/s | 95.4 KiB | 00m01s [24/36] tzdata-0:2026f-1.fc46.noarch 100% | 1.0 MiB/s | 713.6 KiB | 00m01s [25/36] flexiblas-0:3.5.0-4.fc46.aarch6 100% | 223.3 KiB/s | 22.6 KiB | 00m00s [26/36] python3-pygments-0:2.21.0-1.fc4 100% | 1.2 MiB/s | 2.7 MiB | 00m02s [27/36] flexiblas-openblas-openmp-0:3.5 100% | 201.0 KiB/s | 15.9 KiB | 00m00s [28/36] python-pip-wheel-0:26.2.1-1.fc4 100% | 1.1 MiB/s | 1.2 MiB | 00m01s [29/36] python3-platformdirs-0:4.13.3-1 100% | 486.8 KiB/s | 86.2 KiB | 00m00s [30/36] python3-requests-0:2.34.2-2.fc4 100% | 940.1 KiB/s | 188.0 KiB | 00m00s [31/36] python3-charset-normalizer-0:3. 100% | 1.0 MiB/s | 141.4 KiB | 00m00s [32/36] python3-idna-0:3.20-1.fc46.noar 100% | 824.2 KiB/s | 109.6 KiB | 00m00s [33/36] openblas-0:0.3.34-1.fc45.aarch6 100% | 491.0 KiB/s | 48.1 KiB | 00m00s [34/36] python3-rpm-generators-0:14-35. 100% | 430.3 KiB/s | 28.8 KiB | 00m00s [35/36] python3-urllib3-0:2.8.0-3.fc46. 100% | 1.1 MiB/s | 312.3 KiB | 00m00s [36/36] openblas-openmp-0:0.3.34-1.fc45 100% | 2.6 MiB/s | 4.2 MiB | 00m02s -------------------------------------------------------------------------------- [36/36] Total 100% | 3.4 MiB/s | 70.3 MiB | 00m20s Running transaction [ 1/38] Verify package files 100% | 162.0 B/s | 36.0 B | 00m00s [ 2/38] Prepare transaction 100% | 307.0 B/s | 36.0 B | 00m00s [ 3/38] Installing libgfortran-0:16.2.1 100% | 285.3 MiB/s | 1.7 MiB | 00m00s [ 4/38] Installing python-rpm-macros-0: 100% | 28.2 MiB/s | 28.9 KiB | 00m00s [ 5/38] Installing python3-rpm-macros-0 100% | 0.0 B/s | 6.8 KiB | 00m00s [ 6/38] Installing pyproject-rpm-macros 100% | 167.4 MiB/s | 171.5 KiB | 00m00s [ 7/38] Installing openblas-0:0.3.34-1. 100% | 136.6 MiB/s | 139.9 KiB | 00m00s [ 8/38] Installing openblas-openmp-0:0. 100% | 444.5 MiB/s | 22.2 MiB | 00m00s [ 9/38] Installing flexiblas-netlib-0:3 100% | 228.9 MiB/s | 14.2 MiB | 00m00s [10/38] Installing flexiblas-0:3.5.0-4. 100% | 38.2 MiB/s | 39.2 KiB | 00m00s [11/38] Installing flexiblas-openblas-o 100% | 13.3 MiB/s | 68.1 KiB | 00m00s [12/38] Installing tzdata-0:2026f-1.fc4 100% | 31.7 MiB/s | 1.5 MiB | 00m00s [13/38] Installing python-pip-wheel-0:2 100% | 422.7 MiB/s | 1.3 MiB | 00m00s [14/38] Installing mpdecimal-0:4.0.1-4. 100% | 138.0 MiB/s | 282.7 KiB | 00m00s [15/38] Installing expat-0:2.9.0-1.fc46 100% | 12.7 MiB/s | 391.6 KiB | 00m00s [16/38] Installing python3-libs-0:3.15. 100% | 282.6 MiB/s | 50.3 MiB | 00m00s [17/38] Installing python3-0:3.15.2-1.f 100% | 3.1 MiB/s | 86.5 KiB | 00m00s [18/38] Installing python3-numpy-1:2.5. 100% | 253.5 MiB/s | 38.0 MiB | 00m00s [19/38] Installing python3-numpy-f2py-1 100% | 57.7 MiB/s | 2.2 MiB | 00m00s [20/38] Installing python3-packaging-0: 100% | 217.6 MiB/s | 1.3 MiB | 00m00s [21/38] Installing python3-idna-0:3.20- 100% | 20.6 MiB/s | 527.3 KiB | 00m00s [22/38] Installing python3-urllib3-0:2. 100% | 171.7 MiB/s | 1.2 MiB | 00m00s [23/38] Installing python3-rpm-generato 100% | 81.1 MiB/s | 83.1 KiB | 00m00s [24/38] Installing python3-sortedcontai 100% | 194.4 MiB/s | 398.2 KiB | 00m00s [25/38] Installing python3-iniconfig-0: 100% | 52.7 MiB/s | 54.0 KiB | 00m00s [26/38] Installing python3-pluggy-0:1.7 100% | 49.9 MiB/s | 255.2 KiB | 00m00s [27/38] Installing python3-pygments-0:2 100% | 156.2 MiB/s | 11.7 MiB | 00m00s [28/38] Installing python3-mpmath-0:1.4 100% | 295.6 MiB/s | 4.1 MiB | 00m00s [29/38] Installing python3-platformdirs 100% | 120.2 MiB/s | 369.3 KiB | 00m00s [30/38] Installing python3-charset-norm 100% | 18.3 MiB/s | 487.7 KiB | 00m00s [31/38] Installing python3-requests-0:2 100% | 169.0 MiB/s | 692.0 KiB | 00m00s [32/38] Installing python3-pooch-0:1.9. 100% | 66.0 MiB/s | 675.5 KiB | 00m00s [33/38] Installing python3-scipy-0:1.18 100% | 272.0 MiB/s | 63.9 MiB | 00m00s [34/38] Installing python3-sympy-0:1.14 100% | 247.6 MiB/s | 85.4 MiB | 00m00s [35/38] Installing python3-pytest-0:9.1 100% | 268.6 MiB/s | 24.4 MiB | 00m00s [36/38] Installing python3-hypothesis-0 100% | 123.2 MiB/s | 5.5 MiB | 00m00s [37/38] Installing python3-devel-0:3.15 100% | 70.8 MiB/s | 2.5 MiB | 00m00s [38/38] Installing python3-array-api-st 100% | 13.4 MiB/s | 726.2 KiB | 00m00s Complete! Building target platforms: aarch64 Building for target aarch64 setting SOURCE_DATE_EPOCH=1793923200 Wrote: /builddir/build/SRPMS/python-ipax-0.13.0-1.fc46.src.rpm Updating and loading repositories: fedora 100% | 26.6 KiB/s | 7.6 KiB | 00m00s Copr repository 100% | 5.8 KiB/s | 1.5 KiB | 00m00s Repositories loaded. Package "pyproject-rpm-macros-1.24.0-1.fc46.noarch" is already installed. Package "python3-array-api-strict-2.0.1-10.fc45.noarch" is already installed. Package "python3-devel-3.15.2-1.fc46.aarch64" is already installed. Package "python3-hypothesis-6.151.9-4.fc45.noarch" is already installed. Package "python3-numpy-1:2.5.4-2.fc46.aarch64" is already installed. Package "python3-pytest-9.1.1-1.fc45.noarch" is already installed. Package "python3-scipy-1.18.0-3.fc46.aarch64" is already installed. Package "python3-sympy-1.14.0-18.fc46.noarch" is already installed. Nothing to do. Finish: build setup for python-ipax-0.13.0-1.fc46.src.rpm Start: rpmbuild python-ipax-0.13.0-1.fc46.src.rpm Building target platforms: aarch64 Building for target aarch64 setting SOURCE_DATE_EPOCH=1793923200 Executing(mkbuilddir): /bin/sh -e /var/tmp/rpm-tmp.Hj1wWa Creating(rpmbuild.env): /builddir/build/BUILD/python-ipax-0.13.0-build/rpmbuild.env RPM_SOURCE_DIR="/builddir/build/SOURCES" RPM_BUILD_DIR="/builddir/build/BUILD/python-ipax-0.13.0-build" RPM_OPT_FLAGS="-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wno-complain-wrong-lang -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer" RPM_LD_FLAGS="-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes " RPM_ARCH="aarch64" RPM_OS="linux" RPM_BUILD_NCPUS="4" RPM_SPECPARTS_DIR="/builddir/build/BUILD/python-ipax-0.13.0-build/SPECPARTS" export RPM_SOURCE_DIR RPM_BUILD_DIR RPM_OPT_FLAGS RPM_ARCH RPM_OS RPM_BUILD_NCPUS RPM_SPECPARTS_DIR RPM_LD_FLAGS RPM_DOC_DIR="/usr/share/doc" export RPM_DOC_DIR RPM_PACKAGE_NAME="python-ipax" RPM_PACKAGE_VERSION="0.13.0" RPM_PACKAGE_RELEASE="1.fc46" export RPM_PACKAGE_NAME RPM_PACKAGE_VERSION RPM_PACKAGE_RELEASE LANG=C.UTF-8 export LANG unset CDPATH DISPLAY ||: unset DEBUGINFOD_URLS ||: unset RPM_CONFIG_DIR ||: RPM_BUILD_ROOT="/builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT" export RPM_BUILD_ROOT PKG_CONFIG_PATH="${PKG_CONFIG_PATH}:/usr/lib64/pkgconfig:/usr/share/pkgconfig" export PKG_CONFIG_PATH CONFIG_SITE=${CONFIG_SITE:-NONE} export CONFIG_SITE Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.vhdndL + umask 022 + cd /builddir/build/BUILD/python-ipax-0.13.0-build + cd /builddir/build/BUILD/python-ipax-0.13.0-build + rm -rf ipax-0.13.0 + /usr/bin/rpmuncompress -x /builddir/build/SOURCES/ipax-0.13.0.tar.gz + STATUS=0 + '[' 0 -ne 0 ']' + cd ipax-0.13.0 + /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w . + RPM_EC=0 ++ jobs -p + exit 0 Executing(%generate_buildrequires): /bin/sh -e /var/tmp/rpm-tmp.b9sNhf + umask 022 + cd /builddir/build/BUILD/python-ipax-0.13.0-build + cd ipax-0.13.0 + echo pyproject-rpm-macros + echo python3-devel + echo 'python3dist(packaging)' + echo 'python3dist(pip) >= 19' + '[' -f pyproject.toml ']' + echo '(python3dist(tomli) if python3-devel < 3.11)' + rm -rfv '*.dist-info/' + '[' -f /usr/bin/python3 ']' + mkdir -p /builddir/build/BUILD/python-ipax-0.13.0-build/.pyproject-builddir + echo -n + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + VALAFLAGS=-g + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Cforce-frame-pointers=yes --cap-lints=warn' + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 ' + LT_SYS_LIBRARY_PATH=/usr/lib64: + CC=gcc + CXX=g++ + TMPDIR=/builddir/build/BUILD/python-ipax-0.13.0-build/.pyproject-builddir + RPM_TOXENV=py315 + FEDORA=46 + HOSTNAME=rpmbuild + /usr/bin/python3 -Bs /usr/lib/rpm/redhat/pyproject_buildrequires.py --generate-extras --python3_pkgversion 3 --wheeldir /builddir/build/BUILD/python-ipax-0.13.0-build/pyproject-wheeldir --output /builddir/build/BUILD/python-ipax-0.13.0-build/python-ipax-0.13.0-1.fc46.aarch64-pyproject-buildrequires --dep-overrides-file /builddir/build/BUILD/python-ipax-0.13.0-build/python-ipax-0.13.0-1.fc46.aarch64-pyproject-dep-overrides Handling hatchling>=1.27 from build-system.requires Requirement not satisfied: hatchling>=1.27 Exiting dependency generation pass: build backend + cat /builddir/build/BUILD/python-ipax-0.13.0-build/python-ipax-0.13.0-1.fc46.aarch64-pyproject-buildrequires + rm -rfv '*.dist-info/' + RPM_EC=0 ++ jobs -p + exit 0 Wrote: /builddir/build/SRPMS/python-ipax-0.13.0-1.fc46.buildreqs.nosrc.rpm INFO: Going to install missing dynamic buildrequires Updating and loading repositories: fedora 100% | 41.1 KiB/s | 7.6 KiB | 00m00s Copr repository 100% | 10.9 KiB/s | 1.5 KiB | 00m00s Repositories loaded. Package "pyproject-rpm-macros-1.24.0-1.fc46.noarch" is already installed. Package "python3-array-api-strict-2.0.1-10.fc45.noarch" is already installed. Package "python3-devel-3.15.2-1.fc46.aarch64" is already installed. Package "python3-hypothesis-6.151.9-4.fc45.noarch" is already installed. Package "python3-numpy-1:2.5.4-2.fc46.aarch64" is already installed. Package "python3-pytest-9.1.1-1.fc45.noarch" is already installed. Package "python3-scipy-1.18.0-3.fc46.aarch64" is already installed. Package "python3-sympy-1.14.0-18.fc46.noarch" is already installed. Package "python3-packaging-26.3-1.fc46.noarch" is already installed. Package Arch Version Repository Size Installing: python3-hatchling noarch 0:1.33.0-1.fc46 fedora 704.4 KiB python3-pip noarch 0:26.2.1-1.fc46 fedora 12.3 MiB Installing dependencies: python3-pathspec noarch 0:1.1.1-4.fc45 fedora 421.6 KiB python3-tomlkit noarch 0:0.13.2-10.fc46 fedora 503.4 KiB python3-trove-classifiers noarch 0:2026.9.21.13-1.fc46 fedora 112.7 KiB Transaction Summary: Installing: 5 packages Total size of inbound packages is 3 MiB. Need to download 3 MiB. After this operation, 14 MiB extra will be used (install 14 MiB, remove 0 B). [1/5] python3-pathspec-0:1.1.1-4.fc45.n 100% | 384.8 KiB/s | 112.0 KiB | 00m00s [2/5] python3-hatchling-0:1.33.0-1.fc46 100% | 550.6 KiB/s | 236.8 KiB | 00m00s [3/5] python3-tomlkit-0:0.13.2-10.fc46. 100% | 595.1 KiB/s | 126.8 KiB | 00m00s [4/5] python3-trove-classifiers-0:2026. 100% | 431.1 KiB/s | 34.1 KiB | 00m00s [5/5] python3-pip-0:26.2.1-1.fc46.noarc 100% | 989.6 KiB/s | 2.8 MiB | 00m03s -------------------------------------------------------------------------------- [5/5] Total 100% | 1.1 MiB/s | 3.3 MiB | 00m03s Running transaction [1/7] Verify package files 100% | 454.0 B/s | 5.0 B | 00m00s [2/7] Prepare transaction 100% | 138.0 B/s | 5.0 B | 00m00s [3/7] Installing python3-trove-classifi 100% | 4.7 MiB/s | 116.4 KiB | 00m00s [4/7] Installing python3-tomlkit-0:0.13 100% | 166.8 MiB/s | 512.5 KiB | 00m00s [5/7] Installing python3-pathspec-0:1.1 100% | 72.2 MiB/s | 443.9 KiB | 00m00s [6/7] Installing python3-hatchling-0:1. 100% | 20.4 MiB/s | 753.5 KiB | 00m00s [7/7] Installing python3-pip-0:26.2.1-1 100% | 110.0 MiB/s | 12.5 MiB | 00m00s Complete! Building target platforms: aarch64 Building for target aarch64 setting SOURCE_DATE_EPOCH=1793923200 Executing(%generate_buildrequires): /bin/sh -e /var/tmp/rpm-tmp.t3k1N0 + umask 022 + cd /builddir/build/BUILD/python-ipax-0.13.0-build + cd ipax-0.13.0 + echo pyproject-rpm-macros + echo python3-devel + echo 'python3dist(packaging)' + echo 'python3dist(pip) >= 19' + '[' -f pyproject.toml ']' + echo '(python3dist(tomli) if python3-devel < 3.11)' + rm -rfv '*.dist-info/' + '[' -f /usr/bin/python3 ']' + mkdir -p /builddir/build/BUILD/python-ipax-0.13.0-build/.pyproject-builddir + echo -n + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + VALAFLAGS=-g + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Cforce-frame-pointers=yes --cap-lints=warn' + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 ' + LT_SYS_LIBRARY_PATH=/usr/lib64: + CC=gcc + CXX=g++ + TMPDIR=/builddir/build/BUILD/python-ipax-0.13.0-build/.pyproject-builddir + RPM_TOXENV=py315 + FEDORA=46 + HOSTNAME=rpmbuild + /usr/bin/python3 -Bs /usr/lib/rpm/redhat/pyproject_buildrequires.py --generate-extras --python3_pkgversion 3 --wheeldir /builddir/build/BUILD/python-ipax-0.13.0-build/pyproject-wheeldir --output /builddir/build/BUILD/python-ipax-0.13.0-build/python-ipax-0.13.0-1.fc46.aarch64-pyproject-buildrequires --dep-overrides-file /builddir/build/BUILD/python-ipax-0.13.0-build/python-ipax-0.13.0-1.fc46.aarch64-pyproject-dep-overrides Handling hatchling>=1.27 from build-system.requires Requirement satisfied: hatchling>=1.27 (installed: hatchling 1.33.0) Handling array-api-compat>=1.9 from hook generated metadata: Requires-Dist (ipax) Requirement not satisfied: array-api-compat>=1.9 Handling array-api-extra>=0.6 from hook generated metadata: Requires-Dist (ipax) Requirement not satisfied: array-api-extra>=0.6 Handling asv>=0.6; extra == 'bench' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: asv>=0.6; extra == 'bench' Handling matplotlib>=3.8; extra == 'bench' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: matplotlib>=3.8; extra == 'bench' Handling memray>=1.13; (sys_platform != 'win32') and extra == 'bench' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: memray>=1.13; (sys_platform != 'win32') and extra == 'bench' Handling osqp>=1.0; extra == 'bench' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: osqp>=1.0; extra == 'bench' Handling pytest-benchmark>=4; extra == 'bench' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: pytest-benchmark>=4; extra == 'bench' Handling array-api-strict>=2.1; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: array-api-strict>=2.1; extra == 'dev' Handling asv>=0.6; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: asv>=0.6; extra == 'dev' Handling codespell>=2.3; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: codespell>=2.3; extra == 'dev' Handling feral-solver[scipy]<0.12,>=0.11; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: feral-solver[scipy]<0.12,>=0.11; extra == 'dev' Handling hypothesis>=6.100; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: hypothesis>=6.100; extra == 'dev' Handling matplotlib>=3.8; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: matplotlib>=3.8; extra == 'dev' Handling memray>=1.13; (sys_platform != 'win32') and extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: memray>=1.13; (sys_platform != 'win32') and extra == 'dev' Handling mkdocs-material>=9.5; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: mkdocs-material>=9.5; extra == 'dev' Handling mkdocs>=1.6; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: mkdocs>=1.6; extra == 'dev' Handling mkdocstrings[python]>=0.26; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: mkdocstrings[python]>=0.26; extra == 'dev' Handling mypy>=1.11; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: mypy>=1.11; extra == 'dev' Handling numpy>=1.26; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: numpy>=1.26; extra == 'dev' Handling osqp>=1.0; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: osqp>=1.0; extra == 'dev' Handling pre-commit>=3.7; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: pre-commit>=3.7; extra == 'dev' Handling pytest-benchmark>=4; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: pytest-benchmark>=4; extra == 'dev' Handling pytest-cov>=5; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: pytest-cov>=5; extra == 'dev' Handling pytest-xdist>=3.6; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: pytest-xdist>=3.6; extra == 'dev' Handling pytest>=8; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: pytest>=8; extra == 'dev' Handling ruff>=0.16.2; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: ruff>=0.16.2; extra == 'dev' Handling scipy>=1.12; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: scipy>=1.12; extra == 'dev' Handling sympy>=1.13; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: sympy>=1.13; extra == 'dev' Handling torch>=2.2; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: torch>=2.2; extra == 'dev' Handling mkdocs-material>=9.5; extra == 'docs' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: mkdocs-material>=9.5; extra == 'docs' Handling mkdocs>=1.6; extra == 'docs' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: mkdocs>=1.6; extra == 'docs' Handling mkdocstrings[python]>=0.26; extra == 'docs' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: mkdocstrings[python]>=0.26; extra == 'docs' Handling jax>=0.4.28; extra == 'jax' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: jax>=0.4.28; extra == 'jax' Handling jaxlib>=0.4.28; extra == 'jax' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: jaxlib>=0.4.28; extra == 'jax' Handling codespell>=2.3; extra == 'lint' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: codespell>=2.3; extra == 'lint' Handling mypy>=1.11; extra == 'lint' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: mypy>=1.11; extra == 'lint' Handling pre-commit>=3.7; extra == 'lint' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: pre-commit>=3.7; extra == 'lint' Handling ruff>=0.16.2; extra == 'lint' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: ruff>=0.16.2; extra == 'lint' Handling numpy>=1.26; extra == 'numpy' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: numpy>=1.26; extra == 'numpy' Handling numpy>=1.26; extra == 'scipy' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: numpy>=1.26; extra == 'scipy' Handling scipy>=1.12; extra == 'scipy' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: scipy>=1.12; extra == 'scipy' Handling feral-solver[scipy]<0.12,>=0.11; extra == 'sparse' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: feral-solver[scipy]<0.12,>=0.11; extra == 'sparse' Handling nvmath-python; (platform_system != 'Darwin') and extra == 'sparse' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: nvmath-python; (platform_system != 'Darwin') and extra == 'sparse' Handling scipy>=1.12; extra == 'sparse' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: scipy>=1.12; extra == 'sparse' Handling feral-solver[scipy]<0.12,>=0.11; extra == 'sparse-cpu' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: feral-solver[scipy]<0.12,>=0.11; extra == 'sparse-cpu' Handling scipy>=1.12; extra == 'sparse-cpu' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: scipy>=1.12; extra == 'sparse-cpu' Handling nvmath-python; (platform_system != 'Darwin') and extra == 'sparse-cuda' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: nvmath-python; (platform_system != 'Darwin') and extra == 'sparse-cuda' Handling array-api-strict>=2.1; extra == 'strict' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: array-api-strict>=2.1; extra == 'strict' Handling hypothesis>=6.100; extra == 'test' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: hypothesis>=6.100; extra == 'test' Handling pytest-cov>=5; extra == 'test' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: pytest-cov>=5; extra == 'test' Handling pytest-xdist>=3.6; extra == 'test' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: pytest-xdist>=3.6; extra == 'test' Handling pytest>=8; extra == 'test' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: pytest>=8; extra == 'test' Handling sympy>=1.13; extra == 'test' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: sympy>=1.13; extra == 'test' Handling torch>=2.2; extra == 'torch' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: torch>=2.2; extra == 'torch' Handling numba>=0.60; extra == 'trots' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: numba>=0.60; extra == 'trots' + cat /builddir/build/BUILD/python-ipax-0.13.0-build/python-ipax-0.13.0-1.fc46.aarch64-pyproject-buildrequires + rm -rfv ipax-0.13.0.dist-info/ removed 'ipax-0.13.0.dist-info/METADATA' removed directory 'ipax-0.13.0.dist-info/' + RPM_EC=0 ++ jobs -p + exit 0 Wrote: /builddir/build/SRPMS/python-ipax-0.13.0-1.fc46.buildreqs.nosrc.rpm INFO: Going to install missing dynamic buildrequires Updating and loading repositories: fedora 100% | 54.7 KiB/s | 7.6 KiB | 00m00s Copr repository 100% | 18.1 KiB/s | 1.5 KiB | 00m00s Repositories loaded. Package "pyproject-rpm-macros-1.24.0-1.fc46.noarch" is already installed. Package "python3-array-api-strict-2.0.1-10.fc45.noarch" is already installed. Package "python3-devel-3.15.2-1.fc46.aarch64" is already installed. Package "python3-hypothesis-6.151.9-4.fc45.noarch" is already installed. Package "python3-numpy-1:2.5.4-2.fc46.aarch64" is already installed. Package "python3-pytest-9.1.1-1.fc45.noarch" is already installed. Package "python3-scipy-1.18.0-3.fc46.aarch64" is already installed. Package "python3-sympy-1.14.0-18.fc46.noarch" is already installed. Package "python3-hatchling-1.33.0-1.fc46.noarch" is already installed. Package "python3-packaging-26.3-1.fc46.noarch" is already installed. Package "python3-pip-26.2.1-1.fc46.noarch" is already installed. Package Arch Version Repository Size Installing: python3-array-api-compat noarch 0:1.15.0-1.fc46 copr_base 513.2 KiB python3-array-api-extra noarch 0:0.11.5-1.fc46 copr_base 1.4 MiB Transaction Summary: Installing: 2 packages Total size of inbound packages is 396 KiB. Need to download 396 KiB. After this operation, 2 MiB extra will be used (install 2 MiB, remove 0 B). [1/2] python3-array-api-compat-0:1.15.0 100% | 946.5 KiB/s | 124.0 KiB | 00m00s [2/2] python3-array-api-extra-0:0.11.5- 100% | 1.0 MiB/s | 272.2 KiB | 00m00s -------------------------------------------------------------------------------- [2/2] Total 100% | 1.4 MiB/s | 396.2 KiB | 00m00s Running transaction [1/4] Verify package files 100% | 2.0 KiB/s | 2.0 B | 00m00s [2/4] Prepare transaction 100% | 105.0 B/s | 2.0 B | 00m00s [3/4] Installing python3-array-api-comp 100% | 87.2 MiB/s | 536.0 KiB | 00m00s [4/4] Installing python3-array-api-extr 100% | 60.3 MiB/s | 1.4 MiB | 00m00s Warning: skipped OpenPGP checks for 2 packages from repository: copr_base Complete! Building target platforms: aarch64 Building for target aarch64 setting SOURCE_DATE_EPOCH=1793923200 Executing(%generate_buildrequires): /bin/sh -e /var/tmp/rpm-tmp.7G5Asv + umask 022 + cd /builddir/build/BUILD/python-ipax-0.13.0-build + cd ipax-0.13.0 + echo pyproject-rpm-macros + echo python3-devel + echo 'python3dist(packaging)' + echo 'python3dist(pip) >= 19' + '[' -f pyproject.toml ']' + echo '(python3dist(tomli) if python3-devel < 3.11)' + rm -rfv '*.dist-info/' + '[' -f /usr/bin/python3 ']' + mkdir -p /builddir/build/BUILD/python-ipax-0.13.0-build/.pyproject-builddir + echo -n + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + VALAFLAGS=-g + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Cforce-frame-pointers=yes --cap-lints=warn' + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 ' + LT_SYS_LIBRARY_PATH=/usr/lib64: + CC=gcc + CXX=g++ + TMPDIR=/builddir/build/BUILD/python-ipax-0.13.0-build/.pyproject-builddir + RPM_TOXENV=py315 + FEDORA=46 + HOSTNAME=rpmbuild + /usr/bin/python3 -Bs /usr/lib/rpm/redhat/pyproject_buildrequires.py --generate-extras --python3_pkgversion 3 --wheeldir /builddir/build/BUILD/python-ipax-0.13.0-build/pyproject-wheeldir --output /builddir/build/BUILD/python-ipax-0.13.0-build/python-ipax-0.13.0-1.fc46.aarch64-pyproject-buildrequires --dep-overrides-file /builddir/build/BUILD/python-ipax-0.13.0-build/python-ipax-0.13.0-1.fc46.aarch64-pyproject-dep-overrides Handling hatchling>=1.27 from build-system.requires Requirement satisfied: hatchling>=1.27 (installed: hatchling 1.33.0) Handling array-api-compat>=1.9 from hook generated metadata: Requires-Dist (ipax) Requirement satisfied: array-api-compat>=1.9 (installed: array-api-compat 1.15.0) Handling array-api-extra>=0.6 from hook generated metadata: Requires-Dist (ipax) Requirement satisfied: array-api-extra>=0.6 (installed: array-api-extra 0.11.5) Handling asv>=0.6; extra == 'bench' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: asv>=0.6; extra == 'bench' Handling matplotlib>=3.8; extra == 'bench' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: matplotlib>=3.8; extra == 'bench' Handling memray>=1.13; (sys_platform != 'win32') and extra == 'bench' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: memray>=1.13; (sys_platform != 'win32') and extra == 'bench' Handling osqp>=1.0; extra == 'bench' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: osqp>=1.0; extra == 'bench' Handling pytest-benchmark>=4; extra == 'bench' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: pytest-benchmark>=4; extra == 'bench' Handling array-api-strict>=2.1; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: array-api-strict>=2.1; extra == 'dev' Handling asv>=0.6; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: asv>=0.6; extra == 'dev' Handling codespell>=2.3; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: codespell>=2.3; extra == 'dev' Handling feral-solver[scipy]<0.12,>=0.11; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: feral-solver[scipy]<0.12,>=0.11; extra == 'dev' Handling hypothesis>=6.100; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: hypothesis>=6.100; extra == 'dev' Handling matplotlib>=3.8; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: matplotlib>=3.8; extra == 'dev' Handling memray>=1.13; (sys_platform != 'win32') and extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: memray>=1.13; (sys_platform != 'win32') and extra == 'dev' Handling mkdocs-material>=9.5; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: mkdocs-material>=9.5; extra == 'dev' Handling mkdocs>=1.6; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: mkdocs>=1.6; extra == 'dev' Handling mkdocstrings[python]>=0.26; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: mkdocstrings[python]>=0.26; extra == 'dev' Handling mypy>=1.11; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: mypy>=1.11; extra == 'dev' Handling numpy>=1.26; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: numpy>=1.26; extra == 'dev' Handling osqp>=1.0; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: osqp>=1.0; extra == 'dev' Handling pre-commit>=3.7; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: pre-commit>=3.7; extra == 'dev' Handling pytest-benchmark>=4; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: pytest-benchmark>=4; extra == 'dev' Handling pytest-cov>=5; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: pytest-cov>=5; extra == 'dev' Handling pytest-xdist>=3.6; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: pytest-xdist>=3.6; extra == 'dev' Handling pytest>=8; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: pytest>=8; extra == 'dev' Handling ruff>=0.16.2; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: ruff>=0.16.2; extra == 'dev' Handling scipy>=1.12; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: scipy>=1.12; extra == 'dev' Handling sympy>=1.13; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: sympy>=1.13; extra == 'dev' Handling torch>=2.2; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: torch>=2.2; extra == 'dev' Handling mkdocs-material>=9.5; extra == 'docs' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: mkdocs-material>=9.5; extra == 'docs' Handling mkdocs>=1.6; extra == 'docs' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: mkdocs>=1.6; extra == 'docs' Handling mkdocstrings[python]>=0.26; extra == 'docs' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: mkdocstrings[python]>=0.26; extra == 'docs' Handling jax>=0.4.28; extra == 'jax' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: jax>=0.4.28; extra == 'jax' Handling jaxlib>=0.4.28; extra == 'jax' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: jaxlib>=0.4.28; extra == 'jax' Handling codespell>=2.3; extra == 'lint' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: codespell>=2.3; extra == 'lint' Handling mypy>=1.11; extra == 'lint' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: mypy>=1.11; extra == 'lint' Handling pre-commit>=3.7; extra == 'lint' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: pre-commit>=3.7; extra == 'lint' Handling ruff>=0.16.2; extra == 'lint' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: ruff>=0.16.2; extra == 'lint' Handling numpy>=1.26; extra == 'numpy' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: numpy>=1.26; extra == 'numpy' Handling numpy>=1.26; extra == 'scipy' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: numpy>=1.26; extra == 'scipy' Handling scipy>=1.12; extra == 'scipy' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: scipy>=1.12; extra == 'scipy' Handling feral-solver[scipy]<0.12,>=0.11; extra == 'sparse' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: feral-solver[scipy]<0.12,>=0.11; extra == 'sparse' Handling nvmath-python; (platform_system != 'Darwin') and extra == 'sparse' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: nvmath-python; (platform_system != 'Darwin') and extra == 'sparse' Handling scipy>=1.12; extra == 'sparse' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: scipy>=1.12; extra == 'sparse' Handling feral-solver[scipy]<0.12,>=0.11; extra == 'sparse-cpu' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: feral-solver[scipy]<0.12,>=0.11; extra == 'sparse-cpu' Handling scipy>=1.12; extra == 'sparse-cpu' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: scipy>=1.12; extra == 'sparse-cpu' Handling nvmath-python; (platform_system != 'Darwin') and extra == 'sparse-cuda' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: nvmath-python; (platform_system != 'Darwin') and extra == 'sparse-cuda' Handling array-api-strict>=2.1; extra == 'strict' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: array-api-strict>=2.1; extra == 'strict' Handling hypothesis>=6.100; extra == 'test' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: hypothesis>=6.100; extra == 'test' Handling pytest-cov>=5; extra == 'test' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: pytest-cov>=5; extra == 'test' Handling pytest-xdist>=3.6; extra == 'test' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: pytest-xdist>=3.6; extra == 'test' Handling pytest>=8; extra == 'test' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: pytest>=8; extra == 'test' Handling sympy>=1.13; extra == 'test' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: sympy>=1.13; extra == 'test' Handling torch>=2.2; extra == 'torch' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: torch>=2.2; extra == 'torch' Handling numba>=0.60; extra == 'trots' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: numba>=0.60; extra == 'trots' + cat /builddir/build/BUILD/python-ipax-0.13.0-build/python-ipax-0.13.0-1.fc46.aarch64-pyproject-buildrequires + rm -rfv ipax-0.13.0.dist-info/ removed 'ipax-0.13.0.dist-info/METADATA' removed directory 'ipax-0.13.0.dist-info/' + RPM_EC=0 ++ jobs -p + exit 0 Wrote: /builddir/build/SRPMS/python-ipax-0.13.0-1.fc46.buildreqs.nosrc.rpm INFO: Going to install missing dynamic buildrequires Updating and loading repositories: fedora 100% | 51.0 KiB/s | 7.6 KiB | 00m00s Copr repository 100% | 14.8 KiB/s | 1.5 KiB | 00m00s Repositories loaded. Package "pyproject-rpm-macros-1.24.0-1.fc46.noarch" is already installed. Package "python3-array-api-strict-2.0.1-10.fc45.noarch" is already installed. Package "python3-devel-3.15.2-1.fc46.aarch64" is already installed. Package "python3-hypothesis-6.151.9-4.fc45.noarch" is already installed. Package "python3-numpy-1:2.5.4-2.fc46.aarch64" is already installed. Package "python3-pytest-9.1.1-1.fc45.noarch" is already installed. Package "python3-scipy-1.18.0-3.fc46.aarch64" is already installed. Package "python3-sympy-1.14.0-18.fc46.noarch" is already installed. Package "python3-array-api-compat-1.15.0-1.fc46.noarch" is already installed. Package "python3-array-api-extra-0.11.5-1.fc46.noarch" is already installed. Package "python3-hatchling-1.33.0-1.fc46.noarch" is already installed. Package "python3-packaging-26.3-1.fc46.noarch" is already installed. Package "python3-pip-26.2.1-1.fc46.noarch" is already installed. Nothing to do. Building target platforms: aarch64 Building for target aarch64 setting SOURCE_DATE_EPOCH=1793923200 Executing(%generate_buildrequires): /bin/sh -e /var/tmp/rpm-tmp.YqZhFE + umask 022 + cd /builddir/build/BUILD/python-ipax-0.13.0-build + cd ipax-0.13.0 + echo pyproject-rpm-macros + echo python3-devel + echo 'python3dist(packaging)' + echo 'python3dist(pip) >= 19' + '[' -f pyproject.toml ']' + echo '(python3dist(tomli) if python3-devel < 3.11)' + rm -rfv '*.dist-info/' + '[' -f /usr/bin/python3 ']' + mkdir -p /builddir/build/BUILD/python-ipax-0.13.0-build/.pyproject-builddir + echo -n + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + VALAFLAGS=-g + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Cforce-frame-pointers=yes --cap-lints=warn' + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 ' + LT_SYS_LIBRARY_PATH=/usr/lib64: + CC=gcc + CXX=g++ + TMPDIR=/builddir/build/BUILD/python-ipax-0.13.0-build/.pyproject-builddir + RPM_TOXENV=py315 + FEDORA=46 + HOSTNAME=rpmbuild + /usr/bin/python3 -Bs /usr/lib/rpm/redhat/pyproject_buildrequires.py --generate-extras --python3_pkgversion 3 --wheeldir /builddir/build/BUILD/python-ipax-0.13.0-build/pyproject-wheeldir --output /builddir/build/BUILD/python-ipax-0.13.0-build/python-ipax-0.13.0-1.fc46.aarch64-pyproject-buildrequires --dep-overrides-file /builddir/build/BUILD/python-ipax-0.13.0-build/python-ipax-0.13.0-1.fc46.aarch64-pyproject-dep-overrides Handling hatchling>=1.27 from build-system.requires Requirement satisfied: hatchling>=1.27 (installed: hatchling 1.33.0) Handling array-api-compat>=1.9 from hook generated metadata: Requires-Dist (ipax) Requirement satisfied: array-api-compat>=1.9 (installed: array-api-compat 1.15.0) Handling array-api-extra>=0.6 from hook generated metadata: Requires-Dist (ipax) Requirement satisfied: array-api-extra>=0.6 (installed: array-api-extra 0.11.5) Handling asv>=0.6; extra == 'bench' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: asv>=0.6; extra == 'bench' Handling matplotlib>=3.8; extra == 'bench' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: matplotlib>=3.8; extra == 'bench' Handling memray>=1.13; (sys_platform != 'win32') and extra == 'bench' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: memray>=1.13; (sys_platform != 'win32') and extra == 'bench' Handling osqp>=1.0; extra == 'bench' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: osqp>=1.0; extra == 'bench' Handling pytest-benchmark>=4; extra == 'bench' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: pytest-benchmark>=4; extra == 'bench' Handling array-api-strict>=2.1; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: array-api-strict>=2.1; extra == 'dev' Handling asv>=0.6; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: asv>=0.6; extra == 'dev' Handling codespell>=2.3; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: codespell>=2.3; extra == 'dev' Handling feral-solver[scipy]<0.12,>=0.11; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: feral-solver[scipy]<0.12,>=0.11; extra == 'dev' Handling hypothesis>=6.100; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: hypothesis>=6.100; extra == 'dev' Handling matplotlib>=3.8; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: matplotlib>=3.8; extra == 'dev' Handling memray>=1.13; (sys_platform != 'win32') and extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: memray>=1.13; (sys_platform != 'win32') and extra == 'dev' Handling mkdocs-material>=9.5; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: mkdocs-material>=9.5; extra == 'dev' Handling mkdocs>=1.6; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: mkdocs>=1.6; extra == 'dev' Handling mkdocstrings[python]>=0.26; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: mkdocstrings[python]>=0.26; extra == 'dev' Handling mypy>=1.11; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: mypy>=1.11; extra == 'dev' Handling numpy>=1.26; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: numpy>=1.26; extra == 'dev' Handling osqp>=1.0; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: osqp>=1.0; extra == 'dev' Handling pre-commit>=3.7; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: pre-commit>=3.7; extra == 'dev' Handling pytest-benchmark>=4; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: pytest-benchmark>=4; extra == 'dev' Handling pytest-cov>=5; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: pytest-cov>=5; extra == 'dev' Handling pytest-xdist>=3.6; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: pytest-xdist>=3.6; extra == 'dev' Handling pytest>=8; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: pytest>=8; extra == 'dev' Handling ruff>=0.16.2; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: ruff>=0.16.2; extra == 'dev' Handling scipy>=1.12; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: scipy>=1.12; extra == 'dev' Handling sympy>=1.13; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: sympy>=1.13; extra == 'dev' Handling torch>=2.2; extra == 'dev' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: torch>=2.2; extra == 'dev' Handling mkdocs-material>=9.5; extra == 'docs' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: mkdocs-material>=9.5; extra == 'docs' Handling mkdocs>=1.6; extra == 'docs' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: mkdocs>=1.6; extra == 'docs' Handling mkdocstrings[python]>=0.26; extra == 'docs' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: mkdocstrings[python]>=0.26; extra == 'docs' Handling jax>=0.4.28; extra == 'jax' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: jax>=0.4.28; extra == 'jax' Handling jaxlib>=0.4.28; extra == 'jax' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: jaxlib>=0.4.28; extra == 'jax' Handling codespell>=2.3; extra == 'lint' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: codespell>=2.3; extra == 'lint' Handling mypy>=1.11; extra == 'lint' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: mypy>=1.11; extra == 'lint' Handling pre-commit>=3.7; extra == 'lint' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: pre-commit>=3.7; extra == 'lint' Handling ruff>=0.16.2; extra == 'lint' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: ruff>=0.16.2; extra == 'lint' Handling numpy>=1.26; extra == 'numpy' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: numpy>=1.26; extra == 'numpy' Handling numpy>=1.26; extra == 'scipy' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: numpy>=1.26; extra == 'scipy' Handling scipy>=1.12; extra == 'scipy' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: scipy>=1.12; extra == 'scipy' Handling feral-solver[scipy]<0.12,>=0.11; extra == 'sparse' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: feral-solver[scipy]<0.12,>=0.11; extra == 'sparse' Handling nvmath-python; (platform_system != 'Darwin') and extra == 'sparse' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: nvmath-python; (platform_system != 'Darwin') and extra == 'sparse' Handling scipy>=1.12; extra == 'sparse' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: scipy>=1.12; extra == 'sparse' Handling feral-solver[scipy]<0.12,>=0.11; extra == 'sparse-cpu' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: feral-solver[scipy]<0.12,>=0.11; extra == 'sparse-cpu' Handling scipy>=1.12; extra == 'sparse-cpu' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: scipy>=1.12; extra == 'sparse-cpu' Handling nvmath-python; (platform_system != 'Darwin') and extra == 'sparse-cuda' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: nvmath-python; (platform_system != 'Darwin') and extra == 'sparse-cuda' Handling array-api-strict>=2.1; extra == 'strict' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: array-api-strict>=2.1; extra == 'strict' Handling hypothesis>=6.100; extra == 'test' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: hypothesis>=6.100; extra == 'test' Handling pytest-cov>=5; extra == 'test' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: pytest-cov>=5; extra == 'test' Handling pytest-xdist>=3.6; extra == 'test' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: pytest-xdist>=3.6; extra == 'test' Handling pytest>=8; extra == 'test' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: pytest>=8; extra == 'test' Handling sympy>=1.13; extra == 'test' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: sympy>=1.13; extra == 'test' Handling torch>=2.2; extra == 'torch' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: torch>=2.2; extra == 'torch' Handling numba>=0.60; extra == 'trots' from hook generated metadata: Requires-Dist (ipax) Ignoring alien requirement: numba>=0.60; extra == 'trots' + cat /builddir/build/BUILD/python-ipax-0.13.0-build/python-ipax-0.13.0-1.fc46.aarch64-pyproject-buildrequires + rm -rfv ipax-0.13.0.dist-info/ removed 'ipax-0.13.0.dist-info/METADATA' removed directory 'ipax-0.13.0.dist-info/' + RPM_EC=0 ++ jobs -p + exit 0 Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.JvCF5E + umask 022 + cd /builddir/build/BUILD/python-ipax-0.13.0-build + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + export CFLAGS + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + export CXXFLAGS + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + export FFLAGS + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + export FCFLAGS + VALAFLAGS=-g + export VALAFLAGS + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Cforce-frame-pointers=yes -Clink-arg=-specs=/usr/lib/rpm/redhat/redhat-package-notes --cap-lints=warn' + export RUSTFLAGS + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes ' + export LDFLAGS + LT_SYS_LIBRARY_PATH=/usr/lib64: + export LT_SYS_LIBRARY_PATH + CC=gcc + export CC + CXX=g++ + export CXX + cd ipax-0.13.0 + mkdir -p /builddir/build/BUILD/python-ipax-0.13.0-build/.pyproject-builddir + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + VALAFLAGS=-g + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Cforce-frame-pointers=yes -Clink-arg=-specs=/usr/lib/rpm/redhat/redhat-package-notes --cap-lints=warn' + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes ' + LT_SYS_LIBRARY_PATH=/usr/lib64: + CC=gcc + CXX=g++ + TMPDIR=/builddir/build/BUILD/python-ipax-0.13.0-build/.pyproject-builddir + /usr/bin/python3 -Bs /usr/lib/rpm/redhat/pyproject_wheel.py /builddir/build/BUILD/python-ipax-0.13.0-build/pyproject-wheeldir Processing ./. Preparing metadata (pyproject.toml): started Running command Preparing metadata (pyproject.toml) Preparing metadata (pyproject.toml): finished with status 'done' Building wheels for collected packages: ipax Building wheel for ipax (pyproject.toml): started Running command Building wheel for ipax (pyproject.toml) Building wheel for ipax (pyproject.toml): finished with status 'done' Created wheel for ipax: filename=ipax-0.13.0-py3-none-any.whl size=356589 sha256=d704fe044c1508e2d9a369ea9fda8a55e099cbc5999fe9cb2dd5fc70bc46c30d Stored in directory: /builddir/build/BUILD/python-ipax-0.13.0-build/.pyproject-builddir/pip-ephem-wheel-cache-oqqfzt8_/wheels/23/d0/3d/9b04337e91ced3c27af6c5b6202ddcecdbd6f56af8a1ba0ce5 Successfully built ipax + RPM_EC=0 ++ jobs -p + exit 0 Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.fF2zHp + umask 022 + cd /builddir/build/BUILD/python-ipax-0.13.0-build + '[' /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT '!=' / ']' + rm -rf /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT ++ dirname /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT + mkdir -p /builddir/build/BUILD/python-ipax-0.13.0-build + mkdir /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + export CFLAGS + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + export CXXFLAGS + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + export FFLAGS + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + export FCFLAGS + VALAFLAGS=-g + export VALAFLAGS + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Cforce-frame-pointers=yes -Clink-arg=-specs=/usr/lib/rpm/redhat/redhat-package-notes --cap-lints=warn' + export RUSTFLAGS + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes ' + export LDFLAGS + LT_SYS_LIBRARY_PATH=/usr/lib64: + export LT_SYS_LIBRARY_PATH + CC=gcc + export CC + CXX=g++ + export CXX + cd ipax-0.13.0 ++ ls /builddir/build/BUILD/python-ipax-0.13.0-build/pyproject-wheeldir/ipax-0.13.0-py3-none-any.whl ++ xargs basename --multiple ++ sed -E 's/([^-]+)-([^-]+)-.+\.whl/\1==\2/' + specifier=ipax==0.13.0 + '[' -z ipax==0.13.0 ']' + PIP_CONFIG_FILE=/dev/null + TMPDIR=/builddir/build/BUILD/python-ipax-0.13.0-build/.pyproject-builddir + /usr/bin/python3 -m pip install --root /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT --prefix /usr --no-deps --disable-pip-version-check --progress-bar off --verbose --ignore-installed --no-warn-script-location --no-index --no-cache-dir --find-links /builddir/build/BUILD/python-ipax-0.13.0-build/pyproject-wheeldir ipax==0.13.0 Using pip 26.2.1 from /usr/lib/python3.15/site-packages/pip (python 3.15) Looking in links: /builddir/build/BUILD/python-ipax-0.13.0-build/pyproject-wheeldir Processing /builddir/build/BUILD/python-ipax-0.13.0-build/pyproject-wheeldir/ipax-0.13.0-py3-none-any.whl Installing collected packages: ipax Successfully installed ipax-0.13.0 + '[' -d /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/bin ']' + rm -f /builddir/build/BUILD/python-ipax-0.13.0-build/python-ipax-0.13.0-1.fc46.aarch64-pyproject-ghost-distinfo + site_dirs=() + '[' -d /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages ']' + site_dirs+=("/usr/lib/python3.15/site-packages") + '[' /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib64/python3.15/site-packages '!=' /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages ']' + '[' -d /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib64/python3.15/site-packages ']' + for site_dir in ${site_dirs[@]} + for distinfo in /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT$site_dir/*.dist-info + echo '%ghost %dir /usr/lib/python3.15/site-packages/ipax-0.13.0.dist-info' +++ basename /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax-0.13.0.dist-info ++ PYTHONPATH=/usr/lib/rpm/redhat ++ /usr/bin/python3 -sBc 'import sys; from pyproject_save_files import canonical_name_from_distinfo; print(canonical_name_from_distinfo(sys.argv[1]))' ipax-0.13.0.dist-info + _normalized=ipax + echo '%ghost %dir /usr/lib/python3.15/site-packages/ipax-0.13.0.dist-info' + sed -i s/pip/rpm/ /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax-0.13.0.dist-info/INSTALLER + PYTHONPATH=/usr/lib/rpm/redhat + /usr/bin/python3 -B /usr/lib/rpm/redhat/pyproject_preprocess_record.py --buildroot /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT --record /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax-0.13.0.dist-info/RECORD --output /builddir/build/BUILD/python-ipax-0.13.0-build/python-ipax-0.13.0-1.fc46.aarch64-pyproject-record + rm -fv /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax-0.13.0.dist-info/RECORD removed '/builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax-0.13.0.dist-info/RECORD' + rm -fv /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax-0.13.0.dist-info/REQUESTED removed '/builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax-0.13.0.dist-info/REQUESTED' + '[' -f /builddir/build/BUILD/python-ipax-0.13.0-build/python-ipax-0.13.0-1.fc46.aarch64-pyproject-dep-overrides ']' ++ wc -l /builddir/build/BUILD/python-ipax-0.13.0-build/python-ipax-0.13.0-1.fc46.aarch64-pyproject-ghost-distinfo ++ cut -f1 '-d ' + lines=1 + '[' 1 -ne 1 ']' + RPM_FILES_ESCAPE=4.19 + /usr/bin/python3 /usr/lib/rpm/redhat/pyproject_save_files.py --output-files /builddir/build/BUILD/python-ipax-0.13.0-build/python-ipax-0.13.0-1.fc46.aarch64-pyproject-files --output-modules /builddir/build/BUILD/python-ipax-0.13.0-build/python-ipax-0.13.0-1.fc46.aarch64-pyproject-modules --buildroot /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT --sitelib /usr/lib/python3.15/site-packages --sitearch /usr/lib64/python3.15/site-packages --python-version 3.15 --pyproject-record /builddir/build/BUILD/python-ipax-0.13.0-build/python-ipax-0.13.0-1.fc46.aarch64-pyproject-record --prefix /usr ipax + /usr/lib/rpm/check-buildroot + /usr/lib/rpm/redhat/brp-ldconfig + COMPRESS='gzip -9 -n' + COMPRESS_EXT=.gz + /usr/lib/rpm/brp-compress + /usr/lib/rpm/brp-strip /usr/bin/strip + /usr/lib/rpm/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump + /usr/lib/rpm/redhat/brp-strip-lto /usr/bin/strip + /usr/lib/rpm/check-rpaths + /usr/lib/rpm/redhat/brp-mangle-shebangs + /usr/lib/rpm/brp-remove-la-files + /usr/lib/rpm/redhat/brp-python-rpm-in-distinfo + env /usr/lib/rpm/redhat/brp-python-bytecompile '' 1 0 -j4 Bytecompiling .py files below /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15 using python3.15 + /usr/lib/rpm/redhat/brp-python-hardlink + /usr/bin/add-det --brp -j4 /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/__pycache__/typing.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/__pycache__/result.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/__pycache__/__init__.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/__pycache__/_logging.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/testing/__pycache__/__init__.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/__pycache__/solve.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/testing/__pycache__/backends.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/__pycache__/options.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/problem/__pycache__/scaling.cpython-315.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/problem/__pycache__/scaling.cpython-315.pyc: replacing with normalized version /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/problem/__pycache__/linear_ineq.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/problem/__pycache__/function.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/problem/__pycache__/base.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/problem/__pycache__/__init__.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/problem/__pycache__/finitediff.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/problem/autodiff/__pycache__/torch.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/problem/autodiff/__pycache__/__init__.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/problem/autodiff/__pycache__/jax.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/linalg/__pycache__/regularize.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/problem/__pycache__/derivatives.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/linalg/__pycache__/solver.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/linalg/__pycache__/sparse.cpython-315.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/linalg/__pycache__/krylov.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/linalg/__pycache__/dense.cpython-315.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/linalg/__pycache__/__init__.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/testing/__pycache__/problems.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/linalg/__pycache__/sparse.cpython-315.pyc: replacing with normalized version /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/linalg/__pycache__/dense.cpython-315.pyc: replacing with normalized version /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/ipm/__pycache__/kkt.cpython-315.pyc: replacing with normalized version /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/ipm/__pycache__/kkt.cpython-315.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/ipm/__pycache__/termination.cpython-315.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/ipm/__pycache__/termination.cpython-315.pyc: replacing with normalized version /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/ipm/__pycache__/step.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/ipm/__pycache__/init.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/ipm/__pycache__/restoration.cpython-315.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/ipm/__pycache__/restoration.cpython-315.pyc: replacing with normalized version /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/ipm/__pycache__/hessian.cpython-315.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/ipm/__pycache__/hessian.cpython-315.pyc: replacing with normalized version /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/ipm/__pycache__/driver.cpython-315.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/ipm/__pycache__/__init__.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/ipm/__pycache__/filter_ls.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/ipm/__pycache__/breedveld_ls.cpython-315.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/ipm/__pycache__/breedveld_ls.cpython-315.pyc: replacing with normalized version /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/ipm/__pycache__/barrier.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/ipm/__pycache__/corrections.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/interfaces/__pycache__/__init__.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/ipm/__pycache__/driver.cpython-315.pyc: replacing with normalized version /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/interfaces/__pycache__/scipy.cpython-315.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/backend/__pycache__/errors.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/backend/__pycache__/namespace.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/interfaces/__pycache__/scipy.cpython-315.pyc: replacing with normalized version /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/backend/__pycache__/__init__.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/backend/sparse/__pycache__/numpy_scipy.cpython-315.pyc: replacing with normalized version /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/backend/sparse/__pycache__/jax.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/backend/sparse/__pycache__/_canonical.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/backend/__pycache__/operators.cpython-315.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/backend/sparse/__pycache__/numpy_scipy.cpython-315.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/backend/sparse/__pycache__/__init__.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/backend/sparse/__pycache__/_routing.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/backend/sparse/__pycache__/torch.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/backend/dense/__pycache__/torch.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/backend/__pycache__/operators.cpython-315.pyc: replacing with normalized version /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/backend/dense/__pycache__/numpy_scipy.cpython-315.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/backend/dense/__pycache__/numpy_scipy.cpython-315.pyc: replacing with normalized version /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/backend/dense/__pycache__/__init__.cpython-315.opt-1.pyc: rewriting with normalized contents /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/backend/dense/__pycache__/cupy.cpython-315.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/backend/dense/__pycache__/cupy.cpython-315.pyc: replacing with normalized version /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/backend/sparse/__pycache__/cupy.cpython-315.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages/ipax/backend/sparse/__pycache__/cupy.cpython-315.pyc: replacing with normalized version Scanned 27 directories and 168 files, processed 69 inodes, 69 modified (30 replaced + 39 rewritten), 0 unsupported format, 0 errors + /usr/bin/linkdupes --brp /builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr Scanned 26 directories and 168 files, considered 168 files, read 0 files, linked 0 files, 0 errors sum of sizes of linked files: 0 bytes Executing(%check): /bin/sh -e /var/tmp/rpm-tmp.eYPUln + umask 022 + cd /builddir/build/BUILD/python-ipax-0.13.0-build + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + export CFLAGS + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + export CXXFLAGS + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + export FFLAGS + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules ' + export FCFLAGS + VALAFLAGS=-g + export VALAFLAGS + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Cforce-frame-pointers=yes -Clink-arg=-specs=/usr/lib/rpm/redhat/redhat-package-notes --cap-lints=warn' + export RUSTFLAGS + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes ' + export LDFLAGS + LT_SYS_LIBRARY_PATH=/usr/lib64: + export LT_SYS_LIBRARY_PATH + CC=gcc + export CC + CXX=g++ + export CXX + cd ipax-0.13.0 + '[' '!' -f /builddir/build/BUILD/python-ipax-0.13.0-build/python-ipax-0.13.0-1.fc46.aarch64-pyproject-modules ']' + PATH=/builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin + PYTHONPATH=/builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib64/python3.15/site-packages:/builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages + _PYTHONSITE=/builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib64/python3.15/site-packages:/builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages + PYTHONDONTWRITEBYTECODE=1 + /usr/bin/python3 -sP /usr/lib/rpm/redhat/import_all_modules.py -f /builddir/build/BUILD/python-ipax-0.13.0-build/python-ipax-0.13.0-1.fc46.aarch64-pyproject-modules -e 'ipax.backend.*.cupy' -e 'ipax.backend.*.torch' -e ipax.problem.autodiff.jax -e ipax.problem.autodiff.torch Check import: ipax Check import: ipax.backend Check import: ipax.backend.dense Check import: ipax.backend.dense.numpy_scipy Check import: ipax.backend.errors Check import: ipax.backend.namespace Check import: ipax.backend.operators Check import: ipax.backend.sparse Check import: ipax.backend.sparse.jax Check import: ipax.backend.sparse.numpy_scipy Check import: ipax.interfaces Check import: ipax.interfaces.scipy Check import: ipax.ipm Check import: ipax.ipm.barrier Check import: ipax.ipm.breedveld_ls Check import: ipax.ipm.corrections Check import: ipax.ipm.driver Check import: ipax.ipm.filter_ls Check import: ipax.ipm.hessian Check import: ipax.ipm.init Check import: ipax.ipm.kkt Check import: ipax.ipm.restoration Check import: ipax.ipm.step Check import: ipax.ipm.termination Check import: ipax.linalg Check import: ipax.linalg.dense Check import: ipax.linalg.krylov Check import: ipax.linalg.regularize Check import: ipax.linalg.solver Check import: ipax.linalg.sparse Check import: ipax.options Check import: ipax.problem Check import: ipax.problem.autodiff Check import: ipax.problem.base Check import: ipax.problem.derivatives Check import: ipax.problem.finitediff Check import: ipax.problem.function Check import: ipax.problem.linear_ineq Check import: ipax.problem.scaling Check import: ipax.result Check import: ipax.solve Check import: ipax.testing Check import: ipax.testing.backends Check import: ipax.testing.problems Check import: ipax.typing + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mbranch-protection=standard -fasynchronous-unwind-tables -fstack-clash-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer ' + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes ' + PATH=/builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin + PYTHONPATH=/builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib64/python3.15/site-packages:/builddir/build/BUILD/python-ipax-0.13.0-build/BUILDROOT/usr/lib/python3.15/site-packages + PYTHONDONTWRITEBYTECODE=1 + PYTEST_ADDOPTS=' --ignore=/builddir/build/BUILD/python-ipax-0.13.0-build/.pyproject-builddir' + PYTEST_XDIST_AUTO_NUM_WORKERS=4 + /usr/bin/pytest -p no:cacheprovider tests -m 'not slow and not gpu and not sparse' -o addopts=-ra --ignore=tests/regression/test_input_device_allocations.py ============================= test session starts ============================== platform linux -- Python 3.15.2, pytest-9.1.1, pluggy-1.7.0 rootdir: /builddir/build/BUILD/python-ipax-0.13.0-build/ipax-0.13.0 configfile: pyproject.toml plugins: hypothesis-6.151.9, platformdirs-4.13.3 collected 3761 items / 256 deselected / 9 skipped / 3505 selected tests/backends/test_cross_backend_conformance.py ...F. [ 0%] tests/contracts/test_builtin_operator_contracts.py ..................... [ 0%] ........................................................................ [ 2%] ....................F.F.F.F.F.F.F.F [ 3%] tests/contracts/test_builtin_problem_contracts.py ...................... [ 4%] .......................... [ 5%] tests/contracts/test_builtin_solver_contracts.py ....................... [ 5%] ...........s.s.s.s.s. [ 6%] tests/integration/test_baseline_jacobian_pattern.py ..... [ 6%] tests/integration/test_benchmark_compare.py ....... [ 6%] tests/integration/test_benchmark_crosscheck.py ..... [ 6%] tests/integration/test_benchmark_harness.py ...F...F.F...F........ [ 7%] tests/integration/test_benchmark_phase4.py .ssss [ 7%] tests/integration/test_benchmark_scaling.py ... [ 7%] tests/integration/test_breedveld_soc.py .F.F.F.F..FF.F.. [ 8%] tests/integration/test_callback_and_logging.py .F.F.F.F.F.F.F.F.F.F.F.F. [ 8%] F [ 8%] tests/integration/test_corrections_solve.py ..FF..FF.F....FFss [ 9%] tests/integration/test_dense_augmented_route.py .F.F.F.F [ 9%] tests/integration/test_dense_nonconvex.py .F [ 9%] tests/integration/test_device_efficiency.py .F.F. [ 9%] tests/integration/test_hock_schittkowski.py .F.F.F.F.F.F.F.F.F.F [ 10%] tests/integration/test_known_optima.py .F.F.F.F.F.F.F.F.F.F [ 11%] tests/integration/test_krylov_solve.py .F.F.F.F.F.F.F.F.F.F [ 11%] tests/integration/test_linear_inequalities.py .F.F.F.F.F.F [ 11%] tests/integration/test_result_routes.py .F.F.s.F.F.F.F. [ 12%] tests/integration/test_routing_hints_report.py ........ [ 12%] tests/integration/test_s2mpj_baselines_runner.py ....................... [ 13%] ......... [ 13%] tests/integration/test_s2mpj_sweep_runner.py ................ [ 13%] tests/integration/test_scaling_solve.py .F.F.F.F.F.F [ 14%] tests/integration/test_scipy_interface_hs71.py ... [ 14%] tests/integration/test_tall_linear_ineq_benchmark.py ............ [ 14%] tests/integration/test_warm_start_solve.py .F.F.F.F [ 14%] tests/property/test_derivative_checks.py ........................ [ 15%] tests/regression/test_adaptive_alpha_min.py .F.F [ 15%] tests/regression/test_bound_only_lbfgs_structured_routes.py .F.F.F [ 15%] tests/regression/test_budget_exhaustion_acceptable.py .F.F [ 16%] tests/regression/test_callback_evaluation_counts.py .F...FFF...FFF [ 16%] tests/regression/test_corrector_operator_counts.py .F....FFFF..FF [ 16%] tests/regression/test_cudss_determinism_gate.py ........ [ 17%] tests/regression/test_delta_c_rank_deficient_constraints.py .F.F [ 17%] tests/regression/test_dense_diagonal_overflow.py ............ [ 17%] tests/regression/test_doctest_collection_adapters.py ................ [ 18%] tests/regression/test_driver_host_sync_budget.py ssssFFFF [ 18%] tests/regression/test_equality_dual_divergence.py ... [ 18%] tests/regression/test_false_infeasible_veto.py .F.F.F [ 18%] tests/regression/test_feasible_ascent_stall.py .F.F.F..F [ 18%] tests/regression/test_feasible_point_restoration_recenter.py .F.F.F [ 18%] tests/regression/test_feasible_recenter_without_inequalities.py .... [ 19%] tests/regression/test_fraction_to_boundary_no_elementwise_sync.py s. [ 19%] tests/regression/test_hs7_lbfgs_no_false_infeasible.py .F.F [ 19%] tests/regression/test_hs9_krylov_zero_hessian.py .F.. [ 19%] tests/regression/test_iteration_operator_lifetime.py ..FF [ 19%] tests/regression/test_lbfgs_apply_guard_is_cheap.py .. [ 19%] tests/regression/test_lbfgs_diagonal_singular_middle.py .............. [ 19%] tests/regression/test_lbfgs_gradient_overshoot.py .F [ 19%] tests/regression/test_lbfgs_setup_reuse.py .......... [ 20%] tests/regression/test_linear_ineq_lbfgs.py ......FFssss [ 20%] tests/regression/test_mu_oracle_inflation.py ......FFFFFF [ 20%] tests/regression/test_near_feasible_not_infeasible.py .F.F [ 21%] tests/regression/test_point_cache_lifetime.py ...F.F [ 21%] tests/regression/test_repeat_recenter_raises_mu.py .F [ 21%] tests/regression/test_restoration_on_step_failure.py ..FF.F.F.F [ 21%] tests/regression/test_restoration_tall_gram_block_not_densified.py ..FF. [ 21%] F [ 21%] tests/regression/test_second_chance_restoration.py .F.F [ 21%] tests/regression/test_soc_factorization_reuse.py ..FF..FF.......F.F..... [ 22%] .....F. [ 22%] tests/regression/test_step_solve_callback_errors_propagate.py ..FF..FF.F [ 22%] .F.F [ 23%] tests/regression/test_step_solve_numerical_failure_ladder.py ...FFF...FF [ 23%] F [ 23%] tests/regression/test_terminal_dual_certificate.py .F.F.F.F.F.F..FF.F.F. [ 24%] F.F.F.F.F [ 24%] tests/regression/test_theta_min_ftype_gate.py .F [ 24%] tests/regression/test_trots_lsqr_validation.py ............... [ 24%] tests/regression/test_unbounded_detection.py .F.F.F.F [ 24%] tests/regression/test_uncertified_restoration_stall.py .F.F.F.F [ 25%] tests/test_purity_gate.py FF.F [ 25%] tests/unit/test_alpha_min.py .......... [ 25%] tests/unit/test_autodiff.py ssssssss [ 25%] tests/unit/test_backend_namespace.py .................F. [ 26%] tests/unit/test_barrier.py ................ [ 26%] tests/unit/test_breedveld.py ......F.F..F.F.F.F.F......FFFFFF........... [ 28%] ........ [ 28%] tests/unit/test_condensed_curvature_gram.py ............................ [ 29%] .................F [ 29%] tests/unit/test_corrections.py .......................F....FFFF...F.F..F [ 30%] .F.F.F.F.F.... [ 31%] tests/unit/test_cupy_sparse_adapter.py ................................. [ 32%] ..................................... [ 33%] tests/unit/test_dense_cholesky_reuse.py .s.sssssssss...s.............s.s [ 34%] .....s..s.....s....s.s.s.s.s... [ 34%] tests/unit/test_dense_diagonal_adder.py .s.s.s.s.s.......s [ 35%] tests/unit/test_dense_dispatch.py .s.s.s...s...s...s.s.. [ 36%] tests/unit/test_dense_numpy_scipy_cholesky.py .......................... [ 36%] cholesky_solve bitwise-identity: 32/32 (100.0%) configurations bitwise identical; max relative difference among the rest: 0.000e+00 . [ 36%] tests/unit/test_dense_numpy_scipy_ldl.py ........ [ 37%] tests/unit/test_dense_numpy_scipy_potrf.py ............................. [ 37%] ... [ 38%] tests/unit/test_dense_solver.py ........................................ [ 39%] ........................................................................ [ 41%] ........ [ 41%] tests/unit/test_equality_dual_repair_gate.py .................. [ 41%] tests/unit/test_equality_dual_repair_option.py ..... [ 42%] tests/unit/test_expand_indptr.py ..................FFFFFFFFFFFFFFFFFF..F [ 43%] F.F.F [ 43%] tests/unit/test_feasible_kkt_acceptance.py .F.F.F.F.F.F [ 43%] tests/unit/test_filter_ls.py ........................... [ 44%] tests/unit/test_filter_reset_on_mu_update.py .F [ 44%] tests/unit/test_free_mode_acceptance.py .......F.F.F.F.F [ 44%] tests/unit/test_gram_dense_windows.py .................................. [ 45%] .................. [ 46%] tests/unit/test_hessian_lbfgs.py .................................F..... [ 47%] ....... [ 47%] tests/unit/test_inertia_correction.py ..... [ 47%] tests/unit/test_init_bounds.py .F.F [ 48%] tests/unit/test_init_recenter.py .F.F.F.F [ 48%] tests/unit/test_kkt.py .......s.s....................................... [ 49%] .......................................................................F [ 51%] .................... [ 52%] tests/unit/test_krylov.py .............................................. [ 53%] ........................................................................ [ 55%] ................ [ 56%] tests/unit/test_lbfgs_damping_skip.py ....... [ 56%] tests/unit/test_lbfgs_seed_formula.py ....... [ 56%] tests/unit/test_least_squares_duals.py ............................ [ 57%] tests/unit/test_line_search_opt_ins_default_off.py ....... [ 57%] tests/unit/test_linear_ineq_lowering.py .....................ssssF....FF [ 58%] FF.F.F.F...F.F...F.F...sFs...ssF...ssF.F.F...F.F.F.F.F.F....F...F.F.... [ 60%] tests/unit/test_logging.py .................. [ 60%] tests/unit/test_mixed_precision_dense.py ............................... [ 61%] ...............F.......................F [ 62%] tests/unit/test_mu_schedule.py ........F.F.....FFF...FFF.F.F.F.F..FF.F.F [ 64%] ..F.F..............F.F.F [ 64%] tests/unit/test_numerical_failures.py ................................. [ 65%] tests/unit/test_operator_batched_hooks.py ................s [ 66%] tests/unit/test_operator_coo.py ................................ [ 67%] tests/unit/test_operator_coo_values.py .................. [ 67%] tests/unit/test_operator_diagonal.py .................................. [ 68%] tests/unit/test_options.py ............................................. [ 69%] ............................................ [ 71%] tests/unit/test_problem_derivatives.py .............. [ 71%] tests/unit/test_public_exports.py .. [ 71%] tests/unit/test_public_sparse_operators.py .....F.F.F.................s. [ 72%] s.s.s.s.s [ 72%] tests/unit/test_quality_mu.py .......... [ 73%] tests/unit/test_recenter_mu_escalation.py .F.F.F [ 73%] tests/unit/test_regularize.py .... [ 73%] tests/unit/test_restoration.py .F.F.F.F.F.F.F.F.F.F.F..FF.F.F.F.F.F.F..F [ 74%] F.F.F.F.F.F.F...ssF...... [ 75%] tests/unit/test_restoration_cholesky.py .........F..FF.F.F.s.F.F.F...F.F [ 76%] ..FF.F..FF [ 76%] tests/unit/test_result.py ........... [ 76%] tests/unit/test_s2mpj_adapter.py ............... [ 77%] tests/unit/test_s2mpj_fasteval.py ............................ [ 77%] tests/unit/test_scaling.py .....F...F.F.F...s....... [ 78%] tests/unit/test_scipy_interface.py ..................................... [ 79%] ................................... [ 80%] tests/unit/test_scipy_interface_backends.py .F.F.F.F...F.F...........sss [ 81%] .F...F.s.F [ 81%] tests/unit/test_slack_init_scale.py .F.F.F.F. [ 82%] tests/unit/test_solve_tall_selection.py ........... [ 82%] tests/unit/test_solver_selection.py .................................. [ 83%] tests/unit/test_sparse_canonical.py ........... [ 83%] tests/unit/test_sparse_device_routing.py .......s.s [ 83%] tests/unit/test_sparse_dispatch.py ..s.. [ 84%] tests/unit/test_sparse_gram_cache.py .................... [ 84%] tests/unit/test_sparse_inertia_warning.py ...... [ 84%] tests/unit/test_step_failure_salvage.py ........ [ 85%] tests/unit/test_step_length_memo.py ... [ 85%] tests/unit/test_termination.py ......... [ 85%] tests/unit/test_theta_min_switching.py ...... [ 85%] tests/unit/test_trots_breedveld_start.py ...............ss..........s... [ 86%] s............................... [ 87%] tests/unit/test_trots_exact_hessian.py ..................ssssss.ssssssss [ 88%] ssss.................sss.s.s.. [ 89%] tests/unit/test_trots_hessian_gram_merge.py ..ss.s.s.s..ss......ss [ 89%] tests/unit/test_trots_reference.py ................ [ 90%] tests/unit/test_trots_tiled_gram.py .................................... [ 91%] ........................................................................ [ 93%] ........................................FsF.ssssssssssssssssssssssssssss [ 95%] ssssssssssssssssssssssssssssssssssssssssssss...............sssssssssssss [ 97%] sssss................................ssssssssssssssssssssssss....s.s.s.s [ 99%] .s.s.s.s.... [ 99%] tests/unit/test_warm_start.py .F.... [100%] =================================== FAILURES =================================== ______________________ test_same_solution_across_backends ______________________ all_available_backends = ['numpy', 'array_api_strict'] def test_same_solution_across_backends(all_available_backends): if len(all_available_backends) < 2: pytest.skip("needs at least two installed Array-API backends") solutions = [] for name in all_available_backends: xp = import_namespace(name) Q = array(xp, [[4.0, 1.0], [1.0, 3.0]]) b = array(xp, [1.0, 2.0]) problem = UnconstrainedQuadratic(Q, b, xp) with implemented("solver"): > result = solve( problem, array(xp, [0.0, 0.0]), options=Options(hessian="exact", linsolve="dense"), ) tests/backends/test_cross_backend_conformance.py:51: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _______ TestSignedRowSelection.test_shape_consistency[array_api_strict] ________ self = namespace = def test_shape_consistency(self, namespace): with implemented(self.implementation_reason): > op = self.make_operator(namespace) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/contracts/test_operator_contract.py:21: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/contracts/test_builtin_operator_contracts.py:213: in make_operator return _SignedRowSelection( ipax/backend/operators.py:1493: in __init__ self._expand_lower = xp.cumulative_sum(lower_int) * lower_int ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1, 0, 1], dtype=array_api_strict.int64),), kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function cumulative_sum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ______ TestSignedRowSelection.test_matvec_matches_dense[array_api_strict] ______ self = namespace = tol = {'rtol': 1e-09, 'atol': 1e-09} def test_matvec_matches_dense(self, namespace, tol): with implemented(self.implementation_reason): > op = self.make_operator(namespace) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/contracts/test_operator_contract.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/contracts/test_builtin_operator_contracts.py:213: in make_operator return _SignedRowSelection( ipax/backend/operators.py:1493: in __init__ self._expand_lower = xp.cumulative_sum(lower_int) * lower_int ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1, 0, 1], dtype=array_api_strict.int64),), kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function cumulative_sum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ________ TestSignedRowSelection.test_adjoint_identity[array_api_strict] ________ self = namespace = tol = {'rtol': 1e-09, 'atol': 1e-09} def test_adjoint_identity(self, namespace, tol): with implemented(self.implementation_reason): > op = self.make_operator(namespace) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/contracts/test_operator_contract.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/contracts/test_builtin_operator_contracts.py:213: in make_operator return _SignedRowSelection( ipax/backend/operators.py:1493: in __init__ self._expand_lower = xp.cumulative_sum(lower_int) * lower_int ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1, 0, 1], dtype=array_api_strict.int64),), kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function cumulative_sum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ______ TestSignedRowSelection.test_matmat_matches_dense[array_api_strict] ______ self = namespace = tol = {'rtol': 1e-09, 'atol': 1e-09} def test_matmat_matches_dense(self, namespace, tol): with implemented(self.implementation_reason): > op = self.make_operator(namespace) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/contracts/test_operator_contract.py:50: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/contracts/test_builtin_operator_contracts.py:213: in make_operator return _SignedRowSelection( ipax/backend/operators.py:1493: in __init__ self._expand_lower = xp.cumulative_sum(lower_int) * lower_int ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1, 0, 1], dtype=array_api_strict.int64),), kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function cumulative_sum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ TestSignedRowSelection.test_dense_matrix_matches_dense_when_available[array_api_strict] _ self = namespace = tol = {'rtol': 1e-09, 'atol': 1e-09} def test_dense_matrix_matches_dense_when_available(self, namespace, tol): with implemented(self.implementation_reason): > op = self.make_operator(namespace) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/contracts/test_operator_contract.py:69: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/contracts/test_builtin_operator_contracts.py:213: in make_operator return _SignedRowSelection( ipax/backend/operators.py:1493: in __init__ self._expand_lower = xp.cumulative_sum(lower_int) * lower_int ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1, 0, 1], dtype=array_api_strict.int64),), kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function cumulative_sum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ TestSignedRowSelection.test_positive_definite_hint_is_honest[array_api_strict] _ self = namespace = def test_positive_definite_hint_is_honest(self, namespace): # ``positive_definite_hint`` defaults to False; an operator that claims # PD by construction must materialize to a matrix Cholesky accepts. with implemented(self.implementation_reason): > op = self.make_operator(namespace) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/contracts/test_operator_contract.py:82: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/contracts/test_builtin_operator_contracts.py:213: in make_operator return _SignedRowSelection( ipax/backend/operators.py:1493: in __init__ self._expand_lower = xp.cumulative_sum(lower_int) * lower_int ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1, 0, 1], dtype=array_api_strict.int64),), kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function cumulative_sum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ TestSignedRowSelection.test_dense_matrix_with_gram_is_honest_when_offered[array_api_strict] _ self = namespace = tol = {'rtol': 1e-09, 'atol': 1e-09} def test_dense_matrix_with_gram_is_honest_when_offered(self, namespace, tol): # ``dense_matrix_with_gram`` declines by default; an operator that # fuses must return ``A + Jᵀ diag(w) J`` for *any* Jacobian it is # handed (or decline it), symmetric to round-off. from ipax.backend.operators import Dense with implemented(self.implementation_reason): > op = self.make_operator(namespace) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/contracts/test_operator_contract.py:98: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/contracts/test_builtin_operator_contracts.py:213: in make_operator return _SignedRowSelection( ipax/backend/operators.py:1493: in __init__ self._expand_lower = xp.cumulative_sum(lower_int) * lower_int ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1, 0, 1], dtype=array_api_strict.int64),), kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function cumulative_sum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ TestSignedRowSelection.test_exact_lbfgs_inverse_claim_is_honest[array_api_strict] _ self = namespace = tol = {'rtol': 1e-09, 'atol': 1e-09} def test_exact_lbfgs_inverse_claim_is_honest(self, namespace, tol): # ``lbfgs_inverse_is_exact`` defaults to False; an operator that claims # exactness must back it with an apply that inverts it to round-off. with implemented(self.implementation_reason): > op = self.make_operator(namespace) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/contracts/test_operator_contract.py:123: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/contracts/test_builtin_operator_contracts.py:213: in make_operator return _SignedRowSelection( ipax/backend/operators.py:1493: in __init__ self._expand_lower = xp.cumulative_sum(lower_int) * lower_int ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1, 0, 1], dtype=array_api_strict.int64),), kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function cumulative_sum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____________ test_run_case_scores_a_known_optimum[array_api_strict] ____________ namespace = def test_run_case_scores_a_known_optimum(namespace): case = _bound_qp_case() result = run_case( case, config="exact/dense", options=ipax.Options(hessian="exact", linsolve="dense"), xp=namespace, backend="test", ) > assert result.correct E AssertionError: assert False E + where False = CaseResult(problem='bound_qp', kind='QP', backend='test', config='exact/dense', status='solve_error', success=False, c...later, but the current API version for array-api-strict is 2022.12', prepare_time=0.0, soc_attempted=0, soc_accepted=0).correct tests/integration/test_benchmark_harness.py:50: AssertionError ______ test_run_case_reports_soc_attempted_and_accepted[array_api_strict] ______ namespace = def test_run_case_reports_soc_attempted_and_accepted(namespace): # ``CaseResult.soc_attempted``/``.soc_accepted`` are sums of the public # ``IterationRecord.soc_attempted``/``.used_soc`` off ``Result.history`` # (see AGENTS.md; ipax/result.py) — not a re-implementation of the # controller's bookkeeping. Reuses the textbook Maratos-effect setup # (tests/integration/test_breedveld_soc.py) whose far-start Newton steps # trigger a Breedveld second-order correction. import math from benchmarks.corpus import BenchmarkProblem from ipax.options import BreedveldOptions from ipax.testing.problems import Maratos from tests._helpers import array start = [0.5 * math.cos(2.5), 0.5 * math.sin(2.5)] case = BenchmarkProblem( name="maratos", kind="NLP", tags=(), build=lambda xp: (Maratos(namespace), array(namespace, start)), ) def _run(max_soc: int): return run_case( case, config="exact/dense", options=ipax.Options( hessian="exact", linsolve="dense", globalization="breedveld", breedveld=BreedveldOptions(max_soc=max_soc), ), xp=namespace, backend="test", ) off = _run(0) assert off.soc_attempted == 0 assert off.soc_accepted == 0 on = _run(1) > assert on.soc_accepted >= 1 E AssertionError: assert 0 >= 1 E + where 0 = CaseResult(problem='maratos', kind='NLP', backend='test', config='exact/dense', status='solve_error', success=False, c...later, but the current API version for array-api-strict is 2022.12', prepare_time=0.0, soc_attempted=0, soc_accepted=0).soc_accepted tests/integration/test_benchmark_harness.py:132: AssertionError _ test_run_case_converged_but_not_correct_when_objective_differs[array_api_strict] _ namespace = def test_run_case_converged_but_not_correct_when_objective_differs(namespace): # A solve that reaches a valid KKT point but a *different* objective than the # dataset-documented one is `converged` but not `correct` — the tier that # credits convergence to a different local optimum on a nonconvex problem. from benchmarks.corpus import BenchmarkProblem class _QP(ipax.Problem): expected_objective = -12345.0 # deliberately wrong "documented" optimum @property def n_vars(self) -> int: return 2 def objective(self, x): return namespace.sum(x * x) def gradient(self, x): return 2.0 * x case = BenchmarkProblem( name="wrong_opt", kind="NLP", tags=(), build=lambda xp: (_QP(), namespace.asarray([1.0, 1.0])), ) result = run_case( case, config="lbfgs/dense", options=ipax.Options(hessian="lbfgs", linsolve="dense"), xp=namespace, backend="test", ) > assert result.converged # reached a KKT point (x -> 0, kkt small) ^^^^^^^^^^^^^^^^^^^^^^^ E AssertionError: assert False E + where False = CaseResult(problem='wrong_opt', kind='NLP', backend='test', config='lbfgs/dense', status='solve_error', success=False,...later, but the current API version for array-api-strict is 2022.12', prepare_time=0.0, soc_attempted=0, soc_accepted=0).converged tests/integration/test_benchmark_harness.py:168: AssertionError ____________ test_run_case_applies_prepare_solve[array_api_strict] _____________ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa9b88510> def test_run_case_applies_prepare_solve(namespace, monkeypatch): # A case's ``prepare_solve`` hook runs after ``build`` and its start, # warm start and options are what ``ipax.solve`` receives; its wall time # counts toward the row's solve_time (the TROTS Breedveld initialisation). import time from dataclasses import replace from ipax.result import WarmStart seen: dict[str, object] = {} warm = WarmStart() tuned = ipax.Options(hessian="exact", linsolve="dense", max_iter=50) def prepare(problem, x0, options): seen["prepare"] = (problem, x0, options) time.sleep(0.05) started = x0 * 1.0 # a fresh array: the hook's start, not build's seen["start"] = started return started, warm, tuned real_solve = ipax.solve def spy_solve(problem, x0, **kwargs): seen["solve"] = (problem, x0, kwargs) return real_solve(problem, x0, **kwargs) monkeypatch.setattr(ipax, "solve", spy_solve) base = ipax.Options(hessian="exact", linsolve="dense") result = run_case( replace(_bound_qp_case(), prepare_solve=prepare), config="exact/dense", options=base, xp=namespace, backend="test", ) problem, _x0, given = seen["prepare"] assert given is base solved_problem, solved_x0, kwargs = seen["solve"] assert solved_problem is problem assert solved_x0 is seen["start"] # the solve starts from the hook's x0 assert kwargs["options"] is tuned assert kwargs["warm_start"] is warm > assert result.error is None and result.correct E assert ('Traceback (most recent call last):\n File "/builddir/build/BUILD/python-ipax-0.13.0-build/ipax-0.13.0/benchmarks/har...he function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12' is None) E + where 'Traceback (most recent call last):\n File "/builddir/build/BUILD/python-ipax-0.13.0-build/ipax-0.13.0/benchmarks/har...he function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12' = CaseResult(problem='bound_qp', kind='QP', backend='test', config='exact/dense', status='solve_error', success=False, c...urrent API version for array-api-strict is 2022.12', prepare_time=0.05013143299999001, soc_attempted=0, soc_accepted=0).error tests/integration/test_benchmark_harness.py:233: AssertionError _____ test_soc_reaches_the_same_optimum_as_backtracking[array_api_strict] ______ namespace = def test_soc_reaches_the_same_optimum_as_backtracking(namespace): > plain = _solve_maratos(namespace, _options()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_breedveld_soc.py:58: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/integration/test_breedveld_soc.py:54: in _solve_maratos return solve(Maratos(namespace), array(namespace, list(_START)), options=options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([124.82156515], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _______ test_filter_soc_recorded_on_iteration_history[array_api_strict] ________ namespace = def test_filter_soc_recorded_on_iteration_history(namespace): # LineSearchOptions.max_soc defaults to 4 (on): the filter line search's # own W&B 2006 §2.4 correction, exercised the same way as Breedveld's. > off = _solve_maratos( namespace, Options( hessian="exact", linsolve="dense", line_search=LineSearchOptions(max_soc=0), ), ) tests/integration/test_breedveld_soc.py:80: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/integration/test_breedveld_soc.py:54: in _solve_maratos return solve(Maratos(namespace), array(namespace, list(_START)), options=options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([124.82156515], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____________ test_soc_composes_with_common_step[array_api_strict] _____________ namespace = def test_soc_composes_with_common_step(namespace): # An accepted correction is taken at the full length the Markov test # judged; under ``common_step`` that same α moves the duals. > result = _solve_maratos(namespace, _options(max_soc=1, common_step=True)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_breedveld_soc.py:100: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/integration/test_breedveld_soc.py:54: in _solve_maratos return solve(Maratos(namespace), array(namespace, list(_START)), options=options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([124.82156515], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___ test_breedveld_soc_rounds_come_from_breedveld_options[array_api_strict] ____ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa91ec140> def test_breedveld_soc_rounds_come_from_breedveld_options(namespace, monkeypatch): # The driver threads BreedveldOptions.max_soc into the correction loop; the # filter line search's LineSearchOptions.max_soc is not read on this path. # The round count itself is internal to ``soc()`` (not surfaced on # IterationRecord), so this still spies on the factorization-reuse call — # that is what actually tests "the round count comes from BreedveldOptions". resolves = {"n": 0} original = IPMDriver._resolve_reused_factorization def spy(self, *args, **kwargs): resolves["n"] += 1 return original(self, *args, **kwargs) monkeypatch.setattr(IPMDriver, "_resolve_reused_factorization", spy) silent = dataclasses.replace( _options(max_soc=0), line_search=LineSearchOptions(max_soc=4) ) > silent_result = _solve_maratos(namespace, silent) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_breedveld_soc.py:127: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/integration/test_breedveld_soc.py:54: in _solve_maratos return solve(Maratos(namespace), array(namespace, list(_START)), options=options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([124.82156515], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __ test_soc_leaves_hock_schittkowski_optima_unchanged[array_api_strict-HS71] ___ namespace = cls = , start = [1.0, 5.0, 5.0, 1.0] @pytest.mark.parametrize( ("cls", "start"), [(HS71, [1.0, 5.0, 5.0, 1.0]), (HS43, [0.0, 0.0, 0.0, 0.0])], ids=["HS71", "HS43"], ) def test_soc_leaves_hock_schittkowski_optima_unchanged(namespace, cls, start): # The Markov test never rejects a θ-worsening full step here, so the # option is inert: same optimum, no correction attempted. problem, x0 = cls(namespace), array(namespace, start) > plain = solve(problem, x0, options=_options()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_breedveld_soc.py:153: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([3., 3., 3., 3.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __ test_soc_leaves_hock_schittkowski_optima_unchanged[array_api_strict-HS43] ___ namespace = cls = , start = [0.0, 0.0, 0.0, 0.0] @pytest.mark.parametrize( ("cls", "start"), [(HS71, [1.0, 5.0, 5.0, 1.0]), (HS43, [0.0, 0.0, 0.0, 0.0])], ids=["HS71", "HS43"], ) def test_soc_leaves_hock_schittkowski_optima_unchanged(namespace, cls, start): # The Markov test never rejects a θ-worsening full step here, so the # option is inert: same optimum, no correction attempted. problem, x0 = cls(namespace), array(namespace, start) > plain = solve(problem, x0, options=_options()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_breedveld_soc.py:153: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1.], dtype=array_api_strict.float64), Array([100., 100., 50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _________ test_soc_trials_are_logged_at_debug_level[array_api_strict] __________ namespace = caplog = <_pytest.logging.LogCaptureFixture object at 0xffffaad88cd0> def test_soc_trials_are_logged_at_debug_level(namespace, caplog): import logging with caplog.at_level(logging.DEBUG): > _solve_maratos(namespace, _options(max_soc=1)) tests/integration/test_breedveld_soc.py:165: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/integration/test_breedveld_soc.py:54: in _solve_maratos return solve(Maratos(namespace), array(namespace, list(_START)), options=options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([124.82156515], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____ test_callback_is_invoked_once_per_recorded_iteration[array_api_strict] ____ namespace = def test_callback_is_invoked_once_per_recorded_iteration(namespace): problem = BoundConstrainedQP(namespace) x0 = array(namespace, [0.25, 0.75]) seen: list[IterationInfo] = [] with implemented("bound handling"): > result = solve( problem, x0, options=Options(hessian="exact", linsolve="dense"), callback=seen.append, ) tests/integration/test_callback_and_logging.py:32: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0. , 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _________ test_callback_truthy_return_requests_stop[array_api_strict] __________ namespace = def test_callback_truthy_return_requests_stop(namespace): problem = BoundConstrainedQP(namespace) x0 = array(namespace, [0.25, 0.75]) calls = 0 def stop_after_two(info: IterationInfo) -> bool: nonlocal calls calls += 1 return info.record.iteration >= 1 with implemented("bound handling"): > result = solve( problem, x0, options=Options(hessian="exact", linsolve="dense"), callback=stop_after_two, ) tests/integration/test_callback_and_logging.py:66: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0. , 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___ test_acceptable_stopping_is_integrated_with_the_driver[array_api_strict] ___ namespace = def test_acceptable_stopping_is_integrated_with_the_driver(namespace): problem = BoundConstrainedQP(namespace) x0 = array(namespace, [0.25, 0.75]) with implemented("bound handling"): > result = solve( problem, x0, options=Options( hessian="exact", linsolve="dense", # One ultra-loose enabled condition, the (default-on) others # opted out: the gate must fire on the very first iterate. acceptable=AcceptableStoppingOptions( dual_inf_tol=1e6, constr_viol_tol=None, compl_inf_tol=None, n_iter=1, ), ), ) tests/integration/test_callback_and_logging.py:85: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0. , 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_component_optimality_threshold_is_integrated_with_the_driver[array_api_strict] _ namespace = def test_component_optimality_threshold_is_integrated_with_the_driver(namespace): problem = BoundConstrainedQP(namespace) x0 = array(namespace, [0.25, 0.75]) with implemented("bound handling"): > result = solve( problem, x0, options=Options( hessian="exact", linsolve="dense", # Loose optimality on dual/complementarity, tight on feasibility. optimality=OptimalityConditionOptions( dual_inf_tol=1e-4, compl_inf_tol=1e-4, constr_viol_tol=1e-8 ), ), ) tests/integration/test_callback_and_logging.py:118: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0. , 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___ test_wall_time_stopping_is_integrated_with_the_driver[array_api_strict] ____ namespace = def test_wall_time_stopping_is_integrated_with_the_driver(namespace): problem = BoundConstrainedQP(namespace) x0 = array(namespace, [0.25, 0.75]) with implemented("bound handling"): > result = solve( problem, x0, options=Options(hessian="exact", linsolve="dense", max_time=1e-12), ) tests/integration/test_callback_and_logging.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0. , 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_objective_stagnation_is_guarded_and_skips_the_initial_record[array_api_strict] _ namespace = def test_objective_stagnation_is_guarded_and_skips_the_initial_record(namespace): lower = array(namespace, [0.0]) upper = array(namespace, [2.0]) problem = FunctionProblem( 1, lambda x: namespace.sum(x * 0.0), gradient=lambda x: namespace.zeros_like(x), bounds=(lower, upper), ) with implemented("bound handling"): > result = solve( problem, array(namespace, [1.0]), options=Options( linsolve="dense", # Monotone μ keeps this degenerate problem un-converged for a # few iterations so the acceptable-stagnation checker (the # subject of this test) actually fires; the probing default # solves it to full optimality straight away. mu_schedule="monotone", acceptable=AcceptableStoppingOptions( f_rel_change_tol=0.0, dual_inf_tol=1.0, constr_viol_tol=1.0, compl_inf_tol=1.0, n_iter=1, ), ), ) tests/integration/test_callback_and_logging.py:165: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([1.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_convergence_takes_priority_over_stop_request[array_api_strict] ______ namespace = def test_convergence_takes_priority_over_stop_request(namespace): """A converged final iterate reports OPTIMAL even if the callback stops.""" Q = array(namespace, [[4.0, 1.0], [1.0, 3.0]]) b = array(namespace, [1.0, 2.0]) problem = UnconstrainedQuadratic(Q, b, namespace) x0 = problem.known_solution() # unconstrained minimum: KKT error ~0 at iter 0 with implemented("dense solver"): > result = solve( problem, x0, options=Options(hessian="exact", linsolve="dense"), callback=lambda info: True, ) tests/integration/test_callback_and_logging.py:198: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ______ test_verbose_emits_iteration_log_to_ipax_logger[array_api_strict] _______ namespace = caplog = <_pytest.logging.LogCaptureFixture object at 0xffffad99c770> def test_verbose_emits_iteration_log_to_ipax_logger(namespace, caplog): from ipax._logging import ITERATION, RESULT problem = BoundConstrainedQP(namespace) x0 = array(namespace, [0.25, 0.75]) # caplog at the ITERATION level captures the result summary (tier 1) and the # per-iteration table (tier 2) but not the lower setup tiers. with caplog.at_level(ITERATION, logger="ipax"): with implemented("bound handling"): > solve( problem, x0, options=Options(hessian="exact", linsolve="dense", verbose=2), ) tests/integration/test_callback_and_logging.py:218: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0. , 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ______ test_iteration_header_is_reprinted_periodically[array_api_strict] _______ namespace = caplog = <_pytest.logging.LogCaptureFixture object at 0xffffa9148950> monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa927fd90> def test_iteration_header_is_reprinted_periodically(namespace, caplog, monkeypatch): from ipax._logging import ITERATION # Force a header before every row so the count is deterministic regardless of # how many iterations the problem needs. The driver binds the name at import, # so patch it in the driver module's namespace. monkeypatch.setattr("ipax.ipm.driver.HEADER_REPEAT_INTERVAL", 1) problem = BoundConstrainedQP(namespace) x0 = array(namespace, [0.25, 0.75]) with caplog.at_level(ITERATION, logger="ipax"): with implemented("bound handling"): > solve( problem, x0, options=Options(hessian="exact", linsolve="dense", verbose=2), ) tests/integration/test_callback_and_logging.py:258: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0. , 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____ test_iterates_meeting_acceptable_criteria_are_marked[array_api_strict] ____ namespace = caplog = <_pytest.logging.LogCaptureFixture object at 0xffffa99416a0> def test_iterates_meeting_acceptable_criteria_are_marked(namespace, caplog): from ipax._logging import ITERATION problem = BoundConstrainedQP(namespace) x0 = array(namespace, [0.25, 0.75]) # Tolerances loose enough that the iterates satisfy them, but n_iter large # enough that the acceptable rule never actually fires — so the rows are # marked without changing the termination outcome. acceptable = AcceptableStoppingOptions( dual_inf_tol=1e6, constr_viol_tol=1e6, compl_inf_tol=1e6, n_iter=10_000, ) with caplog.at_level(ITERATION, logger="ipax"): with implemented("bound handling"): > solve( problem, x0, options=Options( hessian="exact", linsolve="dense", verbose=2, acceptable=acceptable, ), ) tests/integration/test_callback_and_logging.py:294: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0. , 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____ test_restoration_jump_marks_the_resulting_iteration[array_api_strict] _____ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffaa09c6d0> caplog = <_pytest.logging.LogCaptureFixture object at 0xffffa91a2550> def test_restoration_jump_marks_the_resulting_iteration(namespace, monkeypatch, caplog): # A restoration jump replaces (x, s) outside the Newton step; the record for # the resulting iterate — and its logged row — must say so, both so users can # see restorations in the table and so IterationRecord.restored is reliable # for programmatic inspection. from ipax._logging import ITERATION from ipax.ipm.driver import IPMDriver from ipax.ipm.filter_ls import FilterLineSearch, LineSearchResult from ipax.ipm.restoration import RestorationExit from ipax.testing.problems import HS7 xp = namespace problem = HS7(xp) x0 = array(xp, [2.0, 2.0]) calls = {"n": 0} original = FilterLineSearch.search def flaky(self, **kwargs): calls["n"] += 1 if calls["n"] == 1: return original(self, **kwargs) return LineSearchResult(self._o.alpha_min_frac, False, False, True) monkeypatch.setattr(FilterLineSearch, "search", flaky) feasible = array(xp, [0.0, 1.7320508075688772]) # exactly satisfies HS7's c(x)=0 def stub_restore(self, x, s, m, m_eq, mask_l, mask_u, lower_safe, upper_safe): return feasible, s, RestorationExit.FEASIBLE monkeypatch.setattr(IPMDriver, "_restore", stub_restore) with caplog.at_level(ITERATION, logger="ipax"): > result = solve( problem, x0, options=Options(hessian="exact", linsolve="dense", verbose=2, max_iter=15), ) tests/integration/test_callback_and_logging.py:350: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([2.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ______ test_verbosity_tiers_are_emitted_at_their_levels[array_api_strict] ______ namespace = caplog = <_pytest.logging.LogCaptureFixture object at 0xffffa91ef2f0> def test_verbosity_tiers_are_emitted_at_their_levels(namespace, caplog): from ipax._logging import ITERATION, OPTIONS, PROBLEM, RESULT, SOLVER problem = BoundConstrainedQP(namespace) x0 = array(namespace, [0.25, 0.75]) # Capturing at DEBUG records every tier regardless of verbose; the tiers are # distinguished by their numeric level (what the console threshold gates on). with caplog.at_level(logging.DEBUG, logger="ipax"): with implemented("bound handling"): > solve(problem, x0, options=Options(hessian="exact", linsolve="dense")) tests/integration/test_callback_and_logging.py:378: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0. , 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___________________ test_silent_by_default[array_api_strict] ___________________ namespace = caplog = <_pytest.logging.LogCaptureFixture object at 0xffffa927e510> def test_silent_by_default(namespace, caplog): problem = BoundConstrainedQP(namespace) x0 = array(namespace, [0.25, 0.75]) with caplog.at_level(logging.DEBUG, logger="ipax"): with implemented("bound handling"): > solve(problem, x0, options=Options(hessian="exact", linsolve="dense")) tests/integration/test_callback_and_logging.py:401: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0. , 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____ test_corrections_match_optimum_on_bound_qp[array_api_strict-mehrotra] _____ namespace = method = 'mehrotra' @pytest.mark.parametrize("method", ["mehrotra", "gondzio"]) def test_corrections_match_optimum_on_bound_qp(namespace, method): problem = BoundConstrainedQP(namespace) x0 = array(namespace, [0.25, 0.75]) with implemented("dense solver"): > base = solve(problem, x0, options=_opts("none")) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_corrections_solve.py:65: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0. , 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_corrections_match_optimum_on_bound_qp[array_api_strict-gondzio] _____ namespace = method = 'gondzio' @pytest.mark.parametrize("method", ["mehrotra", "gondzio"]) def test_corrections_match_optimum_on_bound_qp(namespace, method): problem = BoundConstrainedQP(namespace) x0 = array(namespace, [0.25, 0.75]) with implemented("dense solver"): > base = solve(problem, x0, options=_opts("none")) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_corrections_solve.py:65: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0. , 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _______ test_corrections_solve_inequality_qp[array_api_strict-mehrotra] ________ namespace = method = 'mehrotra' @pytest.mark.parametrize("method", ["mehrotra", "gondzio"]) def test_corrections_solve_inequality_qp(namespace, method): problem = _InequalityQP(namespace) x0 = namespace.full((5,), 0.1, dtype=array(namespace, [0.0]).dtype) with implemented("dense solver"): > base = solve(problem, x0, options=_opts("none")) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_corrections_solve.py:81: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([100.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ________ test_corrections_solve_inequality_qp[array_api_strict-gondzio] ________ namespace = method = 'gondzio' @pytest.mark.parametrize("method", ["mehrotra", "gondzio"]) def test_corrections_solve_inequality_qp(namespace, method): problem = _InequalityQP(namespace) x0 = namespace.full((5,), 0.1, dtype=array(namespace, [0.0]).dtype) with implemented("dense solver"): > base = solve(problem, x0, options=_opts("none")) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_corrections_solve.py:81: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([100.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_corrections_reduce_outer_iterations_on_inequality_qp[array_api_strict] __ namespace = def test_corrections_reduce_outer_iterations_on_inequality_qp(namespace): # This checks outer convergence, not wall time: dense corrector solves are # full solves, while sparse-direct can reuse its numeric factorization. problem = _InequalityQP(namespace, n=8) x0 = namespace.full((8,), 0.05, dtype=array(namespace, [0.0]).dtype) with implemented("dense solver"): > base = solve(problem, x0, options=_opts("none")) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_corrections_solve.py:99: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([100.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_corrections_work_across_repeated_solve_routes[array_api_strict-krylov-mehrotra] _ namespace = method = 'mehrotra', linsolve = 'krylov' @pytest.mark.parametrize("method", ["mehrotra", "gondzio"]) @pytest.mark.parametrize("linsolve", ["krylov", "sparse"]) def test_corrections_work_across_repeated_solve_routes(namespace, method, linsolve): if linsolve == "sparse" and not capabilities(namespace).has_sparse_adapter: pytest.skip(f"no sparse adapter for {namespace.__name__!r}") problem = _InequalityQP(namespace) x0 = namespace.full((5,), 0.1, dtype=array(namespace, [0.0]).dtype) > corrected = solve(problem, x0, options=_opts(method, linsolve)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_corrections_solve.py:114: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([100.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_corrections_work_across_repeated_solve_routes[array_api_strict-krylov-gondzio] _ namespace = method = 'gondzio', linsolve = 'krylov' @pytest.mark.parametrize("method", ["mehrotra", "gondzio"]) @pytest.mark.parametrize("linsolve", ["krylov", "sparse"]) def test_corrections_work_across_repeated_solve_routes(namespace, method, linsolve): if linsolve == "sparse" and not capabilities(namespace).has_sparse_adapter: pytest.skip(f"no sparse adapter for {namespace.__name__!r}") problem = _InequalityQP(namespace) x0 = namespace.full((5,), 0.1, dtype=array(namespace, [0.0]).dtype) > corrected = solve(problem, x0, options=_opts(method, linsolve)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_corrections_solve.py:114: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([100.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _________ test_augmented_route_reaches_known_optimum[array_api_strict] _________ namespace = def test_augmented_route_reaches_known_optimum(namespace): for problem, x0 in _cases(namespace): > result = solve(problem, x0, options=_augmented_options()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_dense_augmented_route.py:71: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ______ test_augmented_route_agrees_with_condensed_route[array_api_strict] ______ namespace = def test_augmented_route_agrees_with_condensed_route(namespace): for problem, x0 in _cases(namespace): > augmented = solve(problem, x0, options=_augmented_options()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_dense_augmented_route.py:84: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____ test_augmented_route_reports_itself_in_linear_solver[array_api_strict] ____ namespace = def test_augmented_route_reports_itself_in_linear_solver(namespace): # HS35 has a genuine inequality border, so the augmented route actually # engages (as opposed to silently falling back to condensed). problem = HS35(namespace) > result = solve( problem, array(namespace, [0.5, 0.5, 0.5]), options=_augmented_options() ) tests/integration/test_dense_augmented_route.py:96: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_augmented_route_escapes_saddle_like_condensed[array_api_strict] _____ namespace = def test_augmented_route_escapes_saddle_like_condensed(namespace): # Same regression case as test_dense_nonconvex.py's Cholesky-guard test: # the augmented route's inertia check must reject the saddle just as # reliably, via a different mechanism (real inertia vs. Cholesky failure). problem, x0 = _saddle_trap_qp(namespace) > result = solve( problem, x0, options=Options( linsolve="dense", hessian="exact", max_iter=300, dense=DenseOptions(kkt_route="augmented"), ), ) tests/integration/test_dense_augmented_route.py:137: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __________ test_dense_route_pd_guard_escapes_saddle[array_api_strict] __________ namespace = def test_dense_route_pd_guard_escapes_saddle(namespace): problem, x0 = _saddle_trap_qp(namespace) > result = solve( problem, x0, options=Options(linsolve="dense", hessian="exact", max_iter=300) ) tests/integration/test_dense_nonconvex.py:49: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ________ test_measure_device_solve_populates_metrics[array_api_strict] _________ namespace = backend_name = 'array_api_strict' def test_measure_device_solve_populates_metrics(namespace, backend_name): problem = make_rt_like_problem(namespace, 60, n_structures=4, density=0.2, seed=0) x0 = namespace.full((60,), 0.01, dtype=namespace.float64) > m = measure_device_solve( problem, x0, ipax.Options(hessian="exact", linsolve="krylov"), backend=backend_name, route="krylov", ) tests/integration/test_device_efficiency.py:29: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ benchmarks/harness/__init__.py:794: in measure_device_solve ipax.solve(problem, x0, options=options) # type: ignore[arg-type] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([1500., 1500., 1500., 1500.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ______ test_sync_counter_restores_dunders_after_window[array_api_strict] _______ namespace = def test_sync_counter_restores_dunders_after_window(namespace): """The counter must not leave the array type permanently patched.""" problem = make_rt_like_problem(namespace, 40, n_structures=4, density=0.2, seed=0) x0 = namespace.full((40,), 0.01, dtype=namespace.float64) before = namespace.asarray([2.5])[0] assert float(before) == 2.5 > measure_device_solve( problem, x0, ipax.Options(hessian="exact", linsolve="dense"), backend="numpy", route="dense", ) tests/integration/test_device_efficiency.py:58: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ benchmarks/harness/__init__.py:794: in measure_device_solve ipax.solve(problem, x0, options=options) # type: ignore[arg-type] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([1000., 1000., 1000., 1000.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _______ test_hs1_rosenbrock_reaches_published_optimum[array_api_strict] ________ namespace = def test_hs1_rosenbrock_reaches_published_optimum(namespace): with implemented("HS subset"): > result = solve( HS1Rosenbrock(namespace), array(namespace, [-1.2, 1.0]), options=Options(hessian="lbfgs", linsolve="dense"), ) tests/integration/test_hock_schittkowski.py:39: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ________________ test_hs6_nonconvex_equality[array_api_strict] _________________ namespace = def test_hs6_nonconvex_equality(namespace): problem = HS6(namespace) > result = solve( problem, array(namespace, [-1.2, 1.0]), options=Options(**_EXACT_DENSE) ) tests/integration/test_hock_schittkowski.py:62: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([4.16666667], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ______________ test_hs7_log_objective_equality[array_api_strict] _______________ namespace = def test_hs7_log_objective_equality(namespace): problem = HS7(namespace) > result = solve( problem, array(namespace, [2.0, 2.0]), options=Options(**_EXACT_DENSE) ) tests/integration/test_hock_schittkowski.py:70: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([2.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____________ test_hs8_two_quadratic_equalities[array_api_strict] ______________ namespace = def test_hs8_two_quadratic_equalities(namespace): problem = HS8(namespace) > result = solve( problem, array(namespace, [2.0, 1.0]), options=Options(**_EXACT_DENSE) ) tests/integration/test_hock_schittkowski.py:78: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([25., 50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____________ test_hs35_inequality_qp_with_bounds[array_api_strict] _____________ namespace = def test_hs35_inequality_qp_with_bounds(namespace): problem = HS35(namespace) > result = solve( problem, array(namespace, [0.5, 0.5, 0.5]), options=Options(**_EXACT_DENSE) ) tests/integration/test_hock_schittkowski.py:86: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____________ test_hs43_rosen_suzuki_inequalities[array_api_strict] _____________ namespace = def test_hs43_rosen_suzuki_inequalities(namespace): problem = HS43(namespace) > result = solve( problem, array(namespace, [0.0, 0.0, 0.0, 0.0]), options=Options(**_EXACT_DENSE) ) tests/integration/test_hock_schittkowski.py:94: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1.], dtype=array_api_strict.float64), Array([100., 100., 50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _______ test_hs21_active_bound_with_linear_inequality[array_api_strict] ________ namespace = def test_hs21_active_bound_with_linear_inequality(namespace): problem = HS21(namespace) > result = solve( problem, array(namespace, [3.0, 1.0]), options=Options(**_EXACT_DENSE) ) tests/integration/test_hock_schittkowski.py:102: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([26., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ________ test_hs28_equality_qp_degenerate_multiplier[array_api_strict] _________ namespace = def test_hs28_equality_qp_degenerate_multiplier(namespace): problem = HS28(namespace) > result = solve( problem, array(namespace, [-1.0, 0.5, 0.5]), options=Options(**_EXACT_DENSE) ) tests/integration/test_hock_schittkowski.py:113: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:239: in compute_scaling _vector_factors(xp, as_operator(linear[0]), max_gradient, dtype, x0) ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([33.33333333], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____________ test_hs9_nonunique_periodic_optimum[array_api_strict] _____________ namespace = def test_hs9_nonunique_periodic_optimum(namespace): # The optimum is non-unique (periodic); assert the optimal value and KKT # satisfaction rather than a specific x*. problem = HS9(namespace) > result = solve( problem, array(namespace, [0.0, 0.0]), options=Options(**_EXACT_DENSE) ) tests/integration/test_hock_schittkowski.py:126: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:239: in compute_scaling _vector_factors(xp, as_operator(linear[0]), max_gradient, dtype, x0) ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([25.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _______________ test_hs71_full_constraint_mix[array_api_strict] ________________ namespace = def test_hs71_full_constraint_mix(namespace): # Published optimum carries ~9 significant figures; relax the primal/objective # tolerance accordingly while still gating KKT/feasibility tightly. problem = HS71(namespace) > result = solve( problem, array(namespace, [1.0, 5.0, 5.0, 1.0]), options=Options(**_EXACT_DENSE) ) tests/integration/test_hock_schittkowski.py:140: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([3., 3., 3., 3.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _______ test_unconstrained_quadratic_hits_closed_form[array_api_strict] ________ namespace = tol = {'rtol': 1e-09, 'atol': 1e-09} def test_unconstrained_quadratic_hits_closed_form(namespace, tol): Q = array(namespace, [[4.0, 1.0], [1.0, 3.0]]) b = array(namespace, [1.0, 2.0]) problem = UnconstrainedQuadratic(Q, b, namespace) x0 = array(namespace, [0.0, 0.0]) with implemented("dense solver"): > result = solve(problem, x0, options=Options(hessian="exact", linsolve="dense")) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_known_optima.py:30: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_unreachable_optimality_stops_acceptable_not_max_iter[array_api_strict] __ namespace = def test_unreachable_optimality_stops_acceptable_not_max_iter(namespace): # The default acceptable gate (IPOPT convention: 1e2 x tol for 15 # consecutive iterations) must stop a solve that cannot reach the optimality # conditions, instead of grinding to max_iter/max_time at an essentially # optimal point (S2MPJ v6: PALMER1A, NELSONLS, LOADBAL). Optimality is made # deterministically unreachable via f_tol: the optimum objective is # ~-0.68, so |f| <= 1e-12 never holds, while the KKT residuals settle far # below the acceptable 1e-6 within a few iterations. Q = array(namespace, [[4.0, 1.0], [1.0, 3.0]]) b = array(namespace, [1.0, 2.0]) problem = UnconstrainedQuadratic(Q, b, namespace) x0 = array(namespace, [0.0, 0.0]) from ipax.options import OptimalityConditionOptions options = Options( hessian="exact", linsolve="dense", optimality=OptimalityConditionOptions(f_tol=1e-12), ) > result = solve(problem, x0, options=options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_known_optima.py:59: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____ test_bound_constrained_qp_finds_known_active_bounds[array_api_strict] _____ namespace = def test_bound_constrained_qp_finds_known_active_bounds(namespace): problem = BoundConstrainedQP(namespace) x0 = array(namespace, [0.25, 0.75]) with implemented("bound handling"): > result = solve(problem, x0, options=Options(hessian="exact", linsolve="dense")) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_known_optima.py:75: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0. , 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _________ test_inequality_qp_finds_known_active_set[array_api_strict] __________ namespace = def test_inequality_qp_finds_known_active_set(namespace): class InequalityQP(Problem): @property def n_vars(self) -> int: return 1 def objective(self, x): return 0.5 * (x[0] - 2.0) * (x[0] - 2.0) def gradient(self, x): return namespace.stack((x[0] - 2.0,)) def ineq_constraints(self, x): return namespace.stack((x[0] - 1.0,)) def ineq_jacobian(self, x): del x return array(namespace, [[1.0]]) def lagrangian_hessian(self, x, y_eq, y_ineq, sigma=1.0): del y_eq, y_ineq return sigma * array(namespace, [[1.0 + 0.0 * x[0]]]) problem = InequalityQP() x0 = array(namespace, [0.5]) with implemented("inequality handling"): > result = solve(problem, x0, options=Options(hessian="exact", linsolve="dense")) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_known_optima.py:111: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([100.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _________ test_equality_constrained_qp_satisfies_kkt[array_api_strict] _________ namespace = def test_equality_constrained_qp_satisfies_kkt(namespace): problem = EqualityConstrainedQP(namespace) x0 = array(namespace, [0.9, 0.1]) with implemented("equalities"): > result = solve(problem, x0, options=Options(hessian="exact", linsolve="dense")) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_known_optima.py:125: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:239: in compute_scaling _vector_factors(xp, as_operator(linear[0]), max_gradient, dtype, x0) ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([100.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_mixed_linear_and_nonlinear_equalities_slice_hessian_multipliers[array_api_strict] _ namespace = def test_mixed_linear_and_nonlinear_equalities_slice_hessian_multipliers(namespace): class MixedEqualityProblem(Problem): @property def n_vars(self) -> int: return 2 def objective(self, x): return 0.5 * ((x[0] - 2.0) * (x[0] - 2.0) + x[1] * x[1]) def gradient(self, x): return namespace.stack((x[0] - 2.0, x[1])) def eq_constraints(self, x): return namespace.stack((x[0] * x[0] - 1.0,)) def eq_jacobian(self, x): return namespace.stack( (namespace.stack((2.0 * x[0], namespace.zeros_like(x[1]))),) ) def linear_eq(self): return array(namespace, [[0.0, 1.0]]), array(namespace, [0.0]) def lagrangian_hessian(self, x, y_eq, y_ineq, sigma=1.0): del y_ineq assert int(y_eq.shape[0]) == 1 zero = namespace.zeros_like(x[0]) h00 = sigma + 2.0 * y_eq[0] h11 = sigma + zero return namespace.stack( (namespace.stack((h00, zero)), namespace.stack((zero, h11))) ) > result = solve( MixedEqualityProblem(), array(namespace, [1.2, 0.25]), options=Options(hessian="exact", linsolve="dense"), ) tests/integration/test_known_optima.py:174: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([41.66666667], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ______ test_fixed_variable_solves_via_bound_relaxation[array_api_strict] _______ namespace = def test_fixed_variable_solves_via_bound_relaxation(namespace): # A fixed variable (x_L == x_U) has no strict barrier interior; without bound # relaxation the first Newton step is non-finite and the solve fails. Here x1 # is pinned at 2, so the optimum is x0=3, x1=2, f = 0.5·(0 + (2-5)²) = 4.5. class FixedVarProblem(Problem): @property def n_vars(self) -> int: return 2 def bounds(self): return array(namespace, [-10.0, 2.0]), array(namespace, [10.0, 2.0]) def objective(self, x): return 0.5 * ((x[0] - 3.0) ** 2 + (x[1] - 5.0) ** 2) def gradient(self, x): return namespace.stack((x[0] - 3.0, x[1] - 5.0)) def lagrangian_hessian(self, x, y_eq, y_ineq, sigma=1.0): del y_eq, y_ineq return sigma * namespace.eye(2, dtype=x.dtype) > result = solve( FixedVarProblem(), array(namespace, [0.0, 2.0]), options=Options(hessian="exact", linsolve="dense"), ) tests/integration/test_known_optima.py:206: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0., 2.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _________ test_infeasible_problem_reports_infeasible[array_api_strict] _________ namespace = def test_infeasible_problem_reports_infeasible(namespace): class InfeasibleBounds(Problem): @property def n_vars(self) -> int: return 1 def bounds(self): return array(namespace, [1.0]), array(namespace, [0.0]) def objective(self, x): return namespace.sum(x * x) def gradient(self, x): return 2.0 * x with implemented("restoration"): > result = solve(InfeasibleBounds(), array(namespace, [0.5]), options=Options()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_known_optima.py:233: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:161: in solve constraint_violation=_bound_violation(xp, x0, lower, upper), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/solve.py:89: in _bound_violation violation = max(violation, float(xp.max(xp.maximum(lower - x, zero)))) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0.5], dtype=array_api_strict.float64), Array([0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _______ test_inconsistent_equalities_report_infeasible[array_api_strict] _______ namespace = def test_inconsistent_equalities_report_infeasible(namespace): > result = solve(InfeasibleEqualities(namespace), array(namespace, [0.5])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_known_optima.py:244: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([100., 100.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ______ test_result_history_tracks_monotone_kkt_progress[array_api_strict] ______ namespace = def test_result_history_tracks_monotone_kkt_progress(namespace): Q = array(namespace, [[2.0, 0.0], [0.0, 1.0]]) b = array(namespace, [1.0, -1.0]) problem = UnconstrainedQuadratic(Q, b, namespace) with implemented("driver iteration history"): > result = solve(problem, array(namespace, [10.0, -10.0]), options=Options()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_known_optima.py:257: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____________ test_krylov_unconstrained_quadratic[array_api_strict] _____________ namespace = def test_krylov_unconstrained_quadratic(namespace): Q = array(namespace, [[4.0, 1.0], [1.0, 3.0]]) b = array(namespace, [1.0, 2.0]) problem = UnconstrainedQuadratic(Q, b, namespace) > result = solve(problem, array(namespace, [0.0, 0.0]), options=_krylov_options()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_krylov_solve.py:45: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ______________ test_krylov_bound_constrained_qp[array_api_strict] ______________ namespace = def test_krylov_bound_constrained_qp(namespace): problem = BoundConstrainedQP(namespace) > result = solve(problem, array(namespace, [0.25, 0.75]), options=_krylov_options()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_krylov_solve.py:54: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0. , 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _________________ test_krylov_inequality_qp[array_api_strict] __________________ namespace = def test_krylov_inequality_qp(namespace): class InequalityQP(Problem): @property def n_vars(self) -> int: return 1 def objective(self, x): return 0.5 * (x[0] - 2.0) * (x[0] - 2.0) def gradient(self, x): return namespace.stack((x[0] - 2.0,)) def ineq_constraints(self, x): return namespace.stack((x[0] - 1.0,)) def ineq_jacobian(self, x): del x return array(namespace, [[1.0]]) def lagrangian_hessian(self, x, y_eq, y_ineq, sigma=1.0): del y_eq, y_ineq return sigma * array(namespace, [[1.0 + 0.0 * x[0]]]) > result = solve(InequalityQP(), array(namespace, [0.5]), options=_krylov_options()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_krylov_solve.py:83: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([100.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __ test_krylov_jacobi_preconditioner_cuts_total_iterations[array_api_strict] ___ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa9d47710> def test_krylov_jacobi_preconditioner_cuts_total_iterations(namespace, monkeypatch): """End-to-end scaling win: Jacobi engages mid-solve on the condensed system. An ill-conditioned (κ ≈ 1000) bound-constrained QP with a diagonal Hessian that *exposes* its diagonal, so the condensed operator builds a Jacobi preconditioner matrix-free. Preconditioning must collapse the total CG work. """ n = 24 diag = array(namespace, [1.0 + (1000.0 - 1.0) * k / (n - 1) for k in range(n)]) b = array(namespace, [0.5 if k % 2 else -0.5 for k in range(n)]) hessian = namespace.eye(n, dtype=diag.dtype) * diag class IllConditionedBoundedQP(Problem): @property def n_vars(self) -> int: return n def bounds(self): return namespace.zeros((n,), dtype=diag.dtype), None def objective(self, x): return 0.5 * namespace.sum(diag * x * x) - namespace.sum(b * x) def gradient(self, x): return diag * x - b def lagrangian_hessian(self, x, y_eq, y_ineq, sigma=1.0): del x, y_eq, y_ineq return sigma * hessian problem = IllConditionedBoundedQP() x0 = namespace.ones((n,), dtype=diag.dtype) original_solve = KrylovSolver.solve def run(preconditioner: str): counts: list[int] = [] def counting_solve(self, rhs): result = original_solve(self, rhs) counts.append(self.last_iterations) return result monkeypatch.setattr(KrylovSolver, "solve", counting_solve) result = solve( problem, x0, options=Options( hessian="exact", linsolve="krylov", krylov=KrylovOptions(preconditioner=preconditioner), ), ) monkeypatch.undo() return result, sum(counts) > none_result, none_iters = run("none") ^^^^^^^^^^^ tests/integration/test_krylov_solve.py:144: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/integration/test_krylov_solve.py:132: in run result = solve( ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],...0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ______ test_krylov_equality_constrained_qp_uses_minres[array_api_strict] _______ namespace = def test_krylov_equality_constrained_qp_uses_minres(namespace): """Equalities form the indefinite saddle — the CG path falls back to MINRES.""" problem = EqualityConstrainedQP(namespace) > result = solve(problem, array(namespace, [0.9, 0.1]), options=_krylov_options()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_krylov_solve.py:157: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:239: in compute_scaling _vector_factors(xp, as_operator(linear[0]), max_gradient, dtype, x0) ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([100.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___________ test_gmres_solves_bound_constrained_qp[array_api_strict] ___________ namespace = def test_gmres_solves_bound_constrained_qp(namespace): """The GMRES route drives the full IPM to the same optimum as CG/MINRES.""" problem = BoundConstrainedQP(namespace) options = Options( hessian="exact", linsolve="krylov", krylov=KrylovOptions(method="gmres"), ) > result = solve(problem, array(namespace, [0.25, 0.75]), options=options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_krylov_solve.py:175: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0. , 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___ test_lbfgs_preconditioner_solves_bound_constrained_qp[array_api_strict] ____ namespace = def test_lbfgs_preconditioner_solves_bound_constrained_qp(namespace): """End-to-end L-BFGS Hessian + L-BFGS-aware preconditioner on the Krylov route. The problem supplies no analytic Hessian, so ``hessian="lbfgs"`` actually builds the compact L-BFGS operator the preconditioner then inverts. """ reference = BoundConstrainedQP(namespace) lower, upper = reference.bounds() def objective(x): diff = x - reference.center return 0.5 * namespace.sum(diff * diff) def gradient(x): return x - reference.center problem = FunctionProblem(2, objective, gradient=gradient, bounds=(lower, upper)) options = Options( hessian="lbfgs", linsolve="krylov", krylov=KrylovOptions(preconditioner="lbfgs"), ) > result = solve(problem, array(namespace, [0.25, 0.75]), options=options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_krylov_solve.py:204: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0. , 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ________ test_krylov_solves_synthetic_rt_like_problem[array_api_strict] ________ namespace = def test_krylov_solves_synthetic_rt_like_problem(namespace): """A block-structured, matrix-free RT-like NLP solves to KKT.""" n = 200 problem = make_rt_like_problem(namespace, n, n_structures=6, density=0.2, seed=3) x0 = namespace.full((n,), 0.01, dtype=array(namespace, [0.0]).dtype) > result = solve(problem, x0, options=_krylov_options()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_krylov_solve.py:219: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1., 1., 1.], dtype=array_api_strict.float64), Array([3400., 3400., 3300., 3300., 3300., 3300.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____ test_krylov_solve_never_materializes_the_kkt_matrix[array_api_strict] _____ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa9857800> def test_krylov_solve_never_materializes_the_kkt_matrix(namespace, monkeypatch): """The headline matrix-free guarantee: no ``n×n`` KKT matrix is ever formed. Densifying an operator goes through ``LinearOperator.matmat`` (the dense solver materializes ``N`` that way). The Krylov route uses only matvecs, so its ``matmat`` count must be exactly zero — in contrast to the dense route. """ n = 150 problem = make_rt_like_problem(namespace, n, n_structures=5, density=0.2, seed=1) x0 = namespace.full((n,), 0.01, dtype=array(namespace, [0.0]).dtype) counter = {"matmat": 0} original_matmat = LinearOperator.matmat def counting_matmat(self, V): counter["matmat"] += 1 return original_matmat(self, V) monkeypatch.setattr(LinearOperator, "matmat", counting_matmat) > krylov_result = solve( problem, x0, options=Options(hessian="exact", linsolve="krylov") ) tests/integration/test_krylov_solve.py:247: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1., 1.], dtype=array_api_strict.float64), Array([3000., 3000., 3000., 3000., 3000.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___________ test_krylov_operator_errors_propagate[array_api_strict] ____________ namespace = def test_krylov_operator_errors_propagate(namespace): """User/operator callback bugs are not swallowed as numerical failures.""" class BadHessianQP(Problem): @property def n_vars(self) -> int: return 1 def objective(self, x): return 0.5 * (x[0] - 1.0) * (x[0] - 1.0) def gradient(self, x): return namespace.stack((x[0] - 1.0,)) def lagrangian_hessian(self, x, y_eq, y_ineq, sigma=1.0): del x, y_eq, y_ineq, sigma def matvec(v): del v raise ValueError("bad Hessian matvec") return MatrixFreeJacobian((1, 1), matvec, matvec) with pytest.raises(ValueError, match="bad Hessian matvec"): > solve( BadHessianQP(), array(namespace, [0.0]), options=Options(hessian="exact", linsolve="krylov"), ) tests/integration/test_krylov_solve.py:288: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____________ test_lower_bounded_linear_inequality[array_api_strict] ____________ namespace = def test_lower_bounded_linear_inequality(namespace): problem = _LowerBoundedQP(namespace) > result = solve(problem, array(namespace, [0.0, 0.0]), options=_EXACT_DENSE) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_linear_inequalities.py:148: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([100.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____________ test_two_sided_range_upper_active[array_api_strict] ______________ namespace = def test_two_sided_range_upper_active(namespace): problem = _RangeBoxQP(namespace) > result = solve(problem, array(namespace, [1.5, 0.0]), options=_EXACT_DENSE) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_linear_inequalities.py:160: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([100., 100.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ________ test_mixed_nonlinear_and_linear_inequalities[array_api_strict] ________ namespace = def test_mixed_nonlinear_and_linear_inequalities(namespace): problem = _MixedIneqQP(namespace) > result = solve(problem, array(namespace, [0.5, 0.5]), options=_EXACT_DENSE) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_linear_inequalities.py:171: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([100., 100.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ________ test_linear_inequality_with_gradient_scaling[array_api_strict] ________ namespace = def test_linear_inequality_with_gradient_scaling(namespace): problem = _LowerBoundedQP(namespace) > result = solve( problem, array(namespace, [0.0, 0.0]), options=Options(hessian="exact", linsolve="dense", scaling="gradient-based"), ) tests/integration/test_linear_inequalities.py:182: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([100.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ______ test_hs21_via_linear_ineq_matches_known_optimum[array_api_strict] _______ namespace = def test_hs21_via_linear_ineq_matches_known_optimum(namespace): problem = HS21(namespace) > result = solve(problem, array(namespace, [3.0, 1.0]), options=_EXACT_DENSE) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_linear_inequalities.py:193: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([26., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_matrix_free_linear_ineq_is_lowered_and_solved[array_api_strict] _____ namespace = def test_matrix_free_linear_ineq_is_lowered_and_solved(namespace): # Formerly rejected (NotImplementedError): an operator-valued matrix is now # lowered through a signed row selection. ``0.5 ≤ x ≤ 1`` with the # objective pulling x to 0 ⇒ the lower rows bind at ``(0.5, 0.5)``. from ipax.backend.operators import Identity class _MatrixFreeLinearIneq(Problem): @property def n_vars(self) -> int: return 2 def objective(self, x): return namespace.sum(x * x) def gradient(self, x): return 2.0 * x def linear_ineq(self): return ( Identity(2), array(namespace, [0.5, 0.5]), array(namespace, [1.0, 1.0]), ) > result = solve(_MatrixFreeLinearIneq(), array(namespace, [0.75, 0.75])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_linear_inequalities.py:226: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:177: in solve resolved = lower_linear_inequalities(resolved, x0, xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:373: in lower_linear_inequalities lowered_jac, offset = _lower_two_sided(matrix, lower, upper, xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:275: in _lower_two_sided return _lower_wrapped(matrix, lower, upper, xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:204: in _lower_wrapped op = _SignedRowSelection(matrix, finite_l, finite_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1493: in __init__ self._expand_lower = xp.cumulative_sum(lower_int) * lower_int ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1, 1], dtype=array_api_strict.int64),), kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function cumulative_sum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _______ test_routes_record_the_default_auto_selection[array_api_strict] ________ namespace = def test_routes_record_the_default_auto_selection(namespace): > result = solve(_BoundQP(namespace), namespace.full((4,), 0.4)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_result_routes.py:66: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([0., 0., 0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____________ test_routes_reflect_forced_krylov[array_api_strict] ______________ namespace = def test_routes_reflect_forced_krylov(namespace): > result = solve( _BoundQP(namespace), namespace.full((4,), 0.4), options=Options(linsolve="krylov"), ) tests/integration/test_result_routes.py:83: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([0., 0., 0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ________ test_routes_reflect_the_dense_augmented_form[array_api_strict] ________ namespace = def test_routes_reflect_the_dense_augmented_form(namespace): > result = solve( _IneqQP(namespace), namespace.full((4,), 0.4), options=Options( linsolve="dense", dense=DenseOptions(kkt_route="augmented"), hessian="exact", ), ) tests/integration/test_result_routes.py:118: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([0., 0., 0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ________ test_routes_echo_configured_algorithm_pieces[array_api_strict] ________ namespace = def test_routes_echo_configured_algorithm_pieces(namespace): > result = solve( _IneqQP(namespace), namespace.full((4,), 0.4), options=Options(scaling="none", corrections="mehrotra"), ) tests/integration/test_result_routes.py:134: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([0., 0., 0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___________ test_routes_absent_on_pre_solver_exits[array_api_strict] ___________ namespace = def test_routes_absent_on_pre_solver_exits(namespace): class _InfeasibleBounds(_BoundQP): def bounds(self): xp = self._xp return xp.ones((4,), dtype=xp.float64), xp.zeros((4,), dtype=xp.float64) > result = solve(_InfeasibleBounds(namespace), namespace.full((4,), 0.4)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_result_routes.py:152: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:161: in solve constraint_violation=_bound_violation(xp, x0, lower, upper), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/solve.py:89: in _bound_violation violation = max(violation, float(xp.max(xp.maximum(lower - x, zero)))) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0.6, 0.6, 0.6, 0.6], dtype=array_api_strict.float64), Array([0., 0., 0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____________ test_format_result_reports_routes[array_api_strict] ______________ namespace = def test_format_result_reports_routes(namespace): from ipax._logging import format_result > result = solve(_BoundQP(namespace), namespace.full((4,), 0.4)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_result_routes.py:160: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([0., 0., 0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __________ test_badly_scaled_qp_solves_with_scaling[array_api_strict] __________ namespace = def test_badly_scaled_qp_solves_with_scaling(namespace): xp = namespace problem = _badly_scaled_qp(xp) x0 = array(xp, [1.0, 1.0]) with implemented("dense solver"): > result = solve(problem, x0, options=_scaled_options("dense")) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_scaling_solve.py:46: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:239: in compute_scaling _vector_factors(xp, as_operator(linear[0]), max_gradient, dtype, x0) ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([100.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _______ test_options_accepts_simple_scaling_shorthand[array_api_strict] ________ namespace = def test_options_accepts_simple_scaling_shorthand(namespace): xp = namespace problem = _badly_scaled_qp(xp) x0 = array(xp, [1.0, 1.0]) options = Options( hessian="exact", linsolve="dense", scaling="gradient-based", ) > result = solve(problem, x0, options=options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_scaling_solve.py:69: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:239: in compute_scaling _vector_factors(xp, as_operator(linear[0]), max_gradient, dtype, x0) ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([100.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____ test_history_and_callback_use_original_problem_units[array_api_strict] ____ namespace = def test_history_and_callback_use_original_problem_units(namespace): xp = namespace problem = _badly_scaled_qp(xp) x0 = array(xp, [1.0, 1.0]) seen = [] > result = solve( problem, x0, options=_scaled_options("dense"), callback=lambda info: seen.append(info), ) tests/integration/test_scaling_solve.py:84: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:239: in compute_scaling _vector_factors(xp, as_operator(linear[0]), max_gradient, dtype, x0) ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([100.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_callback_slacks_and_inequality_duals_use_original_units[array_api_strict] _ namespace = def test_callback_slacks_and_inequality_duals_use_original_units(namespace): xp = namespace jac = array(xp, [[1000.0]]) problem = FunctionProblem( 1, lambda x: 0.5 * (x[0] - 2.0) ** 2, gradient=lambda x: xp.stack((x[0] - 2.0,)), ineq_constraints=lambda x: xp.stack((1000.0 * (x[0] - 1.0),)), ineq_jacobian=lambda x: jac, lagrangian_hessian=lambda x, ye, yi, sigma: sigma * xp.eye(1), ) seen = [] > result = solve( problem, array(xp, [0.5]), options=_scaled_options("dense"), callback=lambda info: seen.append(info) or True, ) tests/integration/test_scaling_solve.py:110: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([0.1], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____ test_scaling_off_by_default_leaves_problem_unscaled[array_api_strict] _____ namespace = def test_scaling_off_by_default_leaves_problem_unscaled(namespace): # The default Options does not scale; the same problem still solves (it is # convex), confirming scaling is opt-in and the result space is identical. xp = namespace problem = _badly_scaled_qp(xp) x0 = array(xp, [1.0, 1.0]) with implemented("dense solver"): > result = solve(problem, x0, options=Options(hessian="exact", linsolve="dense")) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_scaling_solve.py:136: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:239: in compute_scaling _vector_factors(xp, as_operator(linear[0]), max_gradient, dtype, x0) ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([100.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _________ test_scaling_matches_across_solver_routes[array_api_strict] __________ namespace = def test_scaling_matches_across_solver_routes(namespace): # The scaled problem must agree through the matrix-free Krylov route, which # exercises _RowScaled.matvec/rmatvec/gram on the linear-equality Jacobian. xp = namespace problem = _badly_scaled_qp(xp) x0 = array(xp, [1.0, 1.0]) with implemented("krylov solver"): > result = solve(problem, x0, options=_scaled_options("krylov")) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_scaling_solve.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:239: in compute_scaling _vector_factors(xp, as_operator(linear[0]), max_gradient, dtype, x0) ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([100.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_warm_start_from_optimum_converges_immediately[array_api_strict] _____ namespace = def test_warm_start_from_optimum_converges_immediately(namespace): xp = namespace problem = BoundConstrainedQP(xp) x0 = array(xp, [0.25, 0.75]) with implemented("dense solver"): > cold = solve(problem, x0, options=_DENSE) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_warm_start_solve.py:20: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0. , 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __________ test_warm_start_with_scaling_round_trips[array_api_strict] __________ namespace = def test_warm_start_with_scaling_round_trips(namespace): # The original-units warm start must be rescaled into the scaled subproblem, # so a warm re-solve still lands on the correct unscaled multiplier. xp = namespace problem = _badly_scaled_qp(xp) opts = Options( hessian="exact", linsolve="dense", scaling=ScalingOptions(method="gradient-based"), ) x0 = array(xp, [1.0, 1.0]) with implemented("dense solver"): > cold = solve(problem, x0, options=opts) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_warm_start_solve.py:63: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:239: in compute_scaling _vector_factors(xp, as_operator(linear[0]), max_gradient, dtype, x0) ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([100.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___ test_warm_start_with_scaling_round_trips_inequalities[array_api_strict] ____ namespace = def test_warm_start_with_scaling_round_trips_inequalities(namespace): # The inequality counterpart of the round-trip above: the warm start's # slacks and inequality multipliers are given in original units and must be # rescaled into the scaled subproblem (s̃ = d_ineq·s, ỹ = y·s_f/d_ineq). xp = namespace problem = _badly_scaled_ineq_qp(xp) opts = Options( hessian="exact", linsolve="dense", scaling=ScalingOptions(method="gradient-based"), ) x0 = array(xp, [1.0, 1.0]) with implemented("dense solver"): > cold = solve(problem, x0, options=opts) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/integration/test_warm_start_solve.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([100.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _________ test_warm_start_dimension_mismatch_raises[array_api_strict] __________ namespace = def test_warm_start_dimension_mismatch_raises(namespace): import pytest xp = namespace problem = BoundConstrainedQP(xp) x0 = array(xp, [0.25, 0.75]) bad = WarmStart(z_lower=array(xp, [1.0, 2.0, 3.0])) # n is 2, not 3 with pytest.raises(ValueError, match="z_lower has length 3, expected 2"): > solve(problem, x0, options=_DENSE, warm_start=bad) tests/integration/test_warm_start_solve.py:125: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0. , 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __ test_driver_derives_theta_min_from_the_initial_violation[array_api_strict] __ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffaaa99780> def test_driver_derives_theta_min_from_the_initial_violation(namespace, monkeypatch): # HS71 starts infeasible, so θ(x_0) > 1 and θ_min must scale with it rather # than sit at the bare 1e-4·1 floor. # # θ(x_0) is observed through the driver's own ``_theta_l1`` rather than read # off ``result.history``: the history records ``_theta`` — the *original # problem's* ∞-norm — while the filter (and so θ_min) runs on the ℓ1 norm # ‖(c, g+s)‖₁. The two coincide at this particular x_0, which would let a # wrong wiring pass unnoticed. seen = _spy_theta_min(monkeypatch) thetas: list[float] = [] original_theta_l1 = IPMDriver._theta_l1 def spy_theta(self, *args, **kwargs): value = original_theta_l1(self, *args, **kwargs) thetas.append(value) return value monkeypatch.setattr(IPMDriver, "_theta_l1", spy_theta) > result = solve( HS71(namespace), array(namespace, [1.0, 5.0, 5.0, 1.0]), options=Options(hessian="exact", linsolve="dense"), ) tests/regression/test_adaptive_alpha_min.py:70: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([3., 3., 3., 3.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_theta_min_floors_at_one_for_a_feasible_start[array_api_strict] ______ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffaaa99010> def test_theta_min_floors_at_one_for_a_feasible_start(namespace, monkeypatch): # max(1, θ(x_0)) — a feasible or near-feasible start must not collapse θ_min # toward 0, which would permanently disable the eq. (23) switching term. seen = _spy_theta_min(monkeypatch) > result = solve( BoundConstrainedQP(namespace), array(namespace, [0.25, 0.75]), options=Options(hessian="exact", linsolve="dense"), ) tests/regression/test_adaptive_alpha_min.py:90: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0. , 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____ test_dense_route_never_materializes_bound_only_lbfgs[array_api_strict] ____ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa97dfa10> def test_dense_route_never_materializes_bound_only_lbfgs(namespace, monkeypatch): def _boom(self, *args, **kwargs): raise AssertionError("bound-only L-BFGS must use the structured solve") monkeypatch.setattr(DenseSolver, "_materialize_and_guard", _boom) problem = _BoxLeastSquares(namespace) > result = solve( problem, _x0(namespace, problem.n_vars), options=Options(linsolve="dense", hessian="lbfgs"), ) tests/regression/test_bound_only_lbfgs_structured_routes.py:68: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=array_api_strict.float64), Array([0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __ test_krylov_route_uses_exact_lbfgs_inverse_on_bound_only[array_api_strict] __ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa9873230> def test_krylov_route_uses_exact_lbfgs_inverse_on_bound_only(namespace, monkeypatch): iterations: list[int] = [] original = KrylovSolver.solve def _spy(self, rhs): out = original(self, rhs) iterations.append(self.last_iterations) return out monkeypatch.setattr(KrylovSolver, "solve", _spy) problem = _BoxLeastSquares(namespace) > result = solve( problem, _x0(namespace, problem.n_vars), options=Options(linsolve="krylov", hessian="lbfgs"), ) tests/regression/test_bound_only_lbfgs_structured_routes.py:88: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=array_api_strict.float64), Array([0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ________ test_structured_routes_agree_with_each_other[array_api_strict] ________ namespace = tol = {'rtol': 1e-09, 'atol': 1e-09} def test_structured_routes_agree_with_each_other(namespace, tol): problem = _BoxLeastSquares(namespace) x0 = _x0(namespace, problem.n_vars) > dense = solve(problem, x0, options=Options(linsolve="dense", hessian="lbfgs")) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/regression/test_bound_only_lbfgs_structured_routes.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=array_api_strict.float64), Array([0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_max_iter_within_relaxed_tolerance_reports_acceptable[array_api_strict] __ namespace = def test_max_iter_within_relaxed_tolerance_reports_acceptable(namespace): > best_dual = _reference_best_dual(namespace) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/regression/test_budget_exhaustion_acceptable.py:73: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/regression/test_budget_exhaustion_acceptable.py:28: in _reference_best_dual result = solve( ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0. , 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ______ test_max_iter_far_from_tolerance_stays_max_iter[array_api_strict] _______ namespace = def test_max_iter_far_from_tolerance_stays_max_iter(namespace): > best_dual = _reference_best_dual(namespace) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/regression/test_budget_exhaustion_acceptable.py:83: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/regression/test_budget_exhaustion_acceptable.py:28: in _reference_best_dual result = solve( ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0. , 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_unconstrained_lbfgs_evaluates_each_point_once[array_api_strict] _____ namespace = def test_unconstrained_lbfgs_evaluates_each_point_once(namespace): n = 20 inner = _Rosenbrock(namespace, n) problem = _Counting(inner) x0 = array(namespace, [-1.2, 1.0] * (n // 2)) > result = solve(problem, x0, options=Options()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/regression/test_callback_evaluation_counts.py:107: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=array_api...0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_constrained_without_soc_evaluates_each_point_once[array_api_strict-HS43-ineq] _ namespace = factory = , x0 = [0.0, 0.0, 0.0, 0.0] @pytest.mark.parametrize(("factory", "x0"), _CASES, ids=_IDS) def test_constrained_without_soc_evaluates_each_point_once(namespace, factory, x0): """With second-order corrections off, the only points visited are x0 and the line-search trials — so that is the evaluation budget.""" problem = _Counting(factory(namespace)) options = Options(line_search=LineSearchOptions(max_soc=0)) > result = solve(problem, array(namespace, x0), options=options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/regression/test_callback_evaluation_counts.py:133: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1.], dtype=array_api_strict.float64), Array([100., 100., 50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_constrained_without_soc_evaluates_each_point_once[array_api_strict-HS7-eq] _ namespace = factory = , x0 = [2.0, 2.0] @pytest.mark.parametrize(("factory", "x0"), _CASES, ids=_IDS) def test_constrained_without_soc_evaluates_each_point_once(namespace, factory, x0): """With second-order corrections off, the only points visited are x0 and the line-search trials — so that is the evaluation budget.""" problem = _Counting(factory(namespace)) options = Options(line_search=LineSearchOptions(max_soc=0)) > result = solve(problem, array(namespace, x0), options=options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/regression/test_callback_evaluation_counts.py:133: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([2.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_constrained_without_soc_evaluates_each_point_once[array_api_strict-HS71-eq-ineq-bounds] _ namespace = factory = , x0 = [1.0, 5.0, 5.0, 1.0] @pytest.mark.parametrize(("factory", "x0"), _CASES, ids=_IDS) def test_constrained_without_soc_evaluates_each_point_once(namespace, factory, x0): """With second-order corrections off, the only points visited are x0 and the line-search trials — so that is the evaluation budget.""" problem = _Counting(factory(namespace)) options = Options(line_search=LineSearchOptions(max_soc=0)) > result = solve(problem, array(namespace, x0), options=options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/regression/test_callback_evaluation_counts.py:133: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([3., 3., 3., 3.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_constrained_with_soc_bounded_by_visited_points[array_api_strict-HS43-ineq] _ namespace = factory = , x0 = [0.0, 0.0, 0.0, 0.0] @pytest.mark.parametrize(("factory", "x0"), _CASES, ids=_IDS) def test_constrained_with_soc_bounded_by_visited_points(namespace, factory, x0): """Each second-order correction probes one new point (its residual forms the corrected RHS, W&B 2006 §2.4) and the accepted SOC point is one more; nothing beyond those and the trials may be evaluated.""" problem = _Counting(factory(namespace)) > result = solve(problem, array(namespace, x0), options=Options()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/regression/test_callback_evaluation_counts.py:152: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1.], dtype=array_api_strict.float64), Array([100., 100., 50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_constrained_with_soc_bounded_by_visited_points[array_api_strict-HS7-eq] _ namespace = factory = , x0 = [2.0, 2.0] @pytest.mark.parametrize(("factory", "x0"), _CASES, ids=_IDS) def test_constrained_with_soc_bounded_by_visited_points(namespace, factory, x0): """Each second-order correction probes one new point (its residual forms the corrected RHS, W&B 2006 §2.4) and the accepted SOC point is one more; nothing beyond those and the trials may be evaluated.""" problem = _Counting(factory(namespace)) > result = solve(problem, array(namespace, x0), options=Options()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/regression/test_callback_evaluation_counts.py:152: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([2.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_constrained_with_soc_bounded_by_visited_points[array_api_strict-HS71-eq-ineq-bounds] _ namespace = factory = , x0 = [1.0, 5.0, 5.0, 1.0] @pytest.mark.parametrize(("factory", "x0"), _CASES, ids=_IDS) def test_constrained_with_soc_bounded_by_visited_points(namespace, factory, x0): """Each second-order correction probes one new point (its residual forms the corrected RHS, W&B 2006 §2.4) and the accepted SOC point is one more; nothing beyond those and the trials may be evaluated.""" problem = _Counting(factory(namespace)) > result = solve(problem, array(namespace, x0), options=Options()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/regression/test_callback_evaluation_counts.py:152: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([3., 3., 3., 3.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____________ test_no_corrector_monotone_passes[array_api_strict] ______________ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa99a9710> def test_no_corrector_monotone_passes(namespace, monkeypatch): counts = _instrument(monkeypatch) > result = _run(namespace, counts, corrections="none", mu_schedule="monotone") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/regression/test_corrector_operator_counts.py:204: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/regression/test_corrector_operator_counts.py:166: in _run return solve( ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],...28571, 34.48275862, 33.33333333, 32.25806452, 31.25 , 30.3030303 ], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _______ test_mehrotra_corrector_passes[array_api_strict-monotone-filter] _______ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffaaabb690> mu_schedule = 'monotone', globalization = 'filter' @pytest.mark.parametrize("globalization", ["filter", "breedveld"]) @pytest.mark.parametrize("mu_schedule", ["monotone", "probing"]) def test_mehrotra_corrector_passes(namespace, monkeypatch, mu_schedule, globalization): counts = _instrument(monkeypatch) > result = _run( namespace, counts, globalization=globalization, corrections="mehrotra", mu_schedule=mu_schedule, ) tests/regression/test_corrector_operator_counts.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/regression/test_corrector_operator_counts.py:166: in _run return solve( ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],...28571, 34.48275862, 33.33333333, 32.25806452, 31.25 , 30.3030303 ], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_mehrotra_corrector_passes[array_api_strict-monotone-breedveld] ______ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa99a9240> mu_schedule = 'monotone', globalization = 'breedveld' @pytest.mark.parametrize("globalization", ["filter", "breedveld"]) @pytest.mark.parametrize("mu_schedule", ["monotone", "probing"]) def test_mehrotra_corrector_passes(namespace, monkeypatch, mu_schedule, globalization): counts = _instrument(monkeypatch) > result = _run( namespace, counts, globalization=globalization, corrections="mehrotra", mu_schedule=mu_schedule, ) tests/regression/test_corrector_operator_counts.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/regression/test_corrector_operator_counts.py:166: in _run return solve( ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],...28571, 34.48275862, 33.33333333, 32.25806452, 31.25 , 30.3030303 ], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _______ test_mehrotra_corrector_passes[array_api_strict-probing-filter] ________ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa99a9470> mu_schedule = 'probing', globalization = 'filter' @pytest.mark.parametrize("globalization", ["filter", "breedveld"]) @pytest.mark.parametrize("mu_schedule", ["monotone", "probing"]) def test_mehrotra_corrector_passes(namespace, monkeypatch, mu_schedule, globalization): counts = _instrument(monkeypatch) > result = _run( namespace, counts, globalization=globalization, corrections="mehrotra", mu_schedule=mu_schedule, ) tests/regression/test_corrector_operator_counts.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/regression/test_corrector_operator_counts.py:166: in _run return solve( ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],...28571, 34.48275862, 33.33333333, 32.25806452, 31.25 , 30.3030303 ], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ______ test_mehrotra_corrector_passes[array_api_strict-probing-breedveld] ______ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa99ab7e0> mu_schedule = 'probing', globalization = 'breedveld' @pytest.mark.parametrize("globalization", ["filter", "breedveld"]) @pytest.mark.parametrize("mu_schedule", ["monotone", "probing"]) def test_mehrotra_corrector_passes(namespace, monkeypatch, mu_schedule, globalization): counts = _instrument(monkeypatch) > result = _run( namespace, counts, globalization=globalization, corrections="mehrotra", mu_schedule=mu_schedule, ) tests/regression/test_corrector_operator_counts.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/regression/test_corrector_operator_counts.py:166: in _run return solve( ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],...28571, 34.48275862, 33.33333333, 32.25806452, 31.25 , 30.3030303 ], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____________ test_gondzio_corrector_passes[array_api_strict-filter] ____________ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa99abf50> globalization = 'filter' @pytest.mark.parametrize("globalization", ["filter", "breedveld"]) def test_gondzio_corrector_passes(namespace, monkeypatch, globalization): counts = _instrument(monkeypatch) > result = _run( namespace, counts, globalization=globalization, corrections="gondzio", mu_schedule="probing", ) tests/regression/test_corrector_operator_counts.py:247: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/regression/test_corrector_operator_counts.py:166: in _run return solve( ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],...28571, 34.48275862, 33.33333333, 32.25806452, 31.25 , 30.3030303 ], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __________ test_gondzio_corrector_passes[array_api_strict-breedveld] ___________ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffaaabac80> globalization = 'breedveld' @pytest.mark.parametrize("globalization", ["filter", "breedveld"]) def test_gondzio_corrector_passes(namespace, monkeypatch, globalization): counts = _instrument(monkeypatch) > result = _run( namespace, counts, globalization=globalization, corrections="gondzio", mu_schedule="probing", ) tests/regression/test_corrector_operator_counts.py:247: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/regression/test_corrector_operator_counts.py:166: in _run return solve( ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],...28571, 34.48275862, 33.33333333, 32.25806452, 31.25 , 30.3030303 ], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _________ test_dense_solves_rank_deficient_equality[array_api_strict] __________ namespace = def test_dense_solves_rank_deficient_equality(namespace): > result = solve( _RedundantEquality(namespace), array(namespace, [2.0, -1.0]), options=Options(hessian="exact", linsolve="dense"), ) tests/regression/test_delta_c_rank_deficient_constraints.py:68: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([100., 100.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _________ test_lbfgs_solves_rank_deficient_equality[array_api_strict] __________ namespace = def test_lbfgs_solves_rank_deficient_equality(namespace): # The Hessian-less L-BFGS route on the same degenerate saddle. > result = solve( _RedundantEquality(namespace), array(namespace, [2.0, -1.0]), options=Options(hessian="lbfgs", linsolve="dense"), ) tests/regression/test_delta_c_rank_deficient_constraints.py:78: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([100., 100.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_host_syncs_per_iteration_bounded[array_api_strict-rosenbrock-unconstrained] _ namespace = make = at 0xffffaa8e5b10> x0 = [-1.2, 1.0, -1.2, 1.0, -1.2, 1.0, ...], budget = 13.0 options = Options(optimality=OptimalityConditionOptions(f_tol=None, f_rel_change_tol=None, dual_inf_tol=1e-08, constr_viol_tol=1...ax_corrections=2, gondzio_gamma=0.1, gondzio_variant='ipax'), enable_autodiff=True, enable_finite_diff=True, verbose=0) @pytest.mark.parametrize( ("make", "x0", "budget", "options"), [ (lambda xp: _Rosenbrock(xp, 20), [-1.2, 1.0] * 10, 13.0, Options()), (HS43, [0.0, 0.0, 0.0, 0.0], 21.0, Options()), (HS71, [1.0, 5.0, 5.0, 1.0], 31.0, Options()), # Bound-only L-BFGS on the Krylov route: the budget sits *between* the # direct exact-inverse dispatch (~22.8 syncs/iter) and the same solve # re-wrapped in CG (~25.5, both with the device-side apply guard), so # it pins that the direct route stays dispatched — the change's # device-efficiency property, not just its iteration counts. ( BoundConstrainedQP, [0.25, 0.75], 24.0, Options(hessian="lbfgs", linsolve="krylov"), ), ], ids=[ "rosenbrock-unconstrained", "HS43-ineq", "HS71-eq-ineq-bounds", "bound-only-lbfgs-krylov-direct", ], ) def test_host_syncs_per_iteration_bounded(namespace, make, x0, budget, options): problem = make(namespace) x = array(namespace, x0) with _ScalarSyncCounter(type(x)) as counter: > result = solve(problem, x, options=options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/regression/test_driver_host_sync_budget.py:52: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=array_api...0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ______ test_host_syncs_per_iteration_bounded[array_api_strict-HS43-ineq] _______ namespace = make = , x0 = [0.0, 0.0, 0.0, 0.0] budget = 21.0 options = Options(optimality=OptimalityConditionOptions(f_tol=None, f_rel_change_tol=None, dual_inf_tol=1e-08, constr_viol_tol=1...ax_corrections=2, gondzio_gamma=0.1, gondzio_variant='ipax'), enable_autodiff=True, enable_finite_diff=True, verbose=0) @pytest.mark.parametrize( ("make", "x0", "budget", "options"), [ (lambda xp: _Rosenbrock(xp, 20), [-1.2, 1.0] * 10, 13.0, Options()), (HS43, [0.0, 0.0, 0.0, 0.0], 21.0, Options()), (HS71, [1.0, 5.0, 5.0, 1.0], 31.0, Options()), # Bound-only L-BFGS on the Krylov route: the budget sits *between* the # direct exact-inverse dispatch (~22.8 syncs/iter) and the same solve # re-wrapped in CG (~25.5, both with the device-side apply guard), so # it pins that the direct route stays dispatched — the change's # device-efficiency property, not just its iteration counts. ( BoundConstrainedQP, [0.25, 0.75], 24.0, Options(hessian="lbfgs", linsolve="krylov"), ), ], ids=[ "rosenbrock-unconstrained", "HS43-ineq", "HS71-eq-ineq-bounds", "bound-only-lbfgs-krylov-direct", ], ) def test_host_syncs_per_iteration_bounded(namespace, make, x0, budget, options): problem = make(namespace) x = array(namespace, x0) with _ScalarSyncCounter(type(x)) as counter: > result = solve(problem, x, options=options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/regression/test_driver_host_sync_budget.py:52: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1.], dtype=array_api_strict.float64), Array([100., 100., 50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_host_syncs_per_iteration_bounded[array_api_strict-HS71-eq-ineq-bounds] __ namespace = make = , x0 = [1.0, 5.0, 5.0, 1.0] budget = 31.0 options = Options(optimality=OptimalityConditionOptions(f_tol=None, f_rel_change_tol=None, dual_inf_tol=1e-08, constr_viol_tol=1...ax_corrections=2, gondzio_gamma=0.1, gondzio_variant='ipax'), enable_autodiff=True, enable_finite_diff=True, verbose=0) @pytest.mark.parametrize( ("make", "x0", "budget", "options"), [ (lambda xp: _Rosenbrock(xp, 20), [-1.2, 1.0] * 10, 13.0, Options()), (HS43, [0.0, 0.0, 0.0, 0.0], 21.0, Options()), (HS71, [1.0, 5.0, 5.0, 1.0], 31.0, Options()), # Bound-only L-BFGS on the Krylov route: the budget sits *between* the # direct exact-inverse dispatch (~22.8 syncs/iter) and the same solve # re-wrapped in CG (~25.5, both with the device-side apply guard), so # it pins that the direct route stays dispatched — the change's # device-efficiency property, not just its iteration counts. ( BoundConstrainedQP, [0.25, 0.75], 24.0, Options(hessian="lbfgs", linsolve="krylov"), ), ], ids=[ "rosenbrock-unconstrained", "HS43-ineq", "HS71-eq-ineq-bounds", "bound-only-lbfgs-krylov-direct", ], ) def test_host_syncs_per_iteration_bounded(namespace, make, x0, budget, options): problem = make(namespace) x = array(namespace, x0) with _ScalarSyncCounter(type(x)) as counter: > result = solve(problem, x, options=options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/regression/test_driver_host_sync_budget.py:52: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([3., 3., 3., 3.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_host_syncs_per_iteration_bounded[array_api_strict-bound-only-lbfgs-krylov-direct] _ namespace = make = , x0 = [0.25, 0.75] budget = 24.0 options = Options(optimality=OptimalityConditionOptions(f_tol=None, f_rel_change_tol=None, dual_inf_tol=1e-08, constr_viol_tol=1...ax_corrections=2, gondzio_gamma=0.1, gondzio_variant='ipax'), enable_autodiff=True, enable_finite_diff=True, verbose=0) @pytest.mark.parametrize( ("make", "x0", "budget", "options"), [ (lambda xp: _Rosenbrock(xp, 20), [-1.2, 1.0] * 10, 13.0, Options()), (HS43, [0.0, 0.0, 0.0, 0.0], 21.0, Options()), (HS71, [1.0, 5.0, 5.0, 1.0], 31.0, Options()), # Bound-only L-BFGS on the Krylov route: the budget sits *between* the # direct exact-inverse dispatch (~22.8 syncs/iter) and the same solve # re-wrapped in CG (~25.5, both with the device-side apply guard), so # it pins that the direct route stays dispatched — the change's # device-efficiency property, not just its iteration counts. ( BoundConstrainedQP, [0.25, 0.75], 24.0, Options(hessian="lbfgs", linsolve="krylov"), ), ], ids=[ "rosenbrock-unconstrained", "HS43-ineq", "HS71-eq-ineq-bounds", "bound-only-lbfgs-krylov-direct", ], ) def test_host_syncs_per_iteration_bounded(namespace, make, x0, budget, options): problem = make(namespace) x = array(namespace, x0) with _ScalarSyncCounter(type(x)) as counter: > result = solve(problem, x, options=options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/regression/test_driver_host_sync_budget.py:52: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0. , 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_infeasible_verdict_vetoed_by_feasible_history[array_api_strict] _____ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffaaacfc40> def test_infeasible_verdict_vetoed_by_feasible_history(namespace, monkeypatch): # After a few good iterations (θ ~ 1e-12 on this QP) the line search is # forced to fail and restoration "returns" a wildly infeasible point while # claiming local infeasibility. The veto must reject that claim — the run # has already visited feasibility — and report STALLED with a usable point. xp = namespace problem = EqualityConstrainedQP(xp) # x0 already satisfies the (linear) constraint, so the very first record # certifies θ = 0: feasibility evidence exists before any step. Every # line search fails (the QP would otherwise converge in one step). _fail_search_after(monkeypatch, 0) def bogus_restore(self, x, s, m, m_eq, mask_l, mask_u, lower_safe, upper_safe): # θ = 19, claims "infeasible" with a stationarity certificate return array(xp, [10.0, 10.0]), s, RestorationExit.STATIONARY monkeypatch.setattr(IPMDriver, "_restore", bogus_restore) > result = solve( problem, array(xp, [2.0, -1.0]), options=Options(hessian="exact", linsolve="dense", max_iter=60), ) tests/regression/test_false_infeasible_veto.py:63: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:239: in compute_scaling _vector_factors(xp, as_operator(linear[0]), max_gradient, dtype, x0) ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([100.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __________ test_failure_status_returns_best_iterate[array_api_strict] __________ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffaa8c0de0> def test_failure_status_returns_best_iterate(namespace, monkeypatch): # After a good start (3 accepted steps toward the optimum), restoration # "recovers" to a terrible (but interior, feasible-flagged) point and the # run stalls there. The result must carry the lowest-KKT accepted iterate # from the good phase, not the wreckage. from ipax.testing.problems import BoundConstrainedQP xp = namespace problem = BoundConstrainedQP(xp) _fail_search_after(monkeypatch, 3) def bogus_restore(self, x, s, m, m_eq, mask_l, mask_u, lower_safe, upper_safe): # bad interior jump, no claim return array(xp, [10.0, 0.5]), s, RestorationExit.FEASIBLE monkeypatch.setattr(IPMDriver, "_restore", bogus_restore) > result = solve( problem, array(xp, [0.25, 0.75]), options=Options(hessian="exact", linsolve="dense", max_iter=100), ) tests/regression/test_false_infeasible_veto.py:92: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0. , 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _________ test_genuine_infeasibility_still_reported[array_api_strict] __________ namespace = def test_genuine_infeasibility_still_reported(namespace): from ipax.testing.problems import InfeasibleEqualities problem = InfeasibleEqualities(namespace) > result = solve( problem, array(namespace, [0.5]), options=Options(hessian="exact", linsolve="dense", max_iter=200), ) tests/regression/test_false_infeasible_veto.py:109: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([100., 100.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _______ test_krylov_escapes_feasible_ascent_direction[array_api_strict] ________ namespace = def test_krylov_escapes_feasible_ascent_direction(namespace): # Pre-fix: CG's garbage direction on the indefinite Hessian is rejected # forever (max_iter at f = 1.135, e0 = 100 frozen); the dense route already # solved this via its Cholesky PD-probe + delta_w escalation. problem, x0 = _powell_badly_scaled(namespace) > result = solve( problem, x0, options=Options(hessian="exact", linsolve="krylov", max_iter=300), ) tests/regression/test_feasible_ascent_stall.py:82: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __________ test_stall_detector_terminates_honestly[array_api_strict] ___________ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa9a4b770> def test_stall_detector_terminates_honestly(namespace, monkeypatch): # Force every line search to fail: restoration at a feasible point is a # no-op, so without the detector the run burns the whole budget with # alpha = 0 and a frozen KKT error. def always_fail(self, **kwargs): return LineSearchResult(self._o.alpha_min_frac, False, False, True) monkeypatch.setattr(FilterLineSearch, "search", always_fail) > result = solve( BoundConstrainedQP(namespace), array(namespace, [0.25, 0.75]), options=Options( hessian="exact", linsolve="dense", max_iter=500, max_stall_iter=10 ), ) tests/regression/test_feasible_ascent_stall.py:102: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0. , 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ________ test_stall_detector_disabled_runs_to_budget[array_api_strict] _________ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa9a49940> def test_stall_detector_disabled_runs_to_budget(namespace, monkeypatch): def always_fail(self, **kwargs): return LineSearchResult(self._o.alpha_min_frac, False, False, True) monkeypatch.setattr(FilterLineSearch, "search", always_fail) > result = solve( BoundConstrainedQP(namespace), array(namespace, [0.25, 0.75]), options=Options( hessian="exact", linsolve="dense", max_iter=40, max_stall_iter=None ), ) tests/regression/test_feasible_ascent_stall.py:119: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0. , 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_descent_enforcement_reuses_step_when_already_descent[array_api_strict] __ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa9a4b310> def test_descent_enforcement_reuses_step_when_already_descent(namespace, monkeypatch): # The enforcement must be a no-op on a healthy solve: a PD problem's step # is descent, so no extra KKT solves happen (count them). problem = BoundConstrainedQP(namespace) calls = {"n": 0} original = IPMDriver._solve_step def counting(self, *args, **kwargs): calls["n"] += 1 return original(self, *args, **kwargs) monkeypatch.setattr(IPMDriver, "_solve_step", counting) > result = solve( problem, array(namespace, [0.25, 0.75]), options=Options(hessian="exact", linsolve="dense", mu_schedule="monotone"), ) tests/regression/test_feasible_ascent_stall.py:146: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0. , 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_feasible_entry_recenters_instead_of_restoring[array_api_strict] _____ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa9a4b8c0> def test_feasible_entry_recenters_instead_of_restoring(namespace, monkeypatch): # HS35 from a strictly feasible start: theta0 = 0, so a (forced) line-search # failure must NOT call restore() — the repair path re-centers the barrier # state at the same point and the solve still reaches the optimum. xp = namespace problem = HS35(xp) x0 = array(xp, [0.5, 0.5, 0.5]) # g = -1: strictly feasible interior _fail_first_search(monkeypatch) def forbidden_restore(self, *args, **kwargs): raise AssertionError("restore() must not run at a feasible point") monkeypatch.setattr(IPMDriver, "_restore", forbidden_restore) > result = solve( problem, x0, options=Options(hessian="exact", linsolve="dense", max_iter=100), ) tests/regression/test_feasible_point_restoration_recenter.py:54: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____________ test_infeasible_entry_still_restores[array_api_strict] ____________ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa9a48d70> def test_infeasible_entry_still_restores(namespace, monkeypatch): # Gate boundary: from an infeasible point (theta0 >> tol) the classic # restoration phase must still run — the repair only replaces it where # restoration provably cannot move the point. xp = namespace problem = HS35(xp) x0 = array(xp, [2.0, 2.0, 2.0]) # g = +3: violated inequality _fail_first_search(monkeypatch) restore_calls = {"n": 0} original_restore = IPMDriver._restore def counting_restore(self, *args, **kwargs): restore_calls["n"] += 1 return original_restore(self, *args, **kwargs) monkeypatch.setattr(IPMDriver, "_restore", counting_restore) > result = solve( problem, x0, options=Options(hessian="exact", linsolve="dense", max_iter=100), ) tests/regression/test_feasible_point_restoration_recenter.py:83: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _______ test_recenter_breaks_a_poisoned_dual_deadlock[array_api_strict] ________ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa9961400> def test_recenter_breaks_a_poisoned_dual_deadlock(namespace, monkeypatch): # The HS101 mechanism in miniature: start feasible with a wildly poisoned # warm-started multiplier (λ = 1e6 on a constraint that is active at the # optimum). Without the repair, a line-search failure at a feasible point # resumes with that multiplier untouched. With it, the solve must still # converge to the optimum. xp = namespace problem = HS35(xp) x0 = array(xp, [0.5, 0.5, 0.5]) _fail_first_search(monkeypatch) def forbidden_restore(self, *args, **kwargs): raise AssertionError("restore() must not run at a feasible point") monkeypatch.setattr(IPMDriver, "_restore", forbidden_restore) warm = WarmStart(y_ineq=array(xp, [1e6])) > result = solve( problem, x0, options=Options(hessian="exact", linsolve="dense", max_iter=200), warm_start=warm, ) tests/regression/test_feasible_point_restoration_recenter.py:110: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___________ test_hs7_lbfgs_dense_does_not_diverge[array_api_strict] ____________ namespace = def test_hs7_lbfgs_dense_does_not_diverge(namespace): > result = solve( _HS7NoHessian(namespace), array(namespace, [2.0, 2.0]), options=Options(hessian="lbfgs", linsolve="dense"), ) tests/regression/test_hs7_lbfgs_no_false_infeasible.py:66: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([2.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___________ test_hs7_lbfgs_krylov_does_not_diverge[array_api_strict] ___________ namespace = def test_hs7_lbfgs_krylov_does_not_diverge(namespace): > result = solve( _HS7NoHessian(namespace), array(namespace, [2.0, 2.0]), options=Options(hessian="lbfgs", linsolve="krylov"), ) tests/regression/test_hs7_lbfgs_no_false_infeasible.py:75: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([2.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___ test_hs9_exact_krylov_recovers_from_zero_hessian_start[array_api_strict] ___ namespace = def test_hs9_exact_krylov_recovers_from_zero_hessian_start(namespace): > result = solve( HS9(namespace), array(namespace, [0.0, 0.0]), options=Options(hessian="exact", linsolve="krylov"), ) tests/regression/test_hs9_krylov_zero_hessian.py:26: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:239: in compute_scaling _vector_factors(xp, as_operator(linear[0]), max_gradient, dtype, x0) ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([25.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_previous_hessian_is_released_before_the_next_assembly[array_api_strict-filter] _ namespace = globalization = 'filter' @pytest.mark.parametrize("globalization", ["filter", "breedveld"]) def test_previous_hessian_is_released_before_the_next_assembly( namespace, globalization ): problem = _TrackedHessianHS71(namespace) x0 = array(namespace, [1.0, 5.0, 5.0, 1.0]) options = Options(hessian="exact", linsolve="dense", globalization=globalization) > result = solve(problem, x0, options=options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/regression/test_iteration_operator_lifetime.py:68: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([3., 3., 3., 3.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_previous_hessian_is_released_before_the_next_assembly[array_api_strict-breedveld] _ namespace = globalization = 'breedveld' @pytest.mark.parametrize("globalization", ["filter", "breedveld"]) def test_previous_hessian_is_released_before_the_next_assembly( namespace, globalization ): problem = _TrackedHessianHS71(namespace) x0 = array(namespace, [1.0, 5.0, 5.0, 1.0]) options = Options(hessian="exact", linsolve="dense", globalization=globalization) > result = solve(problem, x0, options=options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/regression/test_iteration_operator_lifetime.py:68: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([3., 3., 3., 3.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___ test_lbfgs_recovers_from_non_finite_gradient_overshoot[array_api_strict] ___ namespace = def test_lbfgs_recovers_from_non_finite_gradient_overshoot(namespace): > result = solve( _SteepOvershoot(namespace), array(namespace, [10.0]), options=Options(hessian="lbfgs", linsolve="dense", max_iter=100), ) tests/regression/test_lbfgs_gradient_overshoot.py:50: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_affine_lbfgs_active_inequality_and_bound[array_api_strict-linear_ineq-dense] _ namespace = route = 'dense', representation = 'linear_ineq' @pytest.mark.parametrize("route", ["dense", "krylov", "sparse"]) @pytest.mark.parametrize("representation", ["linear_ineq", "coo_callback"]) def test_affine_lbfgs_active_inequality_and_bound(namespace, route, representation): xp = namespace if (route == "sparse" or representation == "coo_callback") and get_sparse_adapter( xp ) is None: pytest.skip("backend has no sparse adapter") A = array(xp, [[200.0, 200.0, 0.0]]) b = array(xp, [200.0]) target = array(xp, [2.0, 1.5, -1.0]) if representation == "linear_ineq": constraints = {"linear_ineq": (A, array(xp, [-float("inf")]), b)} else: op = COOOperator( xp.asarray([0, 0]), xp.asarray([0, 1]), array(xp, [200.0, 200.0]), (1, 3) ) constraints = { "ineq_constraints": lambda x: op.matvec(x) - b, "ineq_jacobian": lambda x: op, } problem = FunctionProblem( 3, lambda x: 0.5 * xp.sum((x - target) ** 2), gradient=lambda x: x - target, bounds=(xp.zeros((3,), dtype=A.dtype), xp.full((3,), 2.0, dtype=A.dtype)), **constraints, ) > result = solve( problem, array(xp, [0.2, 0.2, 0.2]), options=Options( linsolve=route, hessian="lbfgs", scaling="gradient-based", max_iter=100 ), ) tests/regression/test_linear_ineq_lbfgs.py:41: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1.], dtype=array_api_strict.float64), Array([1., 1., 1.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_affine_lbfgs_active_inequality_and_bound[array_api_strict-linear_ineq-krylov] _ namespace = route = 'krylov', representation = 'linear_ineq' @pytest.mark.parametrize("route", ["dense", "krylov", "sparse"]) @pytest.mark.parametrize("representation", ["linear_ineq", "coo_callback"]) def test_affine_lbfgs_active_inequality_and_bound(namespace, route, representation): xp = namespace if (route == "sparse" or representation == "coo_callback") and get_sparse_adapter( xp ) is None: pytest.skip("backend has no sparse adapter") A = array(xp, [[200.0, 200.0, 0.0]]) b = array(xp, [200.0]) target = array(xp, [2.0, 1.5, -1.0]) if representation == "linear_ineq": constraints = {"linear_ineq": (A, array(xp, [-float("inf")]), b)} else: op = COOOperator( xp.asarray([0, 0]), xp.asarray([0, 1]), array(xp, [200.0, 200.0]), (1, 3) ) constraints = { "ineq_constraints": lambda x: op.matvec(x) - b, "ineq_jacobian": lambda x: op, } problem = FunctionProblem( 3, lambda x: 0.5 * xp.sum((x - target) ** 2), gradient=lambda x: x - target, bounds=(xp.zeros((3,), dtype=A.dtype), xp.full((3,), 2.0, dtype=A.dtype)), **constraints, ) > result = solve( problem, array(xp, [0.2, 0.2, 0.2]), options=Options( linsolve=route, hessian="lbfgs", scaling="gradient-based", max_iter=100 ), ) tests/regression/test_linear_ineq_lbfgs.py:41: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1.], dtype=array_api_strict.float64), Array([1., 1., 1.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_free_mode_oracles_do_not_run_away_on_ill_scaled_ls[array_api_strict-probing-none] _ namespace = schedule = 'probing', corrections = 'none' @pytest.mark.parametrize( ("schedule", "corrections"), [ ("probing", "none"), ("probing", "gondzio"), ("adaptive", "gondzio"), ("breedveld", "mehrotra"), # The quality function may raise μ (σ > 1) by design, but it is # closed-loop — a large μ scores badly through its own predicted # complementarity — so it must not reproduce the open-loop Mehrotra # runaway either. ("quality", "none"), ("quality", "gondzio"), ], ) def test_free_mode_oracles_do_not_run_away_on_ill_scaled_ls( namespace, schedule, corrections ): problem, x0 = _ls_problem(namespace) > result = solve( problem, x0, options=Options( hessian="lbfgs", linsolve="dense", mu_schedule=schedule, corrections=corrections, max_iter=200, ), ) tests/regression/test_mu_oracle_inflation.py:84: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., ...0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_free_mode_oracles_do_not_run_away_on_ill_scaled_ls[array_api_strict-probing-gondzio] _ namespace = schedule = 'probing', corrections = 'gondzio' @pytest.mark.parametrize( ("schedule", "corrections"), [ ("probing", "none"), ("probing", "gondzio"), ("adaptive", "gondzio"), ("breedveld", "mehrotra"), # The quality function may raise μ (σ > 1) by design, but it is # closed-loop — a large μ scores badly through its own predicted # complementarity — so it must not reproduce the open-loop Mehrotra # runaway either. ("quality", "none"), ("quality", "gondzio"), ], ) def test_free_mode_oracles_do_not_run_away_on_ill_scaled_ls( namespace, schedule, corrections ): problem, x0 = _ls_problem(namespace) > result = solve( problem, x0, options=Options( hessian="lbfgs", linsolve="dense", mu_schedule=schedule, corrections=corrections, max_iter=200, ), ) tests/regression/test_mu_oracle_inflation.py:84: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., ...0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_free_mode_oracles_do_not_run_away_on_ill_scaled_ls[array_api_strict-adaptive-gondzio] _ namespace = schedule = 'adaptive', corrections = 'gondzio' @pytest.mark.parametrize( ("schedule", "corrections"), [ ("probing", "none"), ("probing", "gondzio"), ("adaptive", "gondzio"), ("breedveld", "mehrotra"), # The quality function may raise μ (σ > 1) by design, but it is # closed-loop — a large μ scores badly through its own predicted # complementarity — so it must not reproduce the open-loop Mehrotra # runaway either. ("quality", "none"), ("quality", "gondzio"), ], ) def test_free_mode_oracles_do_not_run_away_on_ill_scaled_ls( namespace, schedule, corrections ): problem, x0 = _ls_problem(namespace) > result = solve( problem, x0, options=Options( hessian="lbfgs", linsolve="dense", mu_schedule=schedule, corrections=corrections, max_iter=200, ), ) tests/regression/test_mu_oracle_inflation.py:84: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., ...0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_free_mode_oracles_do_not_run_away_on_ill_scaled_ls[array_api_strict-breedveld-mehrotra] _ namespace = schedule = 'breedveld', corrections = 'mehrotra' @pytest.mark.parametrize( ("schedule", "corrections"), [ ("probing", "none"), ("probing", "gondzio"), ("adaptive", "gondzio"), ("breedveld", "mehrotra"), # The quality function may raise μ (σ > 1) by design, but it is # closed-loop — a large μ scores badly through its own predicted # complementarity — so it must not reproduce the open-loop Mehrotra # runaway either. ("quality", "none"), ("quality", "gondzio"), ], ) def test_free_mode_oracles_do_not_run_away_on_ill_scaled_ls( namespace, schedule, corrections ): problem, x0 = _ls_problem(namespace) > result = solve( problem, x0, options=Options( hessian="lbfgs", linsolve="dense", mu_schedule=schedule, corrections=corrections, max_iter=200, ), ) tests/regression/test_mu_oracle_inflation.py:84: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., ...0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_free_mode_oracles_do_not_run_away_on_ill_scaled_ls[array_api_strict-quality-none] _ namespace = schedule = 'quality', corrections = 'none' @pytest.mark.parametrize( ("schedule", "corrections"), [ ("probing", "none"), ("probing", "gondzio"), ("adaptive", "gondzio"), ("breedveld", "mehrotra"), # The quality function may raise μ (σ > 1) by design, but it is # closed-loop — a large μ scores badly through its own predicted # complementarity — so it must not reproduce the open-loop Mehrotra # runaway either. ("quality", "none"), ("quality", "gondzio"), ], ) def test_free_mode_oracles_do_not_run_away_on_ill_scaled_ls( namespace, schedule, corrections ): problem, x0 = _ls_problem(namespace) > result = solve( problem, x0, options=Options( hessian="lbfgs", linsolve="dense", mu_schedule=schedule, corrections=corrections, max_iter=200, ), ) tests/regression/test_mu_oracle_inflation.py:84: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., ...0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_free_mode_oracles_do_not_run_away_on_ill_scaled_ls[array_api_strict-quality-gondzio] _ namespace = schedule = 'quality', corrections = 'gondzio' @pytest.mark.parametrize( ("schedule", "corrections"), [ ("probing", "none"), ("probing", "gondzio"), ("adaptive", "gondzio"), ("breedveld", "mehrotra"), # The quality function may raise μ (σ > 1) by design, but it is # closed-loop — a large μ scores badly through its own predicted # complementarity — so it must not reproduce the open-loop Mehrotra # runaway either. ("quality", "none"), ("quality", "gondzio"), ], ) def test_free_mode_oracles_do_not_run_away_on_ill_scaled_ls( namespace, schedule, corrections ): problem, x0 = _ls_problem(namespace) > result = solve( problem, x0, options=Options( hessian="lbfgs", linsolve="dense", mu_schedule=schedule, corrections=corrections, max_iter=200, ), ) tests/regression/test_mu_oracle_inflation.py:84: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., ...0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___ test_near_feasible_restoration_stall_is_not_infeasible[array_api_strict] ___ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa9960de0> def test_near_feasible_restoration_stall_is_not_infeasible(namespace, monkeypatch): # Restoration floors at a NEAR-feasible point: HS7 constraint # (1+x1²)² + x2² - 4 at [1, √(5e-5)] is exactly 5e-5 — below IPOPT's 1e-4 # feasibility band but above the old 1e-5 threshold. A stationarity # certificate there must NOT be read as local infeasibility (the objective # is far from optimal, so the run honestly stalls instead). xp = namespace problem = HS7(xp) x0 = array(xp, [2.0, 2.0]) x_near = array(xp, [1.0, math.sqrt(5e-5)]) # theta_l1 = 5e-5 _fail_every_search(monkeypatch) def stub_restore(self, x, s, m, m_eq, mask_l, mask_u, lower_safe, upper_safe): return x_near, s, RestorationExit.STATIONARY monkeypatch.setattr(IPMDriver, "_restore", stub_restore) > result = solve( problem, x0, options=Options(hessian="exact", linsolve="dense", max_iter=80), ) tests/regression/test_near_feasible_not_infeasible.py:55: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([2.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_genuinely_infeasible_restoration_still_reports_infeasible[array_api_strict] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa99603d0> def test_genuinely_infeasible_restoration_still_reports_infeasible( namespace, monkeypatch ): # Control: restoration flooring at a violation bounded well away from zero # (theta = |26² + 25 - 4| = 697) is genuine local infeasibility and must # still be reported — the relaxed band only reprieves near-feasible points. xp = namespace problem = HS7(xp) x0 = array(xp, [2.0, 2.0]) x_far = array(xp, [5.0, -5.0]) # theta_l1 = 697, far above 1e-4 _fail_every_search(monkeypatch) def stub_restore(self, x, s, m, m_eq, mask_l, mask_u, lower_safe, upper_safe): return x_far, s, RestorationExit.STATIONARY monkeypatch.setattr(IPMDriver, "_restore", stub_restore) > result = solve( problem, x0, options=Options(hessian="exact", linsolve="dense", max_iter=80), ) tests/regression/test_near_feasible_not_infeasible.py:81: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([2.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ______ test_at_most_two_jacobians_alive_during_a_solve[array_api_strict] _______ namespace = def test_at_most_two_jacobians_alive_during_a_solve(namespace): problem = _TrackedJacobians(namespace) x0 = array(namespace, [1.0, 5.0, 5.0, 1.0]) try: weakref.ref(problem.eq_jacobian(x0)) except TypeError: pytest.skip("backend arrays do not support weak references") problem.eq_refs.clear() peak = {"eq": 0, "ineq": 0} def callback(info: Any) -> bool: gc.collect() peak["eq"] = max(peak["eq"], sum(1 for r in problem.eq_refs if r() is not None)) peak["ineq"] = max( peak["ineq"], sum(1 for r in problem.ineq_refs if r() is not None) ) return False > result = solve(problem, x0, options=Options(), callback=callback) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/regression/test_point_cache_lifetime.py:104: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([3., 3., 3., 3.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___________ test_descent_retry_diagnostic_formats[array_api_strict] ____________ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffaa911b00> caplog = <_pytest.logging.LogCaptureFixture object at 0xffffa9883f50> def test_descent_retry_diagnostic_formats(namespace, monkeypatch, caplog): """Force the non-descent retry at a feasible iterate and check the debug record still formats (the probe value must survive until it is logged).""" from ipax.testing.problems import UnconstrainedQuadratic xp = namespace problem = UnconstrainedQuadratic( array(xp, [[2.0, 0.0], [0.0, 4.0]]), array(xp, [-1.0, 1.0]), xp ) original = IPMDriver._dphi state = {"calls": 0} def ascent_once(self: Any, *args: Any, **kwargs: Any) -> float: state["calls"] += 1 value = original(self, *args, **kwargs) return abs(value) + 1.0 if state["calls"] == 1 else value monkeypatch.setattr(IPMDriver, "_dphi", ascent_once) caplog.set_level(logging.DEBUG, logger="ipax") > result = solve(problem, array(xp, [3.0, -3.0]), options=Options()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/regression/test_point_cache_lifetime.py:133: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ----------------------------- Captured stderr call ----------------------------- ipax solving: 2 variables (bounds: 0 lower, 0 upper), 0 equalities, 0 inequalities | linear solver = dense | hessian = exact ------------------------------ Captured log call ------------------------------- RESULT ipax:solve.py:365 ipax solving: 2 variables (bounds: 0 lower, 0 upper), 0 equalities, 0 inequalities | linear solver = dense | hessian = exact PROBLEM ipax:solve.py:378 problem structure: variables = 2 inequalities = 0 equalities = 0 nonlinear + 0 linear bounded vars = 0 lower, 0 upper SOLVER ipax:solve.py:390 solver setup: hessian = auto linear solver = auto (DenseSolver) globalization = filter mu schedule = monotone scaling = gradient-based corrections = none krylov method = cg OPTIONS ipax:solve.py:392 options: optimality: f_tol = None f_rel_change_tol = None dual_inf_tol = 1e-08 constr_viol_tol = 1e-08 compl_inf_tol = 1e-08 acceptable: f_tol = None f_rel_change_tol = None dual_inf_tol = 1e-06 constr_viol_tol = 1e-06 compl_inf_tol = 1e-06 n_iter = 15 max_iter = 3000 max_stall_iter = 25 max_time = None diverging_iterates_tol = 1e+20 hessian = auto linsolve = auto globalization = filter mu_schedule = monotone barrier: mu_init = 0.1 mu_min = 1e-11 kappa_mu = 0.2 theta_mu = 1.5 tau_min = 0.99 fallback = kkt-error fallback_kappa = 0.9999 fallback_window = 5 fallback_mu_factor = 0.8 kappa_centrality = 0.01 slack_init_scale = 0.0 probing_sigma = nww line_search: max_soc = 4 backtrack_interpolation = False backtrack_shrink_min = 0.1 backtrack_shrink_max = 0.5 alpha_min_frac = 1e-08 gamma_alpha = None gamma_theta = 1e-05 gamma_phi = 1e-05 s_theta = 1.1 s_phi = 2.3 eta_phi = 0.0001 ftype_requires_theta_min = False feasible_kkt_progress = None free_mode_acceptance = rigorous free_filter_margin_fact = 1e-05 free_filter_max_margin = 1.0 regularization: delta_w_init = 1e-06 delta_w_max = 1e+40 delta_w_factor = 8.0 delta_c = 1e-08 delta_c_max = 0.1 delta_c_trigger = 10000000000.0 equality_dual_repair = None breedveld: tau = 0.995 backtrack = 0.9 max_backtrack = 20 armijo_c = 0.0001 ratio_limit = 20.0 common_step = False max_soc = 0 lbfgs: memory = 10 powell_damping = True initial_scaling = True damping_skip_ratio = None seed_formula = direct krylov: method = cg rtol = 1e-10 max_iter = None preconditioner = jacobi exact_lbfgs_inverse = True gmres_restart = 30 adaptive_tol = True adaptive_eta = 0.1 adaptive_rtol_max = 1e-08 auto_switch_ratio = 0.5 restoration: linear_solver = auto krylov = KrylovOptions(method='cg', rtol=1e-08, max_iter=200, preconditioner='jacobi', exact_lbfgs_inverse=True, gmres_restart=30, adaptive_tol=False, adaptive_eta=0.1, adaptive_rtol_max=1e-08, auto_switch_ratio=0.5) dense_materialize_max_elements = 10000000 dense_factorization = lu dense: kkt_route = condensed augmented_max_size = 20000 gram_dtype = auto refine_tol = 1e-10 refine_accept_tol = 1e-06 refine_max_iters = 15 refine_stall_ratio = 0.9 refine_failure_limit = 3 pd_hint_failure_limit = 3 sparse: kkt_route = auto perturbed_pivot_refinement_steps = 10 perturbed_pivot_max_residual = 0.01 deterministic = False scaling: method = gradient-based max_gradient = 100.0 corrections: method = none gondzio_max_corrections = 2 gondzio_gamma = 0.1 gondzio_variant = ipax enable_autodiff = True enable_finite_diff = True verbose = 0 _______ test_repeat_recenter_raise_sticks_in_the_loop[array_api_strict] ________ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa998c590> def test_repeat_recenter_raise_sticks_in_the_loop(namespace, monkeypatch): # HS35 from a strictly feasible interior point: the (linear) inequality # keeps θ = 0 along the whole trajectory, so both forced failures hit the # feasible re-center path. Failures late enough that monotone μ has # dropped below mu_init, leaving headroom for the raise. problem = HS35(namespace) x0 = array(namespace, [0.5, 0.5, 0.5]) _fail_searches(monkeypatch, fail_calls={5, 6}) > result = solve( problem, x0, options=Options(hessian="exact", linsolve="dense", max_iter=200), ) tests/regression/test_repeat_recenter_raises_mu.py:52: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_step_solve_failure_enters_restoration_not_numerical_error[array_api_strict-dense] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffaa9125f0> restoration = RestorationOptions(linear_solver='auto', krylov=KrylovOptions(method='cg', rtol=1e-08, max_iter=200, preconditioner='j....1, adaptive_rtol_max=1e-08, auto_switch_ratio=0.5), dense_materialize_max_elements=10000000, dense_factorization='lu') @pytest.mark.parametrize("restoration", _RESTORATION_ROUTES, ids=["dense", "krylov"]) def test_step_solve_failure_enters_restoration_not_numerical_error( namespace, monkeypatch, restoration ): xp = namespace problem = HS35(xp) x0 = array(xp, [2.0, 2.0, 2.0]) calls = _fail_step_solve_once(monkeypatch) krylov_solves = _count_krylov_solves(monkeypatch) > result = solve( problem, x0, options=Options( hessian="exact", linsolve="dense", max_iter=100, restoration=restoration ), ) tests/regression/test_restoration_on_step_failure.py:77: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_step_solve_failure_enters_restoration_not_numerical_error[array_api_strict-krylov] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa998f150> restoration = RestorationOptions(linear_solver='krylov', krylov=KrylovOptions(method='cg', rtol=1e-08, max_iter=200, preconditioner=....1, adaptive_rtol_max=1e-08, auto_switch_ratio=0.5), dense_materialize_max_elements=10000000, dense_factorization='lu') @pytest.mark.parametrize("restoration", _RESTORATION_ROUTES, ids=["dense", "krylov"]) def test_step_solve_failure_enters_restoration_not_numerical_error( namespace, monkeypatch, restoration ): xp = namespace problem = HS35(xp) x0 = array(xp, [2.0, 2.0, 2.0]) calls = _fail_step_solve_once(monkeypatch) krylov_solves = _count_krylov_solves(monkeypatch) > result = solve( problem, x0, options=Options( hessian="exact", linsolve="dense", max_iter=100, restoration=restoration ), ) tests/regression/test_restoration_on_step_failure.py:77: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_matrix_free_restoration_does_not_pin_its_operator_after_returning[array_api_strict] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa9963c40> def test_matrix_free_restoration_does_not_pin_its_operator_after_returning( namespace, monkeypatch ): """The restoration solver must not keep the last restoration point's Jacobians (an m×n operator at scale) alive for the rest of the run.""" xp = namespace problem = HS35(xp) x0 = array(xp, [2.0, 2.0, 2.0]) _fail_step_solve_once(monkeypatch) factored: list[weakref.ref] = [] original_factor = KrylovSolver.factor def recording_factor(self, operator): factored.append(weakref.ref(operator)) return original_factor(self, operator) monkeypatch.setattr(KrylovSolver, "factor", recording_factor) alive_after_restoration: list[int] = [] def callback(record): del record if factored: gc.collect() alive_after_restoration.append(sum(ref() is not None for ref in factored)) > result = solve( problem, x0, options=Options( hessian="exact", linsolve="dense", max_iter=100, restoration=RestorationOptions(linear_solver="krylov"), ), callback=callback, ) tests/regression/test_restoration_on_step_failure.py:117: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_step_solve_failure_on_infeasible_problem_reports_honestly[array_api_strict] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffaa912eb0> def test_step_solve_failure_on_infeasible_problem_reports_honestly( namespace, monkeypatch ): # A genuinely infeasible problem (x = 0 and x = 1). A step-solve failure # must resolve to an honest infeasibility verdict rather than the crash-like # numerical_error — exactly the diagnostic upgrade the mining targeted. xp = namespace problem = InfeasibleEqualities(xp) x0 = array(xp, [0.4]) _fail_step_solve_once(monkeypatch) > result = solve( problem, x0, options=Options(hessian="exact", linsolve="dense", max_iter=100), ) tests/regression/test_restoration_on_step_failure.py:145: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([100., 100.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _______ test_step_failure_near_optimum_still_converges[array_api_strict] _______ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa998fc40> def test_step_failure_near_optimum_still_converges(namespace, monkeypatch): # A step-solve failure late in a converging run must not derail it: the # ACCEPTABLE salvage or a re-centering resume still reaches the optimum # rather than reporting numerical_error. (The near-optimal ACCEPTABLE # classification itself is unit-tested in test_step_failure_salvage.py.) xp = namespace problem = HS35(xp) x0 = array(xp, [0.5, 0.5, 0.5]) # strictly feasible interior calls = {"n": 0} original = IPMDriver._solve_step def flaky(self, *args, **kwargs): calls["n"] += 1 dx, dy_eq, dw, ok = original(self, *args, **kwargs) if calls["n"] == 6: # a single failure once the run is well underway return dx, dy_eq, dw, False return dx, dy_eq, dw, ok monkeypatch.setattr(IPMDriver, "_solve_step", flaky) > result = solve( problem, x0, options=Options(hessian="exact", linsolve="dense", max_iter=100), ) tests/regression/test_restoration_on_step_failure.py:175: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_tall_gram_block_through_restoration_is_not_densified[array_api_strict-operator] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa998fcb0> threshold = 1 @pytest.mark.parametrize("threshold", [1, 10_000_000], ids=["operator", "dense"]) def test_tall_gram_block_through_restoration_is_not_densified( namespace, monkeypatch, threshold ): xp = namespace _fail_step_solve_once(monkeypatch) log, inside, state = _restoration_log(monkeypatch) problem = _TallLinearIneq(xp, log) x0 = array(xp, [4.0, 4.0, 4.0]) # far outside A x ≤ b assert float(xp.max(problem.ineq_constraints(x0))) > 1.0 > result = solve( problem, x0, options=Options( hessian="exact", linsolve="dense", max_iter=100, restoration=RestorationOptions( linear_solver="dense", dense_materialize_max_elements=threshold ), ), ) tests/regression/test_restoration_tall_gram_block_not_densified.py:144: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],...28571, 34.48275862, 33.33333333, 32.25806452, 31.25 , 30.3030303 ], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_tall_gram_block_through_restoration_is_not_densified[array_api_strict-dense] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa998cbb0> threshold = 10000000 @pytest.mark.parametrize("threshold", [1, 10_000_000], ids=["operator", "dense"]) def test_tall_gram_block_through_restoration_is_not_densified( namespace, monkeypatch, threshold ): xp = namespace _fail_step_solve_once(monkeypatch) log, inside, state = _restoration_log(monkeypatch) problem = _TallLinearIneq(xp, log) x0 = array(xp, [4.0, 4.0, 4.0]) # far outside A x ≤ b assert float(xp.max(problem.ineq_constraints(x0))) > 1.0 > result = solve( problem, x0, options=Options( hessian="exact", linsolve="dense", max_iter=100, restoration=RestorationOptions( linear_solver="dense", dense_materialize_max_elements=threshold ), ), ) tests/regression/test_restoration_tall_gram_block_not_densified.py:144: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],...28571, 34.48275862, 33.33333333, 32.25806452, 31.25 , 30.3030303 ], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_operator_path_restoration_matches_the_densified_path[array_api_strict] __ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa998e9e0> def test_operator_path_restoration_matches_the_densified_path(namespace, monkeypatch): xp = namespace calls = _fail_step_solve_once(monkeypatch) results = [] for threshold in (1, 10_000_000): calls["n"] = 0 # re-arm the forced failure for each run problem = _TallLinearIneq(xp, []) results.append( > solve( problem, array(xp, [4.0, 4.0, 4.0]), options=Options( hessian="exact", linsolve="dense", max_iter=100, restoration=RestorationOptions( linear_solver="dense", dense_materialize_max_elements=threshold, ), ), ) ) tests/regression/test_restoration_tall_gram_block_not_densified.py:175: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],...28571, 34.48275862, 33.33333333, 32.25806452, 31.25 , 30.3030303 ], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_second_chance_restoration_rescues_a_bad_basin[array_api_strict] _____ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa998ecf0> def test_second_chance_restoration_rescues_a_bad_basin(namespace, monkeypatch): # HS7 from an infeasible start: after one accepted step the line search is # forced to fail, and restoration from the *current* iterate claims local # infeasibility at a wildly violated point. Restoration from the original # x0 (which this stub recognizes by its argument) finds the feasible point # (0, sqrt(3)). The driver must use that second chance instead of reporting # INFEASIBLE on a feasible problem. xp = namespace problem = HS7(xp) x0 = array(xp, [2.0, 2.0]) # theta0 = |(1+4)^2 + 4 - 4| = 25, infeasible _fail_search_after(monkeypatch, 1) restore_calls: list[float] = [] def stub_restore(self, x, s, m, m_eq, mask_l, mask_u, lower_safe, upper_safe): dist_to_x0 = float(xp.max(xp.abs(x - x0))) restore_calls.append(dist_to_x0) if dist_to_x0 < 1e-9: # anchored at the starting point: feasibility is reachable feasible = array(xp, [0.0, 1.7320508075688772]) # sqrt(3) return feasible, s, RestorationExit.FEASIBLE # from the wandered-off iterate: a genuinely stuck local minimizer # (theta = |26^2 + 25 - 4| = 697, with a stationarity certificate) return array(xp, [5.0, -5.0]), s, RestorationExit.STATIONARY monkeypatch.setattr(IPMDriver, "_restore", stub_restore) > result = solve( problem, x0, options=Options(hessian="exact", linsolve="dense", max_iter=40), ) tests/regression/test_second_chance_restoration.py:64: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([2.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___________ test_second_chance_fires_at_most_once[array_api_strict] ____________ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa9901860> def test_second_chance_fires_at_most_once(namespace, monkeypatch): # Every restoration claims infeasibility, including from x0: the x0-anchored # retry must run exactly once (no restart loop), and the final verdict stays # INFEASIBLE (the claim survived its probe). xp = namespace problem = HS7(xp) x0 = array(xp, [2.0, 2.0]) _fail_search_after(monkeypatch, 1) restore_calls: list[float] = [] def stub_restore(self, x, s, m, m_eq, mask_l, mask_u, lower_safe, upper_safe): restore_calls.append(float(xp.max(xp.abs(x - x0)))) return array(xp, [5.0, -5.0]), s, RestorationExit.STATIONARY monkeypatch.setattr(IPMDriver, "_restore", stub_restore) > result = solve( problem, x0, options=Options(hessian="exact", linsolve="dense", max_iter=40), ) tests/regression/test_second_chance_restoration.py:94: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([2.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_soc_solves_reuse_the_step_factorization[array_api_strict-dense] _____ namespace = linsolve = 'dense' monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffaa924ad0> @pytest.mark.parametrize("linsolve", ["dense", "krylov"]) def test_soc_solves_reuse_the_step_factorization(namespace, linsolve, monkeypatch): in_search = {"active": False} soc_invoked = {"n": 0} reused = {"n": 0} orig_reuse = IPMDriver._resolve_reused_factorization def counting_reuse(self, *args, **kwargs): if in_search["active"]: reused["n"] += 1 return orig_reuse(self, *args, **kwargs) orig_search = FilterLineSearch.search def marked_search(self, *args, **kwargs): # Count SOC *invocations* (not acceptances): the guard below is # non-vacuous as long as the soc callback ran at all, even if a # future tuning change made its corrected points get rejected. inner_soc = kwargs.get("soc") if inner_soc is not None: def counting_soc(alpha, _inner=inner_soc): soc_invoked["n"] += 1 return _inner(alpha) kwargs["soc"] = counting_soc in_search["active"] = True try: return orig_search(self, *args, **kwargs) finally: in_search["active"] = False orig_step = IPMDriver._solve_step def guarded_step(self, *args, **kwargs): # HS71's SOC iterations are all unregularized (δ_w = 0), so every SOC # solve must be a re-solve on the retained factorization — never a # rebuild through the δ_w ladder. (On a problem with δ_w > 0 SOC # iterations the ladder is legitimate; see the module docstring.) assert not in_search["active"], ( "SOC re-entered _solve_step (fresh operator + δ_w ladder) at an " "unregularized step instead of reusing the step's factorization " "(W&B 2006 §2.4, eq. (26))" ) return orig_step(self, *args, **kwargs) monkeypatch.setattr(FilterLineSearch, "search", marked_search) monkeypatch.setattr(IPMDriver, "_solve_step", guarded_step) monkeypatch.setattr(IPMDriver, "_resolve_reused_factorization", counting_reuse) > result = solve( HS71(namespace), array(namespace, [1.0, 5.0, 5.0, 1.0]), options=Options(linsolve=linsolve), ) tests/regression/test_soc_factorization_reuse.py:102: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([3., 3., 3., 3.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____ test_soc_solves_reuse_the_step_factorization[array_api_strict-krylov] _____ namespace = linsolve = 'krylov' monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa9903d20> @pytest.mark.parametrize("linsolve", ["dense", "krylov"]) def test_soc_solves_reuse_the_step_factorization(namespace, linsolve, monkeypatch): in_search = {"active": False} soc_invoked = {"n": 0} reused = {"n": 0} orig_reuse = IPMDriver._resolve_reused_factorization def counting_reuse(self, *args, **kwargs): if in_search["active"]: reused["n"] += 1 return orig_reuse(self, *args, **kwargs) orig_search = FilterLineSearch.search def marked_search(self, *args, **kwargs): # Count SOC *invocations* (not acceptances): the guard below is # non-vacuous as long as the soc callback ran at all, even if a # future tuning change made its corrected points get rejected. inner_soc = kwargs.get("soc") if inner_soc is not None: def counting_soc(alpha, _inner=inner_soc): soc_invoked["n"] += 1 return _inner(alpha) kwargs["soc"] = counting_soc in_search["active"] = True try: return orig_search(self, *args, **kwargs) finally: in_search["active"] = False orig_step = IPMDriver._solve_step def guarded_step(self, *args, **kwargs): # HS71's SOC iterations are all unregularized (δ_w = 0), so every SOC # solve must be a re-solve on the retained factorization — never a # rebuild through the δ_w ladder. (On a problem with δ_w > 0 SOC # iterations the ladder is legitimate; see the module docstring.) assert not in_search["active"], ( "SOC re-entered _solve_step (fresh operator + δ_w ladder) at an " "unregularized step instead of reusing the step's factorization " "(W&B 2006 §2.4, eq. (26))" ) return orig_step(self, *args, **kwargs) monkeypatch.setattr(FilterLineSearch, "search", marked_search) monkeypatch.setattr(IPMDriver, "_solve_step", guarded_step) monkeypatch.setattr(IPMDriver, "_resolve_reused_factorization", counting_reuse) > result = solve( HS71(namespace), array(namespace, [1.0, 5.0, 5.0, 1.0]), options=Options(linsolve=linsolve), ) tests/regression/test_soc_factorization_reuse.py:102: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([3., 3., 3., 3.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_soc_gate_follows_a_regularized_fallback_inside_the_soc_loop[array_api_strict-dense] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa9903150> linsolve = 'dense' @pytest.mark.parametrize("linsolve", ["dense", "krylov"]) def test_soc_gate_follows_a_regularized_fallback_inside_the_soc_loop( namespace, monkeypatch, linsolve ): """After round 1's re-solve fails and its fallback ladder ends at δ_w > 0, the later rounds reuse *that* factorization instead of re-climbing the ladder per round. The ladder established that δ_w = 0 does not solve this rhs family, so a fresh ladder per round only repeats the same rungs. The dense arm is the one that isolates this clause; on the iterative arm a failed re-solve must *skip* the correction — no ``_solve_step`` ladder inside SOC at all (v29 sweep: DRUGDIS's 233 in-SOC ladders cost 120 s). The step's own regularized matrix on a direct route is a different matter — ``test_direct_soc_never_reuses_the_steps_regularized_factorization``. """ state = {"in_search": False, "done": False, "force_floor": False} events: list[str] = [] # KKT-solve events inside the first SOC search orig_reuse = IPMDriver._resolve_reused_factorization def failing_first_reuse(self, *args, **kwargs): if state["in_search"] and not state["done"]: events.append("reuse") if len(events) == 1: state["force_floor"] = True return None # simulate a failed re-solve on the SOC rhs return orig_reuse(self, *args, **kwargs) orig_step = IPMDriver._solve_step def regularizing_step(self, *args, **kwargs): if state["force_floor"]: # The fallback ladder ends at δ_w = 1e-4: the retained factorization # is no longer the unregularized matrix. state["force_floor"] = False args = (*args[:9], 1e-4) out = orig_step(self, *args, **kwargs) if state["in_search"] and not state["done"]: events.append(f"step:{out[2]:g}") return out orig_search = FilterLineSearch.search def marked_search(self, *args, **kwargs): if state["done"]: return orig_search(self, *args, **kwargs) state["in_search"] = True try: return orig_search(self, *args, **kwargs) finally: state["in_search"] = False if events: state["done"] = True monkeypatch.setattr(IPMDriver, "_resolve_reused_factorization", failing_first_reuse) monkeypatch.setattr(IPMDriver, "_solve_step", regularizing_step) monkeypatch.setattr(FilterLineSearch, "search", marked_search) > result = solve( HS71(namespace), array(namespace, [1.0, 5.0, 5.0, 1.0]), options=Options(linsolve=linsolve), ) tests/regression/test_soc_factorization_reuse.py:173: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([3., 3., 3., 3.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_soc_gate_follows_a_regularized_fallback_inside_the_soc_loop[array_api_strict-krylov] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa99033f0> linsolve = 'krylov' @pytest.mark.parametrize("linsolve", ["dense", "krylov"]) def test_soc_gate_follows_a_regularized_fallback_inside_the_soc_loop( namespace, monkeypatch, linsolve ): """After round 1's re-solve fails and its fallback ladder ends at δ_w > 0, the later rounds reuse *that* factorization instead of re-climbing the ladder per round. The ladder established that δ_w = 0 does not solve this rhs family, so a fresh ladder per round only repeats the same rungs. The dense arm is the one that isolates this clause; on the iterative arm a failed re-solve must *skip* the correction — no ``_solve_step`` ladder inside SOC at all (v29 sweep: DRUGDIS's 233 in-SOC ladders cost 120 s). The step's own regularized matrix on a direct route is a different matter — ``test_direct_soc_never_reuses_the_steps_regularized_factorization``. """ state = {"in_search": False, "done": False, "force_floor": False} events: list[str] = [] # KKT-solve events inside the first SOC search orig_reuse = IPMDriver._resolve_reused_factorization def failing_first_reuse(self, *args, **kwargs): if state["in_search"] and not state["done"]: events.append("reuse") if len(events) == 1: state["force_floor"] = True return None # simulate a failed re-solve on the SOC rhs return orig_reuse(self, *args, **kwargs) orig_step = IPMDriver._solve_step def regularizing_step(self, *args, **kwargs): if state["force_floor"]: # The fallback ladder ends at δ_w = 1e-4: the retained factorization # is no longer the unregularized matrix. state["force_floor"] = False args = (*args[:9], 1e-4) out = orig_step(self, *args, **kwargs) if state["in_search"] and not state["done"]: events.append(f"step:{out[2]:g}") return out orig_search = FilterLineSearch.search def marked_search(self, *args, **kwargs): if state["done"]: return orig_search(self, *args, **kwargs) state["in_search"] = True try: return orig_search(self, *args, **kwargs) finally: state["in_search"] = False if events: state["done"] = True monkeypatch.setattr(IPMDriver, "_resolve_reused_factorization", failing_first_reuse) monkeypatch.setattr(IPMDriver, "_solve_step", regularizing_step) monkeypatch.setattr(FilterLineSearch, "search", marked_search) > result = solve( HS71(namespace), array(namespace, [1.0, 5.0, 5.0, 1.0]), options=Options(linsolve=linsolve), ) tests/regression/test_soc_factorization_reuse.py:173: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([3., 3., 3., 3.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_direct_soc_never_reuses_the_steps_regularized_factorization[array_api_strict] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa9903d90> def test_direct_soc_never_reuses_the_steps_regularized_factorization( namespace, monkeypatch ): """On a direct route a δ_w > 0 *step* factorization is not reused for the first correction (the measured ZAMB2/ACOPP30 reroute; a fresh factorization per rung is cheap); the fresh round-1 solve then leaves an unregularized factorization that the later rounds reuse.""" > events = _regularized_step_soc_events(namespace, monkeypatch, "dense") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/regression/test_soc_factorization_reuse.py:390: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/regression/test_soc_factorization_reuse.py:372: in _regularized_step_soc_events result = solve( ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([3., 3., 3., 3.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_iterative_soc_reuses_the_steps_regularized_factorization[array_api_strict] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffaa926f20> def test_iterative_soc_reuses_the_steps_regularized_factorization( namespace, monkeypatch ): """On an iterative route every correction re-solves the step's retained system even at δ_w > 0 (Wächter & Biegler 2006 eq. (26) verbatim): a fresh δ_w = 0 solve there is a full Krylov ladder per SOC round — v29 sweep, DRUGDIS 21 s (reuse) vs `max_time` (fresh), DALLASS/NET1 alike.""" > events = _regularized_step_soc_events(namespace, monkeypatch, "krylov") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/regression/test_soc_factorization_reuse.py:402: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/regression/test_soc_factorization_reuse.py:372: in _regularized_step_soc_events result = solve( ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([3., 3., 3., 3.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_direct_soc_skips_the_correction_when_its_fresh_solve_fails[array_api_strict] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffaa927930> def test_direct_soc_skips_the_correction_when_its_fresh_solve_fails( namespace, monkeypatch ): """Direct route, regularized step: SOC solves fresh at δ_w = 0, and when that fresh solve fails the correction is simply skipped (the search continues without one) rather than aborting the iteration.""" state = {"in_search": False, "done": False} events: list[str] = [] orig_step = IPMDriver._solve_step orig_search = FilterLineSearch.search def failing_fresh_soc_step(self, *args, **kwargs): if not state["in_search"]: args = (*args[:9], 1e-4) # every *step* solve ends regularized return orig_step(self, *args, **kwargs) out = orig_step(self, *args, **kwargs) if state["done"]: return out events.append("fresh-soc-failed") return (out[0], out[1], out[2], False) def marked_search(self, *args, **kwargs): if state["done"]: return orig_search(self, *args, **kwargs) state["in_search"] = True try: return orig_search(self, *args, **kwargs) finally: state["in_search"] = False if events: state["done"] = True monkeypatch.setattr(IPMDriver, "_solve_step", failing_fresh_soc_step) monkeypatch.setattr(FilterLineSearch, "search", marked_search) > result = solve( HS71(namespace), array(namespace, [1.0, 5.0, 5.0, 1.0]), options=Options(linsolve="dense"), ) tests/regression/test_soc_factorization_reuse.py:528: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([3., 3., 3., 3.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_linear_ineq_gram_type_error_propagates[array_api_strict-exact] ______ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffaa926f90> hessian = 'exact' @pytest.mark.parametrize("hessian", _HESSIANS) def test_linear_ineq_gram_type_error_propagates(namespace, monkeypatch, hessian): xp = namespace operator = _BuggyGram(_jacobian(xp)) restorations = _count_restorations(monkeypatch) with pytest.raises(TypeError, match="unexpected keyword argument 'device'"): > solve( _LinearIneqQP(xp, operator), array(xp, [0.5, 0.5, 0.5]), options=Options(hessian=hessian, linsolve="dense", max_iter=50), ) tests/regression/test_step_solve_callback_errors_propagate.py:154: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:177: in solve resolved = lower_linear_inequalities(resolved, x0, xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:373: in lower_linear_inequalities lowered_jac, offset = _lower_two_sided(matrix, lower, upper, xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:275: in _lower_two_sided return _lower_wrapped(matrix, lower, upper, xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:204: in _lower_wrapped op = _SignedRowSelection(matrix, finite_l, finite_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1493: in __init__ self._expand_lower = xp.cumulative_sum(lower_int) * lower_int ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0], dtype=array_api_strict.int64),), kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function cumulative_sum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_linear_ineq_gram_type_error_propagates[array_api_strict-lbfgs] ______ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa98da0b0> hessian = 'lbfgs' @pytest.mark.parametrize("hessian", _HESSIANS) def test_linear_ineq_gram_type_error_propagates(namespace, monkeypatch, hessian): xp = namespace operator = _BuggyGram(_jacobian(xp)) restorations = _count_restorations(monkeypatch) with pytest.raises(TypeError, match="unexpected keyword argument 'device'"): > solve( _LinearIneqQP(xp, operator), array(xp, [0.5, 0.5, 0.5]), options=Options(hessian=hessian, linsolve="dense", max_iter=50), ) tests/regression/test_step_solve_callback_errors_propagate.py:154: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:177: in solve resolved = lower_linear_inequalities(resolved, x0, xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:373: in lower_linear_inequalities lowered_jac, offset = _lower_two_sided(matrix, lower, upper, xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:275: in _lower_two_sided return _lower_wrapped(matrix, lower, upper, xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:204: in _lower_wrapped op = _SignedRowSelection(matrix, finite_l, finite_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1493: in __init__ self._expand_lower = xp.cumulative_sum(lower_int) * lower_int ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0], dtype=array_api_strict.int64),), kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function cumulative_sum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____ test_ineq_jacobian_gram_type_error_propagates[array_api_strict-exact] _____ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa98da4a0> hessian = 'exact' @pytest.mark.parametrize("hessian", _HESSIANS) def test_ineq_jacobian_gram_type_error_propagates(namespace, monkeypatch, hessian): xp = namespace operator = _BuggyGram(_jacobian(xp)) restorations = _count_restorations(monkeypatch) with pytest.raises(TypeError, match="unexpected keyword argument 'device'"): > solve( _OperatorJacobianHS35(xp, operator), array(xp, [0.5, 0.5, 0.5]), options=Options(hessian=hessian, linsolve="dense", max_iter=50), ) tests/regression/test_step_solve_callback_errors_propagate.py:172: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1.], dtype=array_api_strict.float64), Array([0., 0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____ test_ineq_jacobian_gram_type_error_propagates[array_api_strict-lbfgs] _____ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa98d9240> hessian = 'lbfgs' @pytest.mark.parametrize("hessian", _HESSIANS) def test_ineq_jacobian_gram_type_error_propagates(namespace, monkeypatch, hessian): xp = namespace operator = _BuggyGram(_jacobian(xp)) restorations = _count_restorations(monkeypatch) with pytest.raises(TypeError, match="unexpected keyword argument 'device'"): > solve( _OperatorJacobianHS35(xp, operator), array(xp, [0.5, 0.5, 0.5]), options=Options(hessian=hessian, linsolve="dense", max_iter=50), ) tests/regression/test_step_solve_callback_errors_propagate.py:172: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1.], dtype=array_api_strict.float64), Array([0., 0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_mixed_precision_gram_keyword_bug_is_not_retried_away[array_api_strict] __ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa98db700> def test_mixed_precision_gram_keyword_bug_is_not_retried_away(namespace, monkeypatch): # The pre-0.10 compatibility retry (an operator whose ``gram`` predates the # ``accumulate_dtype``/``hinted_only`` keywords) must fire only for that # signature mismatch. A Gram that *accepts* the keywords and then crashes # is a bug: retrying without them silently degraded the solve to the exact # Gram and hid it. xp = namespace operator = _BuggyGram(_jacobian(xp), fail_on_keywords_only=True, hint="float32") restorations = _count_restorations(monkeypatch) with pytest.raises(TypeError, match="unexpected keyword argument 'device'"): > solve( _LinearIneqQP(xp, operator), array(xp, [0.5, 0.5, 0.5]), options=Options(hessian="exact", linsolve="dense", max_iter=50), ) tests/regression/test_step_solve_callback_errors_propagate.py:193: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:177: in solve resolved = lower_linear_inequalities(resolved, x0, xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:373: in lower_linear_inequalities lowered_jac, offset = _lower_two_sided(matrix, lower, upper, xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:275: in _lower_two_sided return _lower_wrapped(matrix, lower, upper, xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:204: in _lower_wrapped op = _SignedRowSelection(matrix, finite_l, finite_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1493: in __init__ self._expand_lower = xp.cumulative_sum(lower_int) * lower_int ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0], dtype=array_api_strict.int64),), kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function cumulative_sum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_hessian_operator_materialization_type_error_propagates[array_api_strict] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa98dba10> def test_hessian_operator_materialization_type_error_propagates(namespace, monkeypatch): xp = namespace restorations = _count_restorations(monkeypatch) with pytest.raises(TypeError, match="unexpected keyword argument 'device'"): > solve( _BuggyHessianHS35(xp), array(xp, [0.5, 0.5, 0.5]), options=Options(hessian="exact", linsolve="dense", max_iter=50), ) tests/regression/test_step_solve_callback_errors_propagate.py:208: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___ test_lagrangian_hessian_callback_type_error_propagates[array_api_strict] ___ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa98d8520> def test_lagrangian_hessian_callback_type_error_propagates(namespace, monkeypatch): xp = namespace restorations = _count_restorations(monkeypatch) with pytest.raises(TypeError, match="unexpected keyword argument 'device'"): > solve( _RaisingHessianHS35(xp), array(xp, [0.5, 0.5, 0.5]), options=Options(hessian="exact", linsolve="dense", max_iter=50), ) tests/regression/test_step_solve_callback_errors_propagate.py:222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_numerical_failure_in_first_factorization_escalates_delta_w[array_api_strict-backend-linalg-error] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa92a8440> kind = 'backend-linalg-error' @pytest.mark.parametrize("kind", sorted(_FAILURES)) def test_numerical_failure_in_first_factorization_escalates_delta_w( namespace, monkeypatch, kind ): xp = namespace baseline_escalations = _count(monkeypatch, driver_module, "escalate_delta_w") > baseline = _solve_hs35(xp) ^^^^^^^^^^^^^^^ tests/regression/test_step_solve_numerical_failure_ladder.py:72: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/regression/test_step_solve_numerical_failure_ladder.py:59: in _solve_hs35 return solve( ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_numerical_failure_in_first_factorization_escalates_delta_w[array_api_strict-floating-point-error] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa98d90f0> kind = 'floating-point-error' @pytest.mark.parametrize("kind", sorted(_FAILURES)) def test_numerical_failure_in_first_factorization_escalates_delta_w( namespace, monkeypatch, kind ): xp = namespace baseline_escalations = _count(monkeypatch, driver_module, "escalate_delta_w") > baseline = _solve_hs35(xp) ^^^^^^^^^^^^^^^ tests/regression/test_step_solve_numerical_failure_ladder.py:72: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/regression/test_step_solve_numerical_failure_ladder.py:59: in _solve_hs35 return solve( ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_numerical_failure_in_first_factorization_escalates_delta_w[array_api_strict-zero-division-error] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa98d8590> kind = 'zero-division-error' @pytest.mark.parametrize("kind", sorted(_FAILURES)) def test_numerical_failure_in_first_factorization_escalates_delta_w( namespace, monkeypatch, kind ): xp = namespace baseline_escalations = _count(monkeypatch, driver_module, "escalate_delta_w") > baseline = _solve_hs35(xp) ^^^^^^^^^^^^^^^ tests/regression/test_step_solve_numerical_failure_ladder.py:72: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/regression/test_step_solve_numerical_failure_ladder.py:59: in _solve_hs35 return solve( ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_exhausted_ladder_hands_the_step_to_restoration[array_api_strict-backend-linalg-error] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffaa935b00> kind = 'backend-linalg-error' @pytest.mark.parametrize("kind", sorted(_FAILURES)) def test_exhausted_ladder_hands_the_step_to_restoration(namespace, monkeypatch, kind): xp = namespace failure = _FAILURES[kind](xp) _fail_materializations(monkeypatch, failure, count=_MAX_REG_ATTEMPTS) restorations = _count(monkeypatch, IPMDriver, "_handle_restoration") > result = _solve_hs35(xp) ^^^^^^^^^^^^^^^ tests/regression/test_step_solve_numerical_failure_ladder.py:97: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/regression/test_step_solve_numerical_failure_ladder.py:59: in _solve_hs35 return solve( ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_exhausted_ladder_hands_the_step_to_restoration[array_api_strict-floating-point-error] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa92aa270> kind = 'floating-point-error' @pytest.mark.parametrize("kind", sorted(_FAILURES)) def test_exhausted_ladder_hands_the_step_to_restoration(namespace, monkeypatch, kind): xp = namespace failure = _FAILURES[kind](xp) _fail_materializations(monkeypatch, failure, count=_MAX_REG_ATTEMPTS) restorations = _count(monkeypatch, IPMDriver, "_handle_restoration") > result = _solve_hs35(xp) ^^^^^^^^^^^^^^^ tests/regression/test_step_solve_numerical_failure_ladder.py:97: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/regression/test_step_solve_numerical_failure_ladder.py:59: in _solve_hs35 return solve( ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_exhausted_ladder_hands_the_step_to_restoration[array_api_strict-zero-division-error] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa92aa820> kind = 'zero-division-error' @pytest.mark.parametrize("kind", sorted(_FAILURES)) def test_exhausted_ladder_hands_the_step_to_restoration(namespace, monkeypatch, kind): xp = namespace failure = _FAILURES[kind](xp) _fail_materializations(monkeypatch, failure, count=_MAX_REG_ATTEMPTS) restorations = _count(monkeypatch, IPMDriver, "_handle_restoration") > result = _solve_hs35(xp) ^^^^^^^^^^^^^^^ tests/regression/test_step_solve_numerical_failure_ladder.py:97: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/regression/test_step_solve_numerical_failure_ladder.py:59: in _solve_hs35 return solve( ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_budget_exit_with_repairable_duals_reports_acceptable[array_api_strict] __ namespace = def test_budget_exit_with_repairable_duals_reports_acceptable(namespace): # Feasible start (c(x0) = 0) carrying poisoned equality duals; the # one-iteration budget ends the run before any step could fix them. > result = solve( _rank_deficient_feasibility(namespace), array(namespace, [1.0, 1.0]), options=Options(hessian="lbfgs", linsolve="dense", max_iter=1), warm_start=_poisoned(namespace), ) tests/regression/test_terminal_dual_certificate.py:110: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([50., 50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ______ test_certificate_declines_at_an_infeasible_point[array_api_strict] ______ namespace = def test_certificate_declines_at_an_infeasible_point(namespace): # Same poisoned duals, but c(x0) = 3: the certificate's feasibility # component fails, so the honest budget status must survive. > result = solve( _rank_deficient_feasibility(namespace), array(namespace, [2.0, 1.0]), options=Options(hessian="lbfgs", linsolve="dense", max_iter=1), warm_start=_poisoned(namespace), ) tests/regression/test_terminal_dual_certificate.py:130: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([25., 25.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __ test_stall_with_certifiable_gradient_reports_acceptable[array_api_strict] ___ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa92abe00> def test_stall_with_certifiable_gradient_reports_acceptable(namespace, monkeypatch): # Frozen at gradient 5e-7 — inside acceptable (1e-6), outside optimal # (1e-8) — while the initialized bound duals keep the *recorded* dual # infeasibility at ~9e-2. Pre-fix this reported STALLED (the in-loop # relaxed-tolerance check sees only the recorded multipliers). _always_fail_line_search(monkeypatch) > result = solve( _asymmetric_box_problem(namespace), array(namespace, [5e-7, 5e-7]), options=Options( hessian="exact", linsolve="dense", max_iter=100, max_stall_iter=10 ), ) tests/regression/test_terminal_dual_certificate.py:146: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([4.5, 4.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_stall_at_a_non_stationary_point_stays_stalled[array_api_strict] _____ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa92abd20> def test_stall_at_a_non_stationary_point_stays_stalled(namespace, monkeypatch): # Gradient 0.5 at the frozen point: no multiplier choice can certify it. _always_fail_line_search(monkeypatch) > result = solve( _asymmetric_box_problem(namespace), array(namespace, [0.5, 0.5]), options=Options( hessian="exact", linsolve="dense", max_iter=100, max_stall_iter=10 ), ) tests/regression/test_terminal_dual_certificate.py:162: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([4.5, 4.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ________ test_stall_at_an_active_bound_stays_stalled[array_api_strict] _________ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa92a8980> def test_stall_at_an_active_bound_stays_stalled(namespace, monkeypatch): # min Σ(x−2)² on [-1, 1]²: the optimum sits ON the bound with a genuine # z_U = 2. Dropping the bound duals to zero leaves the raw gradient ~2 in # the residual, so the certificate must decline — the zero-dual candidate # under-certifies rather than inventing a multiplier it cannot justify. xp = namespace problem = FunctionProblem( 2, lambda x: xp.sum((x - 2.0) * (x - 2.0)), gradient=lambda x: 2.0 * (x - 2.0), bounds=(array(xp, [-1.0, -1.0]), array(xp, [1.0, 1.0])), lagrangian_hessian=lambda x, y_eq, y_ineq, sigma=1.0: ( 2.0 * sigma * xp.eye(2, dtype=x.dtype) ), ) _always_fail_line_search(monkeypatch) > result = solve( problem, array(namespace, [0.999, 0.999]), options=Options( hessian="exact", linsolve="dense", max_iter=100, max_stall_iter=10 ), ) tests/regression/test_terminal_dual_certificate.py:189: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_disabled_acceptable_stopping_disables_the_certificate[array_api_strict] _ namespace = def test_disabled_acceptable_stopping_disables_the_certificate(namespace): # "Acceptable" is what the caller is willing to accept; all-None means # they accept nothing short of optimal, and the certificate must respect # that instead of introducing a tolerance of its own. > result = solve( _rank_deficient_feasibility(namespace), array(namespace, [1.0, 1.0]), options=Options( hessian="lbfgs", linsolve="dense", max_iter=1, acceptable=AcceptableStoppingOptions( dual_inf_tol=None, constr_viol_tol=None, compl_inf_tol=None ), ), warm_start=_poisoned(namespace), ) tests/regression/test_terminal_dual_certificate.py:204: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([50., 50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_certificate_requires_the_dual_tolerance_enabled[array_api_strict-acceptable0] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa92abe70> acceptable = AcceptableStoppingOptions(f_tol=None, f_rel_change_tol=None, dual_inf_tol=None, constr_viol_tol=None, compl_inf_tol=1e-06, n_iter=15) @pytest.mark.parametrize( "acceptable", [ # With the candidate multipliers the complementarity residual is zero # BY CONSTRUCTION, and on a bound-only problem so is the primal one — # neither carries any information about stationarity. A legal # partial-None configuration enabling only an uninformative component # must therefore never certify (invariant-audit blocker: pre-fix, # both of these upgraded a point with raw gradient 5e-1 to # ACCEPTABLE/success). AcceptableStoppingOptions( dual_inf_tol=None, constr_viol_tol=None, compl_inf_tol=1e-6 ), AcceptableStoppingOptions( dual_inf_tol=None, constr_viol_tol=1e-6, compl_inf_tol=None ), ], ) def test_certificate_requires_the_dual_tolerance_enabled( namespace, monkeypatch, acceptable ): _always_fail_line_search(monkeypatch) > result = solve( _asymmetric_box_problem(namespace), array(namespace, [0.5, 0.5]), options=Options( hessian="exact", linsolve="dense", max_iter=100, max_stall_iter=10, acceptable=acceptable, ), ) tests/regression/test_terminal_dual_certificate.py:243: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([4.5, 4.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_certificate_requires_the_dual_tolerance_enabled[array_api_strict-acceptable1] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa92abf50> acceptable = AcceptableStoppingOptions(f_tol=None, f_rel_change_tol=None, dual_inf_tol=None, constr_viol_tol=1e-06, compl_inf_tol=None, n_iter=15) @pytest.mark.parametrize( "acceptable", [ # With the candidate multipliers the complementarity residual is zero # BY CONSTRUCTION, and on a bound-only problem so is the primal one — # neither carries any information about stationarity. A legal # partial-None configuration enabling only an uninformative component # must therefore never certify (invariant-audit blocker: pre-fix, # both of these upgraded a point with raw gradient 5e-1 to # ACCEPTABLE/success). AcceptableStoppingOptions( dual_inf_tol=None, constr_viol_tol=None, compl_inf_tol=1e-6 ), AcceptableStoppingOptions( dual_inf_tol=None, constr_viol_tol=1e-6, compl_inf_tol=None ), ], ) def test_certificate_requires_the_dual_tolerance_enabled( namespace, monkeypatch, acceptable ): _always_fail_line_search(monkeypatch) > result = solve( _asymmetric_box_problem(namespace), array(namespace, [0.5, 0.5]), options=Options( hessian="exact", linsolve="dense", max_iter=100, max_stall_iter=10, acceptable=acceptable, ), ) tests/regression/test_terminal_dual_certificate.py:243: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([4.5, 4.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ________ test_an_enabled_f_tol_is_honored_terminally[array_api_strict] _________ namespace = def test_an_enabled_f_tol_is_honored_terminally(namespace): # The in-loop acceptable checker requires |f| <= f_tol when enabled; the # certificate must apply the same test instead of silently dropping it. # Here every residual passes (grad = 0 at a feasible point) but |f| = 1. def _solve(f_tol): return solve( _constant_objective_feasibility(namespace), array(namespace, [1.0, 1.0]), options=Options( hessian="lbfgs", linsolve="dense", max_iter=1, acceptable=AcceptableStoppingOptions(f_tol=f_tol), ), warm_start=_poisoned(namespace), ) > assert _solve(1e-30).status is Status.MAX_ITER ^^^^^^^^^^^^^ tests/regression/test_terminal_dual_certificate.py:295: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/regression/test_terminal_dual_certificate.py:283: in _solve return solve( ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([50., 50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____________ test_max_time_exit_is_certified_too[array_api_strict] _____________ namespace = def test_max_time_exit_is_certified_too(namespace): # The docstring claims all three failure exits; MAX_TIME is the one the # other tests never produce. > result = solve( _rank_deficient_feasibility(namespace), array(namespace, [1.0, 1.0]), options=Options(hessian="lbfgs", linsolve="dense", max_time=1e-9), warm_start=_poisoned(namespace), ) tests/regression/test_terminal_dual_certificate.py:302: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([50., 50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_certificate_survives_a_raising_dual_estimator[array_api_strict] _____ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa92c55c0> def test_certificate_survives_a_raising_dual_estimator(namespace, monkeypatch): # A certificate must never be the thing that fails: an estimator error # declines it and the honest failure status survives. def raising(eq_jac, grad, *, xp, m_eq=None): raise RuntimeError("synthetic estimator failure") monkeypatch.setattr("ipax.ipm.driver.least_squares_duals", raising) > result = solve( _rank_deficient_feasibility(namespace), array(namespace, [1.0, 1.0]), options=Options(hessian="lbfgs", linsolve="dense", max_iter=1), warm_start=_poisoned(namespace), ) tests/regression/test_terminal_dual_certificate.py:320: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([50., 50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____ test_certificate_declines_a_non_finite_dual_estimate[array_api_strict] ____ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa92c58d0> def test_certificate_declines_a_non_finite_dual_estimate(namespace, monkeypatch): def non_finite(eq_jac, grad, *, xp, m_eq=None): return xp.full((2,), float("nan"), dtype=grad.dtype) monkeypatch.setattr("ipax.ipm.driver.least_squares_duals", non_finite) > result = solve( _rank_deficient_feasibility(namespace), array(namespace, [1.0, 1.0]), options=Options(hessian="lbfgs", linsolve="dense", max_iter=1), warm_start=_poisoned(namespace), ) tests/regression/test_terminal_dual_certificate.py:335: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([50., 50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___ test_stall_returning_a_best_iterate_within_relaxed_tol[array_api_strict] ___ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa92ab230> def test_stall_returning_a_best_iterate_within_relaxed_tol(namespace, monkeypatch): # The WEEDS shape with honest multipliers: one accepted step moves the # iterate from gradient 5e-7 (inside the relaxed band) to ~1e-5 (outside), # then the line search freezes. The in-loop stall check sees only the # frozen tail; the salvage swaps the best iterate back in, and the # relaxed-tolerance re-judge — not the certificate — must certify it. xp = namespace problem = FunctionProblem( 1, lambda x: 5e-7 * x[0] + (3.8e7 / 3.0) * x[0] ** 3, gradient=lambda x: 5e-7 + 3.8e7 * x * x, lagrangian_hessian=lambda x, y_eq, y_ineq, sigma=1.0: ( sigma * xp.eye(1, dtype=x.dtype) ), ) calls = {"n": 0} def scripted(self, **kwargs): calls["n"] += 1 if calls["n"] == 1: return LineSearchResult( alpha=1.0, accepted=True, augment=False, restoration=False ) return LineSearchResult( alpha=self._o.alpha_min_frac, accepted=False, augment=False, restoration=True, ) monkeypatch.setattr(FilterLineSearch, "search", scripted) > result = solve( problem, array(namespace, [0.0]), options=Options( hessian="exact", linsolve="dense", max_iter=100, max_stall_iter=10 ), ) tests/regression/test_terminal_dual_certificate.py:376: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_enabled_relative_change_tolerance_declines_the_certificate[array_api_strict] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa92c4f30> def test_enabled_relative_change_tolerance_declines_the_certificate( namespace, monkeypatch ): # ``f_rel_change_tol`` compares CONSECUTIVE iterates; it has no one-shot # terminal analogue, so a caller who enabled it has asked for a test the # certificate cannot evaluate. Declining is the honest answer — quietly # dropping the component would certify against a weaker acceptance rule # than the one the caller configured. _always_fail_line_search(monkeypatch) > result = solve( _asymmetric_box_problem(namespace), array(namespace, [0.5, 0.5]), options=Options( hessian="exact", linsolve="dense", max_iter=100, max_stall_iter=10, acceptable=AcceptableStoppingOptions( dual_inf_tol=1e6, # loose enough that the point WOULD certify constr_viol_tol=None, compl_inf_tol=None, f_rel_change_tol=1e-8, ), ), ) tests/regression/test_terminal_dual_certificate.py:400: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([4.5, 4.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_a_failing_residual_declines_the_certificate_instead_of_raising[array_api_strict] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa92c63c0> def test_a_failing_residual_declines_the_certificate_instead_of_raising( namespace, monkeypatch ): # The certificate's contract is that it can only ever *decline* — never # make a run worse. kkt_error() applies the Jacobians (rmatvec on a # possibly lazy or user-supplied operator), so it can fail for the same # reasons the gradient/Jacobian evaluation can. Outside a guard that would # turn an ordinary stall into an exception. import inspect from ipax.ipm.driver import IPMDriver _always_fail_line_search(monkeypatch) original = IPMDriver.kkt_error state = {"terminal": False} def failing(self, **kwargs): # Fail *only* the certificate's own residual. Several call sites pass # mu=0.0 (the in-loop convergence check among them), and those must # keep working or nothing would converge — so discriminate on the # caller, not the arguments. if any(f.function == "_terminal_certificate" for f in inspect.stack()[:4]): state["terminal"] = True raise RuntimeError("operator apply failed") return original(self, **kwargs) monkeypatch.setattr(IPMDriver, "kkt_error", failing) > result = solve( _asymmetric_box_problem(namespace), array(namespace, [5e-7, 5e-7]), options=Options( hessian="exact", linsolve="dense", max_iter=100, max_stall_iter=10 ), ) tests/regression/test_terminal_dual_certificate.py:448: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([4.5, 4.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_ftype_branch_is_gated_by_the_driver_supplied_theta_min[array_api_strict] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa9c09710> def test_ftype_branch_is_gated_by_the_driver_supplied_theta_min(namespace, monkeypatch): # The gate is only real if the driver's θ_min actually reaches it. Recording # the trials where the θ_min conjunct *flips* the verdict away from the old # switching-only answer is what makes this non-vacuous: an unwired θ_min # (or one left at +inf) would never flip anything and ``seen`` would be empty. seen: list[tuple[float, float]] = [] original = FilterLineSearch._is_ftype def spy(self, dphi, alpha, theta0, theta_min): verdict = original(self, dphi, alpha, theta0, theta_min) if verdict != self._switching(dphi, alpha, theta0): seen.append((theta0, theta_min)) return verdict monkeypatch.setattr(FilterLineSearch, "_is_ftype", spy) > result = solve( HS71(namespace), array(namespace, [1.0, 5.0, 5.0, 1.0]), options=Options( hessian="exact", linsolve="dense", line_search=LineSearchOptions(ftype_requires_theta_min=True), ), ) tests/regression/test_theta_min_ftype_gate.py:54: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([3., 3., 3., 3.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __________ test_unbounded_problem_reports_unbounded[array_api_strict] __________ namespace = def test_unbounded_problem_reports_unbounded(namespace): > result = solve( _ConcaveUnbounded(namespace), array(namespace, [1.0, -1.0]), options=Options(hessian="lbfgs", linsolve="dense", max_iter=2000), ) tests/regression/test_unbounded_detection.py:59: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ______ test_well_posed_problem_is_not_flagged_unbounded[array_api_strict] ______ namespace = def test_well_posed_problem_is_not_flagged_unbounded(namespace): > result = solve( _BoundedQuadratic(namespace), array(namespace, [5.0, -3.0]), options=Options(hessian="lbfgs", linsolve="dense"), ) tests/regression/test_unbounded_detection.py:69: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _______ test_far_optimum_is_not_misreported_unbounded[array_api_strict] ________ namespace = def test_far_optimum_is_not_misreported_unbounded(namespace): # Bounded-below objective, iterates past the ‖x‖ threshold: the two-signal # test (norm AND diverged objective) must keep solving instead of claiming # UNBOUNDED from a bounded problem. > result = solve( _FarOptimum(namespace), array(namespace, [0.0]), options=Options(hessian="lbfgs", linsolve="dense", max_iter=500), ) tests/regression/test_unbounded_detection.py:107: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____ test_diverging_iterates_tol_none_disables_detection[array_api_strict] _____ namespace = def test_diverging_iterates_tol_none_disables_detection(namespace): # With detection off, the unbounded solve runs out its iteration budget # (or fails numerically) instead of reporting UNBOUNDED. > result = solve( _ConcaveUnbounded(namespace), array(namespace, [1.0, -1.0]), options=Options( hessian="lbfgs", linsolve="dense", max_iter=200, diverging_iterates_tol=None, ), ) tests/regression/test_unbounded_detection.py:122: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_non_progressing_uncertified_stall_is_restoration_failed[array_api_strict] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa9c09d30> def test_non_progressing_uncertified_stall_is_restoration_failed( namespace, monkeypatch ): # Every restoration returns the same wildly violated point via the stall # window (no certificate). The driver may resume once on the first stall, # but a repeat with zero θ progress must end the run as RESTORATION_FAILED, # not as INFEASIBLE (no stationarity certificate was ever produced). xp = namespace problem = HS7(xp) x0 = array(xp, [2.0, 2.0]) _fail_search_after(monkeypatch, 1) restore_calls = {"n": 0} def stub_restore(self, x, s, m, m_eq, mask_l, mask_u, lower_safe, upper_safe): restore_calls["n"] += 1 return _hs7_point_with_violation(xp, 8.0), s, RestorationExit.STALL_WINDOW monkeypatch.setattr(IPMDriver, "_restore", stub_restore) > result = solve( problem, x0, options=Options(hessian="exact", linsolve="dense", max_iter=40), ) tests/regression/test_uncertified_restoration_stall.py:71: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([2.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __ test_progressing_uncertified_stalls_resume_the_main_loop[array_api_strict] __ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa9c09e10> def test_progressing_uncertified_stalls_resume_the_main_loop(namespace, monkeypatch): # Restoration keeps stalling without a certificate but reduces θ each time # (8 -> 4 -> 2 -> 1); the driver must resume through the whole progressing # streak and only fail on the first non-progressing repeat. xp = namespace problem = HS7(xp) x0 = array(xp, [2.0, 2.0]) _fail_search_after(monkeypatch, 1) thetas = [8.0, 4.0, 2.0, 1.0, 1.0] restore_calls = {"n": 0} def stub_restore(self, x, s, m, m_eq, mask_l, mask_u, lower_safe, upper_safe): theta = thetas[min(restore_calls["n"], len(thetas) - 1)] restore_calls["n"] += 1 return _hs7_point_with_violation(xp, theta), s, RestorationExit.BUDGET monkeypatch.setattr(IPMDriver, "_restore", stub_restore) > result = solve( problem, x0, options=Options(hessian="exact", linsolve="dense", max_iter=40), ) tests/regression/test_uncertified_restoration_stall.py:104: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([2.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __ test_uncertified_stall_still_gets_the_x0_anchored_rescue[array_api_strict] __ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa9c0a7b0> def test_uncertified_stall_still_gets_the_x0_anchored_rescue(namespace, monkeypatch): # The first restexit A/B (2026-07-08) regression: HS90/HS91/SNAKE/BT9/HS39 # were second-chance rescues (feasibility IS reachable from x0), but the # uncertified-stall path terminated as RESTORATION_FAILED without ever # probing from x0. A non-progressing uncertified stall must spend the same # one-shot probe before giving up. xp = namespace problem = HS7(xp) x0 = array(xp, [2.0, 2.0]) # Searches 2 and 3 fail (driving the two uncertified stalls that spend the # probe); after the rescue jumps to the feasible point the search works # again — the real HS90/SNAKE anatomy, where the solve converges from the # rescued basin. calls = {"n": 0} original = FilterLineSearch.search def flaky(self, **kwargs): calls["n"] += 1 if calls["n"] in (2, 3): return LineSearchResult(self._o.alpha_min_frac, False, False, True) return original(self, **kwargs) monkeypatch.setattr(FilterLineSearch, "search", flaky) probe_seen = {"n": 0} def stub_restore(self, x, s, m, m_eq, mask_l, mask_u, lower_safe, upper_safe): if float(xp.max(xp.abs(x - x0))) < 1e-9: probe_seen["n"] += 1 feasible = array(xp, [0.0, 1.7320508075688772]) # sqrt(3) return feasible, s, RestorationExit.FEASIBLE return _hs7_point_with_violation(xp, 8.0), s, RestorationExit.STALL_WINDOW monkeypatch.setattr(IPMDriver, "_restore", stub_restore) > result = solve( problem, x0, options=Options(hessian="exact", linsolve="dense", max_iter=40), ) tests/regression/test_uncertified_restoration_stall.py:151: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([2.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __ test_certified_stationary_claim_still_reports_infeasible[array_api_strict] __ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa9c0bd90> def test_certified_stationary_claim_still_reports_infeasible(namespace, monkeypatch): # Control: a stationarity-certified claim (surviving its x0-anchored second # chance) must keep reporting INFEASIBLE exactly as before. xp = namespace problem = HS7(xp) x0 = array(xp, [2.0, 2.0]) _fail_search_after(monkeypatch, 1) def stub_restore(self, x, s, m, m_eq, mask_l, mask_u, lower_safe, upper_safe): return array(xp, [5.0, -5.0]), s, RestorationExit.STATIONARY monkeypatch.setattr(IPMDriver, "_restore", stub_restore) > result = solve( problem, x0, options=Options(hessian="exact", linsolve="dense", max_iter=40), ) tests/regression/test_uncertified_restoration_stall.py:175: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([2.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ________________________ test_no_banned_imports_in_core ________________________ def test_no_banned_imports_in_core(): result = subprocess.run( [sys.executable, str(REPO_ROOT / "scripts" / "check_purity.py")], capture_output=True, text=True, ) > assert result.returncode == 0, result.stdout + result.stderr E AssertionError: /usr/bin/python3: can't open file '/builddir/build/BUILD/python-ipax-0.13.0-build/ipax-0.13.0/scripts/check_purity.py': [Errno 2] No such file or directory E E assert 2 == 0 E + where 2 = CompletedProcess(args=['/usr/bin/python3', '/builddir/build/BUILD/python-ipax-0.13.0-build/ipax-0.13.0/scripts/check_p...ddir/build/BUILD/python-ipax-0.13.0-build/ipax-0.13.0/scripts/check_purity.py': [Errno 2] No such file or directory\n").returncode tests/test_purity_gate.py:25: AssertionError ______________ test_core_may_not_import_the_interfaces_front_ends ______________ def test_core_may_not_import_the_interfaces_front_ends(): # ipax/interfaces/ may import SciPy because nothing in the core imports it; # a core import of ipax.interfaces would pull SciPy into `import ipax`. import ast > purity = _load_purity_script() ^^^^^^^^^^^^^^^^^^^^^ tests/test_purity_gate.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_purity_gate.py:35: in _load_purity_script spec.loader.exec_module(module) :747: in exec_module ??? :880: in get_code ??? _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_frozen_importlib_external.SourceFileLoader object at 0xffffa92c2e10> path = '/builddir/build/BUILD/python-ipax-0.13.0-build/ipax-0.13.0/scripts/check_purity.py' > ??? E FileNotFoundError: [Errno 2] No such file or directory: '/builddir/build/BUILD/python-ipax-0.13.0-build/ipax-0.13.0/scripts/check_purity.py' :926: FileNotFoundError ____________ test_relative_imports_of_the_interfaces_are_caught_too ____________ def test_relative_imports_of_the_interfaces_are_caught_too(): import ast > purity = _load_purity_script() ^^^^^^^^^^^^^^^^^^^^^ tests/test_purity_gate.py:74: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_purity_gate.py:35: in _load_purity_script spec.loader.exec_module(module) :747: in exec_module ??? :880: in get_code ??? _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_frozen_importlib_external.SourceFileLoader object at 0xffffa999ca70> path = '/builddir/build/BUILD/python-ipax-0.13.0-build/ipax-0.13.0/scripts/check_purity.py' > ??? E FileNotFoundError: [Errno 2] No such file or directory: '/builddir/build/BUILD/python-ipax-0.13.0-build/ipax-0.13.0/scripts/check_purity.py' :926: FileNotFoundError ___________ test_capabilities_reports_real_devices[array_api_strict] ___________ namespace = def test_capabilities_reports_real_devices(namespace): """Devices come from the Array-API info namespace, not a hardcoded ``cpu``.""" with implemented("device probe"): caps = capabilities(namespace) assert isinstance(caps.devices, tuple) assert len(caps.devices) >= 1 assert all(isinstance(d, str) for d in caps.devices) # Exactly what the namespace's own inspection API reports — a CPU for # numpy/torch/array_api_strict, only CUDA devices for CuPy (which has no # CPU device) — never a hard-coded "cpu". > info = namespace.__array_namespace_info__() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_backend_namespace.py:89: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (), kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function __array_namespace_info__ requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ________ test_breedveld_globalization_solves_bound_qp[array_api_strict] ________ namespace = def test_breedveld_globalization_solves_bound_qp(namespace): problem = BoundConstrainedQP(namespace) > result = solve( problem, array(namespace, [0.25, 0.75]), options=Options(hessian="exact", linsolve="dense", globalization="breedveld"), ) tests/unit/test_breedveld.py:84: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0. , 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ______ test_breedveld_globalization_uses_breedveld_tau[array_api_strict] _______ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa9c0bd90> def test_breedveld_globalization_uses_breedveld_tau(namespace, monkeypatch): captured: list[float] = [] original = IPMDriver._alpha_primal def capture_tau(self, step, s, m, x_minus_l, u_minus_x, mask_l, mask_u, tau): captured.append(tau) return original(self, step, s, m, x_minus_l, u_minus_x, mask_l, mask_u, tau) monkeypatch.setattr(IPMDriver, "_alpha_primal", capture_tau) > result = solve( BoundConstrainedQP(namespace), array(namespace, [0.25, 0.75]), options=Options( hessian="exact", linsolve="dense", globalization="breedveld", # The probing default's affine probe legitimately measures the # maximal steplength at τ = 1, which would contaminate the captured # values; monotone keeps every _alpha_primal call a line-search one. mu_schedule="monotone", barrier=BarrierOptions(tau_min=0.99), breedveld=BreedveldOptions(tau=0.5), ), ) tests/unit/test_breedveld.py:102: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0. , 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_common_step_couples_the_primal_and_dual_step_lengths[array_api_strict] __ namespace = def test_common_step_couples_the_primal_and_dual_step_lengths(namespace): # HS71 under the runner's Breedveld setup takes different primal and dual # fraction-to-boundary lengths by default; with ``common_step`` every # accepted step moves both by the same α. problem, x0 = _hs71(namespace) > separate = solve(problem, x0, options=_runner_like()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_breedveld.py:165: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([3., 3., 3., 3.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __ test_common_step_hands_the_controller_the_smaller_length[array_api_strict] __ monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa9c45780> namespace = def test_common_step_hands_the_controller_the_smaller_length(monkeypatch, namespace): # α_max of the ratio control / Markov backtracking is min(α_p, α_d) of the # fraction-to-boundary rule (Breedveld 2017 §2.1). Monotone μ without a # corrector keeps every _alpha_primal/_alpha_dual call a line-search one. lengths: list[tuple[str, float]] = [] maxima: list[float] = [] orig_p, orig_d = IPMDriver._alpha_primal, IPMDriver._alpha_dual orig_search = BreedveldController.search def spy_p(self, *args, **kwargs): value = orig_p(self, *args, **kwargs) lengths.append(("p", value)) return value def spy_d(self, *args, **kwargs): value = orig_d(self, *args, **kwargs) lengths.append(("d", value)) return value def spy_search(self, **kwargs): maxima.append(kwargs["alpha_max"]) return orig_search(self, **kwargs) monkeypatch.setattr(IPMDriver, "_alpha_primal", spy_p) monkeypatch.setattr(IPMDriver, "_alpha_dual", spy_d) monkeypatch.setattr(BreedveldController, "search", spy_search) problem, x0 = _hs71(namespace) options = dataclasses.replace( _runner_like(common_step=True), corrections="none", mu_schedule="monotone" ) > result = solve(problem, x0, options=options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_breedveld.py:204: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([3., 3., 3., 3.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_common_step_backtracking_shrinks_both_updates[array_api_strict] _____ monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa9c45cc0> namespace = def test_common_step_backtracking_shrinks_both_updates(monkeypatch, namespace): # A backtracked α (ratio control / Markov filter) moves the duals by the # same shrunken length as the primal step, not by the dual boundary length. orig_search = BreedveldController.search returned: list[float] = [] def half_step(self, **kwargs): result = orig_search(self, **kwargs) returned.append(0.5 * result.alpha) return dataclasses.replace(result, alpha=0.5 * result.alpha) monkeypatch.setattr(BreedveldController, "search", half_step) problem, x0 = _hs71(namespace) options = dataclasses.replace(_runner_like(common_step=True), max_iter=8) > result = solve(problem, x0, options=options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_breedveld.py:230: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([3., 3., 3., 3.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___ test_common_step_leaves_the_corrector_probes_separate[array_api_strict] ____ monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa9c0a7b0> namespace = def test_common_step_leaves_the_corrector_probes_separate(monkeypatch, namespace): # ``common_step`` couples the step the driver takes, not the predictor- # corrector's step-length probes (the Head-and-Neck_01 diagnosis' lever; # coupling the probes too re-targets μ and was measured worse there). At # the shared start the corrector sees exactly the default's probe lengths. seen: dict[bool, list[tuple[float, float]]] = {False: [], True: []} orig = MehrotraCorrector.correct arm = {"common": False} def spy(self, context, mu_target): seen[arm["common"]].append( ( context.alpha_primal(context.affine, tau=1.0), context.alpha_dual(context.affine, tau=1.0), ) ) return orig(self, context, mu_target) monkeypatch.setattr(MehrotraCorrector, "correct", spy) problem, x0 = _hs71(namespace) > solve(problem, x0, options=_runner_like()) tests/unit/test_breedveld.py:258: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([3., 3., 3., 3.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___ test_common_step_is_inert_under_the_filter_line_search[array_api_strict] ___ namespace = def test_common_step_is_inert_under_the_filter_line_search(namespace): # The option belongs to the Breedveld controller: the IPOPT filter line # search keeps its separate primal and dual lengths (W&B 2006, eq. (15)). problem, x0 = _hs71(namespace) > base = solve(problem, x0, options=Options()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_breedveld.py:270: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([3., 3., 3., 3.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __ test_common_step_default_is_bit_identical[array_api_strict-HS21-breedveld] __ namespace = name = 'HS21', mode = 'breedveld' @pytest.mark.parametrize(("name", "mode"), sorted(_FINGERPRINTS)) def test_common_step_default_is_bit_identical(namespace, name, mode): cls, start = _STARTS[name] problem, x0 = cls(namespace), array(namespace, start) base = _runner_like() if mode == "breedveld" else Options() explicit = dataclasses.replace(base, breedveld=BreedveldOptions(common_step=False)) > implicit_result = solve(problem, x0, options=base) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_breedveld.py:311: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([26., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __ test_common_step_default_is_bit_identical[array_api_strict-HS35-breedveld] __ namespace = name = 'HS35', mode = 'breedveld' @pytest.mark.parametrize(("name", "mode"), sorted(_FINGERPRINTS)) def test_common_step_default_is_bit_identical(namespace, name, mode): cls, start = _STARTS[name] problem, x0 = cls(namespace), array(namespace, start) base = _runner_like() if mode == "breedveld" else Options() explicit = dataclasses.replace(base, breedveld=BreedveldOptions(common_step=False)) > implicit_result = solve(problem, x0, options=base) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_breedveld.py:311: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __ test_common_step_default_is_bit_identical[array_api_strict-HS43-breedveld] __ namespace = name = 'HS43', mode = 'breedveld' @pytest.mark.parametrize(("name", "mode"), sorted(_FINGERPRINTS)) def test_common_step_default_is_bit_identical(namespace, name, mode): cls, start = _STARTS[name] problem, x0 = cls(namespace), array(namespace, start) base = _runner_like() if mode == "breedveld" else Options() explicit = dataclasses.replace(base, breedveld=BreedveldOptions(common_step=False)) > implicit_result = solve(problem, x0, options=base) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_breedveld.py:311: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1.], dtype=array_api_strict.float64), Array([100., 100., 50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___ test_common_step_default_is_bit_identical[array_api_strict-HS43-filter] ____ namespace = name = 'HS43', mode = 'filter' @pytest.mark.parametrize(("name", "mode"), sorted(_FINGERPRINTS)) def test_common_step_default_is_bit_identical(namespace, name, mode): cls, start = _STARTS[name] problem, x0 = cls(namespace), array(namespace, start) base = _runner_like() if mode == "breedveld" else Options() explicit = dataclasses.replace(base, breedveld=BreedveldOptions(common_step=False)) > implicit_result = solve(problem, x0, options=base) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_breedveld.py:311: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1.], dtype=array_api_strict.float64), Array([100., 100., 50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __ test_common_step_default_is_bit_identical[array_api_strict-HS71-breedveld] __ namespace = name = 'HS71', mode = 'breedveld' @pytest.mark.parametrize(("name", "mode"), sorted(_FINGERPRINTS)) def test_common_step_default_is_bit_identical(namespace, name, mode): cls, start = _STARTS[name] problem, x0 = cls(namespace), array(namespace, start) base = _runner_like() if mode == "breedveld" else Options() explicit = dataclasses.replace(base, breedveld=BreedveldOptions(common_step=False)) > implicit_result = solve(problem, x0, options=base) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_breedveld.py:311: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([3., 3., 3., 3.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___ test_common_step_default_is_bit_identical[array_api_strict-HS71-filter] ____ namespace = name = 'HS71', mode = 'filter' @pytest.mark.parametrize(("name", "mode"), sorted(_FINGERPRINTS)) def test_common_step_default_is_bit_identical(namespace, name, mode): cls, start = _STARTS[name] problem, x0 = cls(namespace), array(namespace, start) base = _runner_like() if mode == "breedveld" else Options() explicit = dataclasses.replace(base, breedveld=BreedveldOptions(common_step=False)) > implicit_result = solve(problem, x0, options=base) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_breedveld.py:311: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([3., 3., 3., 3.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___ test_solve_through_the_hook_matches_the_two_pass_solve[array_api_strict] ___ namespace = def test_solve_through_the_hook_matches_the_two_pass_solve(namespace): from ipax import Options, solve xp = namespace opts = Options(hessian="exact", linsolve="dense", max_iter=100) x0 = xp.zeros((8,), dtype=xp.float64) log: list[str] = [] > r_fused = solve(_qp(xp, fused=True, log=log), x0, options=opts) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_condensed_curvature_gram.py:339: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:177: in solve resolved = lower_linear_inequalities(resolved, x0, xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:373: in lower_linear_inequalities lowered_jac, offset = _lower_two_sided(matrix, lower, upper, xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:275: in _lower_two_sided return _lower_wrapped(matrix, lower, upper, xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:204: in _lower_wrapped op = _SignedRowSelection(matrix, finite_l, finite_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1493: in __init__ self._expand_lower = xp.cumulative_sum(lower_int) * lower_int ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0], dtype=array_api_strict.int64),) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function cumulative_sum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___ test_breedveld_gondzio_variant_targets_and_acceptance[array_api_strict] ____ namespace = def test_breedveld_gondzio_variant_targets_and_acceptance(namespace): # Breedveld 2017 supplement A.2: after the full Mehrotra corrector, probe # the trial step α̌ = min(1.1·α, 1), target the trial products by the # two-tier rule of eqs. (13)–(14), and keep a correction only when the # step length grows to ≥ 1.07·α. xp = namespace affine = _step(xp, ds=-1.0, dy=-1.0) mehrotra = _step(xp, ds=10.0, dy=10.0) first = _step(xp, ds=0.1, dy=0.1) second = _step(xp, ds=0.2, dy=0.2) solves = [] returns = [mehrotra, first, second] def solve(comp_s, comp_l, comp_u): solves.append(float(comp_s[0])) return returns[len(solves) - 1] alphas = {id(affine): 0.5, id(mehrotra): 0.5, id(first): 0.6, id(second): 0.61} def alpha(step, *, tau): return alphas[id(step)] context = _context(xp, affine, solve=solve, alpha_primal=alpha, alpha_dual=alpha) corrector = GondzioCorrector( CorrectionsOptions( method="gondzio", gondzio_max_corrections=3, gondzio_variant="breedveld" ) ) > result = corrector.correct(context, 1.0) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_corrections.py:286: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/corrections.py:566: in correct state = _mehrotra_step(context, xp, mu_target, self._options.gondzio_gamma) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/corrections.py:459: in _mehrotra_step comp_s = xp.clip(comp_s, lo, hi) ^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0.], dtype=array_api_strict.float64), 0.1, 10.0), kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function clip requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_breedveld_gondzio_capped_corrections[array_api_strict-10.0-10.0--40.0] __ namespace = ds = 10.0, dy = 10.0, expected_correction = -40.0 @pytest.mark.parametrize( ("ds", "dy", "expected_correction"), [ (10.0, 10.0, -40.0), # 8 − t < −5·β_max·μ ⇒ capped at −40 (1.0, 1.0, 8.0 - 2.55 * 3.55), # β_max·μ < t, uncapped ⇒ β_max·μ − t (-1.0, -1.0, 0.0), # inside [β_min·μ, β_max·μ] ⇒ untouched (-3.5, -5.0, 0.2 - 0.075 * 0.25), # t < β_min·μ ⇒ β_min·μ − t ], ) def test_breedveld_gondzio_capped_corrections(namespace, ds, dy, expected_correction): # Breedveld 2017 supplement A.2, eqs. (13)–(14) in the capped reading # (μ = 1, β = 0.2 / 8, trial α̌ = 1.1·0.5 = 0.55; the Mehrotra target # clips to 0.1). xp = namespace affine = _step(xp, ds=-1.0, dy=-1.0) mehrotra = _step(xp, ds=ds, dy=dy) solves = [] def solve(comp_s, comp_l, comp_u): solves.append(float(comp_s[0])) return mehrotra if len(solves) == 1 else None context = _context( xp, affine, solve=solve, alpha_primal=lambda step, *, tau: 0.5, alpha_dual=lambda step, *, tau: 0.5, ) GondzioCorrector( CorrectionsOptions( method="gondzio", gondzio_max_corrections=1, gondzio_variant="breedveld" ) > ).correct(context, 1.0) ^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_corrections.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/corrections.py:566: in correct state = _mehrotra_step(context, xp, mu_target, self._options.gondzio_gamma) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/corrections.py:459: in _mehrotra_step comp_s = xp.clip(comp_s, lo, hi) ^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0.], dtype=array_api_strict.float64), 0.1, 10.0), kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function clip requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_breedveld_gondzio_capped_corrections[array_api_strict-1.0-1.0--1.0524999999999984] _ namespace = ds = 1.0, dy = 1.0, expected_correction = -1.0524999999999984 @pytest.mark.parametrize( ("ds", "dy", "expected_correction"), [ (10.0, 10.0, -40.0), # 8 − t < −5·β_max·μ ⇒ capped at −40 (1.0, 1.0, 8.0 - 2.55 * 3.55), # β_max·μ < t, uncapped ⇒ β_max·μ − t (-1.0, -1.0, 0.0), # inside [β_min·μ, β_max·μ] ⇒ untouched (-3.5, -5.0, 0.2 - 0.075 * 0.25), # t < β_min·μ ⇒ β_min·μ − t ], ) def test_breedveld_gondzio_capped_corrections(namespace, ds, dy, expected_correction): # Breedveld 2017 supplement A.2, eqs. (13)–(14) in the capped reading # (μ = 1, β = 0.2 / 8, trial α̌ = 1.1·0.5 = 0.55; the Mehrotra target # clips to 0.1). xp = namespace affine = _step(xp, ds=-1.0, dy=-1.0) mehrotra = _step(xp, ds=ds, dy=dy) solves = [] def solve(comp_s, comp_l, comp_u): solves.append(float(comp_s[0])) return mehrotra if len(solves) == 1 else None context = _context( xp, affine, solve=solve, alpha_primal=lambda step, *, tau: 0.5, alpha_dual=lambda step, *, tau: 0.5, ) GondzioCorrector( CorrectionsOptions( method="gondzio", gondzio_max_corrections=1, gondzio_variant="breedveld" ) > ).correct(context, 1.0) ^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_corrections.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/corrections.py:566: in correct state = _mehrotra_step(context, xp, mu_target, self._options.gondzio_gamma) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/corrections.py:459: in _mehrotra_step comp_s = xp.clip(comp_s, lo, hi) ^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0.], dtype=array_api_strict.float64), 0.1, 10.0), kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function clip requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __ test_breedveld_gondzio_capped_corrections[array_api_strict--1.0--1.0-0.0] ___ namespace = ds = -1.0, dy = -1.0, expected_correction = 0.0 @pytest.mark.parametrize( ("ds", "dy", "expected_correction"), [ (10.0, 10.0, -40.0), # 8 − t < −5·β_max·μ ⇒ capped at −40 (1.0, 1.0, 8.0 - 2.55 * 3.55), # β_max·μ < t, uncapped ⇒ β_max·μ − t (-1.0, -1.0, 0.0), # inside [β_min·μ, β_max·μ] ⇒ untouched (-3.5, -5.0, 0.2 - 0.075 * 0.25), # t < β_min·μ ⇒ β_min·μ − t ], ) def test_breedveld_gondzio_capped_corrections(namespace, ds, dy, expected_correction): # Breedveld 2017 supplement A.2, eqs. (13)–(14) in the capped reading # (μ = 1, β = 0.2 / 8, trial α̌ = 1.1·0.5 = 0.55; the Mehrotra target # clips to 0.1). xp = namespace affine = _step(xp, ds=-1.0, dy=-1.0) mehrotra = _step(xp, ds=ds, dy=dy) solves = [] def solve(comp_s, comp_l, comp_u): solves.append(float(comp_s[0])) return mehrotra if len(solves) == 1 else None context = _context( xp, affine, solve=solve, alpha_primal=lambda step, *, tau: 0.5, alpha_dual=lambda step, *, tau: 0.5, ) GondzioCorrector( CorrectionsOptions( method="gondzio", gondzio_max_corrections=1, gondzio_variant="breedveld" ) > ).correct(context, 1.0) ^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_corrections.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/corrections.py:566: in correct state = _mehrotra_step(context, xp, mu_target, self._options.gondzio_gamma) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/corrections.py:459: in _mehrotra_step comp_s = xp.clip(comp_s, lo, hi) ^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0.], dtype=array_api_strict.float64), 0.1, 10.0), kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function clip requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_breedveld_gondzio_capped_corrections[array_api_strict--3.5--5.0-0.18125000000000002] _ namespace = ds = -3.5, dy = -5.0, expected_correction = 0.18125000000000002 @pytest.mark.parametrize( ("ds", "dy", "expected_correction"), [ (10.0, 10.0, -40.0), # 8 − t < −5·β_max·μ ⇒ capped at −40 (1.0, 1.0, 8.0 - 2.55 * 3.55), # β_max·μ < t, uncapped ⇒ β_max·μ − t (-1.0, -1.0, 0.0), # inside [β_min·μ, β_max·μ] ⇒ untouched (-3.5, -5.0, 0.2 - 0.075 * 0.25), # t < β_min·μ ⇒ β_min·μ − t ], ) def test_breedveld_gondzio_capped_corrections(namespace, ds, dy, expected_correction): # Breedveld 2017 supplement A.2, eqs. (13)–(14) in the capped reading # (μ = 1, β = 0.2 / 8, trial α̌ = 1.1·0.5 = 0.55; the Mehrotra target # clips to 0.1). xp = namespace affine = _step(xp, ds=-1.0, dy=-1.0) mehrotra = _step(xp, ds=ds, dy=dy) solves = [] def solve(comp_s, comp_l, comp_u): solves.append(float(comp_s[0])) return mehrotra if len(solves) == 1 else None context = _context( xp, affine, solve=solve, alpha_primal=lambda step, *, tau: 0.5, alpha_dual=lambda step, *, tau: 0.5, ) GondzioCorrector( CorrectionsOptions( method="gondzio", gondzio_max_corrections=1, gondzio_variant="breedveld" ) > ).correct(context, 1.0) ^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_corrections.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/corrections.py:566: in correct state = _mehrotra_step(context, xp, mu_target, self._options.gondzio_gamma) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/corrections.py:459: in _mehrotra_step comp_s = xp.clip(comp_s, lo, hi) ^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0.], dtype=array_api_strict.float64), 0.1, 10.0), kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function clip requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ________ test_breedveld_gondzio_corrects_bound_blocks[array_api_strict] ________ namespace = def test_breedveld_gondzio_corrects_bound_blocks(namespace): # The bound blocks get the same capped correction on their finite # entries and stay zero off the masks (Breedveld 2017 supplement A.2, # eq. (14) for the upper block). μ = 1; α = 0.5 ⇒ trial α̌ = 0.55. xp = namespace zero2 = array(xp, [0.0, 0.0]) affine = NewtonStep( dx=zero2, ds=array(xp, [-1.0]), dy_eq=array(xp, []), dy_ineq=array(xp, [-1.0]), dz_lower=zero2, dz_upper=zero2, ) mehrotra = NewtonStep( dx=array(xp, [1.0, 1.0]), ds=array(xp, [-1.0]), dy_eq=array(xp, []), dy_ineq=array(xp, [-1.0]), dz_lower=array(xp, [10.0, 5.0]), dz_upper=array(xp, [-0.5, 3.0]), ) solves = [] def solve(comp_s, comp_l, comp_u): solves.append((comp_s, comp_l, comp_u)) return mehrotra if len(solves) == 1 else None mask = array(xp, [1.0, 0.0]) > 0.5 context = CorrectionContext( affine=affine, s=array(xp, [2.0]), y_ineq=array(xp, [3.0]), x_minus_l=array(xp, [1.0, 1.0]), u_minus_x=array(xp, [1.0, 1.0]), z_lower=array(xp, [2.0, 0.0]), z_upper=array(xp, [0.5, 0.0]), mask_l=mask, mask_u=mask, solve=solve, alpha_primal=lambda step, *, tau: 0.5, alpha_dual=lambda step, *, tau: 0.5, ) GondzioCorrector( CorrectionsOptions( method="gondzio", gondzio_max_corrections=1, gondzio_variant="breedveld" ) > ).correct(context, 1.0) ^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_corrections.py:401: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/corrections.py:566: in correct state = _mehrotra_step(context, xp, mu_target, self._options.gondzio_gamma) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/corrections.py:459: in _mehrotra_step comp_s = xp.clip(comp_s, lo, hi) ^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0.], dtype=array_api_strict.float64), 0.1, 10.0), kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function clip requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____ test_breedveld_gondzio_variant_rejects_small_growth[array_api_strict] _____ namespace = def test_breedveld_gondzio_variant_rejects_small_growth(namespace): # A correction that grows the step by less than 7 % is discarded. xp = namespace affine = _step(xp, ds=-1.0, dy=-1.0) mehrotra = _step(xp, ds=-0.5, dy=-0.5) small = _step(xp, ds=-0.4, dy=-0.4) returns = [mehrotra, small] solves = [] def solve(comp_s, comp_l, comp_u): solves.append(comp_s) return returns[len(solves) - 1] alphas = {id(affine): 0.5, id(mehrotra): 0.5, id(small): 0.53} context = _context( xp, affine, solve=solve, alpha_primal=lambda step, *, tau: alphas[id(step)], alpha_dual=lambda step, *, tau: alphas[id(step)], ) corrector = GondzioCorrector( CorrectionsOptions(method="gondzio", gondzio_variant="breedveld") ) > result = corrector.correct(context, 1.0) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_corrections.py:440: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/corrections.py:566: in correct state = _mehrotra_step(context, xp, mu_target, self._options.gondzio_gamma) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/corrections.py:459: in _mehrotra_step comp_s = xp.clip(comp_s, lo, hi) ^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0.], dtype=array_api_strict.float64), 0.1, 10.0), kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function clip requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_mehrotra_second_order_targets_clipped_to_symmetric_box[array_api_strict] _ namespace = def test_mehrotra_second_order_targets_clipped_to_symmetric_box(namespace): # Regression: the −ΔΔ term from a *quasi-Newton* affine direction can be # arbitrarily large (RT least-squares example: targets ~1e5 inflated the # duals by five orders of magnitude in one step). Targets are clipped into # the symmetric neighbourhood [γμ, μ/γ] (Colombo & Gondzio 2008). xp = namespace affine = _step(xp, ds=-100.0, dy=100.0) # −ΔsΔλ = +1e4 ≫ μ captured = [] def solve(comp_s, comp_l, comp_u): captured.append((comp_s, comp_l, comp_u)) return None context = _context( xp, affine, solve=solve, alpha_primal=lambda step, *, tau: 0.5, alpha_dual=lambda step, *, tau: 0.5, ) corrector = MehrotraCorrector(CorrectionsOptions(method="mehrotra")) > corrector.correct(context, 1.0) tests/unit/test_corrections.py:472: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/corrections.py:548: in correct return _mehrotra_step( ipax/ipm/corrections.py:459: in _mehrotra_step comp_s = xp.clip(comp_s, lo, hi) ^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([10001.], dtype=array_api_strict.float64), 0.1, 10.0), kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function clip requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_mehrotra_failed_corrector_matches_affine_zero_target[array_api_strict] __ namespace = def test_mehrotra_failed_corrector_matches_affine_zero_target(namespace): xp = namespace affine = _step(xp, ds=-1.0, dy=-1.0) context = _context( xp, affine, solve=lambda *args: None, alpha_primal=lambda step, *, tau: 0.5, alpha_dual=lambda step, *, tau: 0.5, ) corrector = MehrotraCorrector(CorrectionsOptions(method="mehrotra")) > result = corrector.correct(context, probing_mu(context)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_corrections.py:491: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/corrections.py:548: in correct return _mehrotra_step( ipax/ipm/corrections.py:459: in _mehrotra_step comp_s = xp.clip(comp_s, lo, hi) ^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0.46484375], dtype=array_api_strict.float64), 0.146484375, 14.6484375) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function clip requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_mehrotra_falls_back_to_centered_when_correction_collapses_the_step[array_api_strict] _ namespace = def test_mehrotra_falls_back_to_centered_when_correction_collapses_the_step( namespace, ): # Task-6 fragility (S2MPJ HS71 × exact/dense+mehrotra): the −ΔΔ term # presumes a Newton predictor, and on nonconvex curvature the corrected # direction can collapse the maximal boundary step. When the corrected # step keeps less than half the predictor's combined step length, the # corrector must degrade to the plain centered Newton step at the same # μ target (what corrections="none" would compute) instead of handing the # driver a crippled direction. xp = namespace affine = _step(xp, ds=-1.0, dy=-1.0) corrected = _step(xp, ds=-0.9, dy=-0.9) centered = _step(xp, ds=-0.5, dy=-0.5) solves = [] def solve(comp_s, comp_l, comp_u): solves.append(comp_s) return corrected if len(solves) == 1 else centered alphas = {id(affine): 0.45, id(corrected): 0.05, id(centered): 0.4} def alpha(step, *, tau): return alphas[id(step)] context = _context(xp, affine, solve=solve, alpha_primal=alpha, alpha_dual=alpha) corrector = MehrotraCorrector(CorrectionsOptions(method="mehrotra")) > result = corrector.correct(context, 1.0) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_corrections.py:526: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/corrections.py:548: in correct return _mehrotra_step( ipax/ipm/corrections.py:459: in _mehrotra_step comp_s = xp.clip(comp_s, lo, hi) ^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0.], dtype=array_api_strict.float64), 0.1, 10.0), kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function clip requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __ test_mehrotra_keeps_a_correction_with_a_comparable_step[array_api_strict] ___ namespace = def test_mehrotra_keeps_a_correction_with_a_comparable_step(namespace): xp = namespace affine = _step(xp, ds=-1.0, dy=-1.0) corrected = _step(xp, ds=-0.9, dy=-0.9) solves = [] def solve(comp_s, comp_l, comp_u): solves.append(comp_s) return corrected alphas = {id(affine): 0.45, id(corrected): 0.40} def alpha(step, *, tau): return alphas[id(step)] context = _context(xp, affine, solve=solve, alpha_primal=alpha, alpha_dual=alpha) corrector = MehrotraCorrector(CorrectionsOptions(method="mehrotra")) > result = corrector.correct(context, 1.0) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_corrections.py:552: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/corrections.py:548: in correct return _mehrotra_step( ipax/ipm/corrections.py:459: in _mehrotra_step comp_s = xp.clip(comp_s, lo, hi) ^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0.], dtype=array_api_strict.float64), 0.1, 10.0), kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function clip requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_mehrotra_fallback_returns_affine_when_the_centered_solve_fails[array_api_strict] _ namespace = def test_mehrotra_fallback_returns_affine_when_the_centered_solve_fails(namespace): xp = namespace affine = _step(xp, ds=-1.0, dy=-1.0) corrected = _step(xp, ds=-0.9, dy=-0.9) solves = [] def solve(comp_s, comp_l, comp_u): solves.append(comp_s) return corrected if len(solves) == 1 else None alphas = {id(affine): 0.45, id(corrected): 0.05} def alpha(step, *, tau): return alphas[id(step)] context = _context(xp, affine, solve=solve, alpha_primal=alpha, alpha_dual=alpha) corrector = MehrotraCorrector(CorrectionsOptions(method="mehrotra")) > result = corrector.correct(context, 1.0) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_corrections.py:576: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/corrections.py:548: in correct return _mehrotra_step( ipax/ipm/corrections.py:459: in _mehrotra_step comp_s = xp.clip(comp_s, lo, hi) ^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0.], dtype=array_api_strict.float64), 0.1, 10.0), kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function clip requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_gondzio_accumulates_partial_trial_residual_and_uses_gamma[array_api_strict] _ namespace = def test_gondzio_accumulates_partial_trial_residual_and_uses_gamma(namespace): xp = namespace affine = _step(xp, ds=-1.0, dy=-1.0) base = _step(xp, ds=-0.4, dy=-0.5) candidate = _step(xp, ds=-0.2, dy=-0.2) candidate_2 = _step(xp, ds=-0.1, dy=-0.1) targets = [] def solve(comp_s, comp_l, comp_u): targets.append((comp_s, comp_l, comp_u)) if len(targets) == 1: return base if len(targets) == 2: return candidate return candidate_2 def alpha_primal(step, *, tau): del tau if step is affine: return 0.5 if step is base: return 0.2 if step is candidate: return 0.8 return 1.0 def alpha_dual(step, *, tau): del tau if step is affine: return 0.5 if step is base: return 0.3 if step is candidate: return 0.8 return 1.0 context = _context( xp, affine, solve=solve, alpha_primal=alpha_primal, alpha_dual=alpha_dual, ) gamma = 0.5 result = GondzioCorrector( CorrectionsOptions( method="gondzio", gondzio_max_corrections=2, gondzio_gamma=gamma ) > ).correct(context, probing_mu(context)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_corrections.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/corrections.py:566: in correct state = _mehrotra_step(context, xp, mu_target, self._options.gondzio_gamma) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/corrections.py:459: in _mehrotra_step comp_s = xp.clip(comp_s, lo, hi) ^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0.46484375], dtype=array_api_strict.float64), 0.732421875, 2.9296875) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function clip requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_expand_indptr_matches_searchsorted[array_api_strict-int64-empty_matrix-[]] _ namespace = counts = [], index_dtype = 'int64' @pytest.mark.parametrize(("name", "counts"), _patterns(), ids=lambda v: str(v)) @pytest.mark.parametrize("index_dtype", ["int64", "int32"]) def test_expand_indptr_matches_searchsorted(namespace, name, counts, index_dtype): del name xp = namespace indptr = _indptr(xp, counts, getattr(xp, index_dtype)) nnz = sum(counts) > _assert_identical(xp, _expand_indptr(xp, indptr, nnz), _reference(xp, indptr, nnz)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_expand_indptr.py:59: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0], dtype=array_api_strict.int64), empty((0,), dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_expand_indptr_matches_searchsorted[array_api_strict-int64-rows_all_empty-[0, 0, 0, 0]] _ namespace = counts = [0, 0, 0, 0], index_dtype = 'int64' @pytest.mark.parametrize(("name", "counts"), _patterns(), ids=lambda v: str(v)) @pytest.mark.parametrize("index_dtype", ["int64", "int32"]) def test_expand_indptr_matches_searchsorted(namespace, name, counts, index_dtype): del name xp = namespace indptr = _indptr(xp, counts, getattr(xp, index_dtype)) nnz = sum(counts) > _assert_identical(xp, _expand_indptr(xp, indptr, nnz), _reference(xp, indptr, nnz)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_expand_indptr.py:59: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0, 0, 0, 0, 0], dtype=array_api_strict.int64), empty((0,), dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_expand_indptr_matches_searchsorted[array_api_strict-int64-single_row-[7]] _ namespace = counts = [7], index_dtype = 'int64' @pytest.mark.parametrize(("name", "counts"), _patterns(), ids=lambda v: str(v)) @pytest.mark.parametrize("index_dtype", ["int64", "int32"]) def test_expand_indptr_matches_searchsorted(namespace, name, counts, index_dtype): del name xp = namespace indptr = _indptr(xp, counts, getattr(xp, index_dtype)) nnz = sum(counts) > _assert_identical(xp, _expand_indptr(xp, indptr, nnz), _reference(xp, indptr, nnz)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_expand_indptr.py:59: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0, 7], dtype=array_api_strict.int64), Array([0, 1, 2, 3, 4, 5, 6], dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_expand_indptr_matches_searchsorted[array_api_strict-int64-single_empty_row-[0]] _ namespace = counts = [0], index_dtype = 'int64' @pytest.mark.parametrize(("name", "counts"), _patterns(), ids=lambda v: str(v)) @pytest.mark.parametrize("index_dtype", ["int64", "int32"]) def test_expand_indptr_matches_searchsorted(namespace, name, counts, index_dtype): del name xp = namespace indptr = _indptr(xp, counts, getattr(xp, index_dtype)) nnz = sum(counts) > _assert_identical(xp, _expand_indptr(xp, indptr, nnz), _reference(xp, indptr, nnz)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_expand_indptr.py:59: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0, 0], dtype=array_api_strict.int64), empty((0,), dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_expand_indptr_matches_searchsorted[array_api_strict-int64-leading_trailing_empty-[0, 0, 3, 1, 0, 0, 2, 0]] _ namespace = counts = [0, 0, 3, 1, 0, 0, ...], index_dtype = 'int64' @pytest.mark.parametrize(("name", "counts"), _patterns(), ids=lambda v: str(v)) @pytest.mark.parametrize("index_dtype", ["int64", "int32"]) def test_expand_indptr_matches_searchsorted(namespace, name, counts, index_dtype): del name xp = namespace indptr = _indptr(xp, counts, getattr(xp, index_dtype)) nnz = sum(counts) > _assert_identical(xp, _expand_indptr(xp, indptr, nnz), _reference(xp, indptr, nnz)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_expand_indptr.py:59: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0, 0, 0, 3, 4, 4, 4, 6, 6], dtype=array_api_strict.int64), Array([0, 1, 2, 3, 4, 5], dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_expand_indptr_matches_searchsorted[array_api_strict-int64-random_0-[3, 0, 0, 3, 1, 2, 2, 5, 0, 0, 1, 1]] _ namespace = counts = [3, 0, 0, 3, 1, 2, ...], index_dtype = 'int64' @pytest.mark.parametrize(("name", "counts"), _patterns(), ids=lambda v: str(v)) @pytest.mark.parametrize("index_dtype", ["int64", "int32"]) def test_expand_indptr_matches_searchsorted(namespace, name, counts, index_dtype): del name xp = namespace indptr = _indptr(xp, counts, getattr(xp, index_dtype)) nnz = sum(counts) > _assert_identical(xp, _expand_indptr(xp, indptr, nnz), _reference(xp, indptr, nnz)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_expand_indptr.py:59: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([ 0, 3, 3, 3, 6, 7, 9, 11, 16, 16, 16, 17, 18], dtype=array_api_strict.int64), Array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17], dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_expand_indptr_matches_searchsorted[array_api_strict-int64-random_1-[0, 5, 1]] _ namespace = counts = [0, 5, 1], index_dtype = 'int64' @pytest.mark.parametrize(("name", "counts"), _patterns(), ids=lambda v: str(v)) @pytest.mark.parametrize("index_dtype", ["int64", "int32"]) def test_expand_indptr_matches_searchsorted(namespace, name, counts, index_dtype): del name xp = namespace indptr = _indptr(xp, counts, getattr(xp, index_dtype)) nnz = sum(counts) > _assert_identical(xp, _expand_indptr(xp, indptr, nnz), _reference(xp, indptr, nnz)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_expand_indptr.py:59: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0, 0, 5, 6], dtype=array_api_strict.int64), Array([0, 1, 2, 3, 4, 5], dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_expand_indptr_matches_searchsorted[array_api_strict-int64-random_2-[0, 4, 0, 0, 0, 2, 2, 0]] _ namespace = counts = [0, 4, 0, 0, 0, 2, ...], index_dtype = 'int64' @pytest.mark.parametrize(("name", "counts"), _patterns(), ids=lambda v: str(v)) @pytest.mark.parametrize("index_dtype", ["int64", "int32"]) def test_expand_indptr_matches_searchsorted(namespace, name, counts, index_dtype): del name xp = namespace indptr = _indptr(xp, counts, getattr(xp, index_dtype)) nnz = sum(counts) > _assert_identical(xp, _expand_indptr(xp, indptr, nnz), _reference(xp, indptr, nnz)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_expand_indptr.py:59: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0, 0, 4, 4, 4, 4, 6, 8, 8], dtype=array_api_strict.int64), Array([0, 1, 2, 3, 4, 5, 6, 7], dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_expand_indptr_matches_searchsorted[array_api_strict-int64-random_3-[3, 4, 0, 0, 0, 5, 4, 2, 3, 1, 5, 0, 0, 4, 1, 0, 0, 3, 2, 5, 0, 1, 0, 1, 2, 0, 0, 0, 5, 0, 2, 1, 0, 0, 0, 5, 3, 2, 3, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 1, 0, 5, 3, 0, 2, 5, 5]] _ namespace = counts = [3, 4, 0, 0, 0, 5, ...], index_dtype = 'int64' @pytest.mark.parametrize(("name", "counts"), _patterns(), ids=lambda v: str(v)) @pytest.mark.parametrize("index_dtype", ["int64", "int32"]) def test_expand_indptr_matches_searchsorted(namespace, name, counts, index_dtype): del name xp = namespace indptr = _indptr(xp, counts, getattr(xp, index_dtype)) nnz = sum(counts) > _assert_identical(xp, _expand_indptr(xp, indptr, nnz), _reference(xp, indptr, nnz)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_expand_indptr.py:59: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([ 0, 3, 7, 7, 7, 7, 12, 16, 18, 21, 22, 27, 27, 27, 31, 32, 32, 32, 35, 37, 42, 42, 43, 43, ..., 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97], dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_expand_indptr_matches_searchsorted[array_api_strict-int32-empty_matrix-[]] _ namespace = counts = [], index_dtype = 'int32' @pytest.mark.parametrize(("name", "counts"), _patterns(), ids=lambda v: str(v)) @pytest.mark.parametrize("index_dtype", ["int64", "int32"]) def test_expand_indptr_matches_searchsorted(namespace, name, counts, index_dtype): del name xp = namespace indptr = _indptr(xp, counts, getattr(xp, index_dtype)) nnz = sum(counts) > _assert_identical(xp, _expand_indptr(xp, indptr, nnz), _reference(xp, indptr, nnz)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_expand_indptr.py:59: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0], dtype=array_api_strict.int32), empty((0,), dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_expand_indptr_matches_searchsorted[array_api_strict-int32-rows_all_empty-[0, 0, 0, 0]] _ namespace = counts = [0, 0, 0, 0], index_dtype = 'int32' @pytest.mark.parametrize(("name", "counts"), _patterns(), ids=lambda v: str(v)) @pytest.mark.parametrize("index_dtype", ["int64", "int32"]) def test_expand_indptr_matches_searchsorted(namespace, name, counts, index_dtype): del name xp = namespace indptr = _indptr(xp, counts, getattr(xp, index_dtype)) nnz = sum(counts) > _assert_identical(xp, _expand_indptr(xp, indptr, nnz), _reference(xp, indptr, nnz)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_expand_indptr.py:59: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0, 0, 0, 0, 0], dtype=array_api_strict.int32), empty((0,), dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_expand_indptr_matches_searchsorted[array_api_strict-int32-single_row-[7]] _ namespace = counts = [7], index_dtype = 'int32' @pytest.mark.parametrize(("name", "counts"), _patterns(), ids=lambda v: str(v)) @pytest.mark.parametrize("index_dtype", ["int64", "int32"]) def test_expand_indptr_matches_searchsorted(namespace, name, counts, index_dtype): del name xp = namespace indptr = _indptr(xp, counts, getattr(xp, index_dtype)) nnz = sum(counts) > _assert_identical(xp, _expand_indptr(xp, indptr, nnz), _reference(xp, indptr, nnz)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_expand_indptr.py:59: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0, 7], dtype=array_api_strict.int32), Array([0, 1, 2, 3, 4, 5, 6], dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_expand_indptr_matches_searchsorted[array_api_strict-int32-single_empty_row-[0]] _ namespace = counts = [0], index_dtype = 'int32' @pytest.mark.parametrize(("name", "counts"), _patterns(), ids=lambda v: str(v)) @pytest.mark.parametrize("index_dtype", ["int64", "int32"]) def test_expand_indptr_matches_searchsorted(namespace, name, counts, index_dtype): del name xp = namespace indptr = _indptr(xp, counts, getattr(xp, index_dtype)) nnz = sum(counts) > _assert_identical(xp, _expand_indptr(xp, indptr, nnz), _reference(xp, indptr, nnz)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_expand_indptr.py:59: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0, 0], dtype=array_api_strict.int32), empty((0,), dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_expand_indptr_matches_searchsorted[array_api_strict-int32-leading_trailing_empty-[0, 0, 3, 1, 0, 0, 2, 0]] _ namespace = counts = [0, 0, 3, 1, 0, 0, ...], index_dtype = 'int32' @pytest.mark.parametrize(("name", "counts"), _patterns(), ids=lambda v: str(v)) @pytest.mark.parametrize("index_dtype", ["int64", "int32"]) def test_expand_indptr_matches_searchsorted(namespace, name, counts, index_dtype): del name xp = namespace indptr = _indptr(xp, counts, getattr(xp, index_dtype)) nnz = sum(counts) > _assert_identical(xp, _expand_indptr(xp, indptr, nnz), _reference(xp, indptr, nnz)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_expand_indptr.py:59: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0, 0, 0, 3, 4, 4, 4, 6, 6], dtype=array_api_strict.int32), Array([0, 1, 2, 3, 4, 5], dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_expand_indptr_matches_searchsorted[array_api_strict-int32-random_0-[3, 0, 0, 3, 1, 2, 2, 5, 0, 0, 1, 1]] _ namespace = counts = [3, 0, 0, 3, 1, 2, ...], index_dtype = 'int32' @pytest.mark.parametrize(("name", "counts"), _patterns(), ids=lambda v: str(v)) @pytest.mark.parametrize("index_dtype", ["int64", "int32"]) def test_expand_indptr_matches_searchsorted(namespace, name, counts, index_dtype): del name xp = namespace indptr = _indptr(xp, counts, getattr(xp, index_dtype)) nnz = sum(counts) > _assert_identical(xp, _expand_indptr(xp, indptr, nnz), _reference(xp, indptr, nnz)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_expand_indptr.py:59: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([ 0, 3, 3, 3, 6, 7, 9, 11, 16, 16, 16, 17, 18], dtype=array_api_strict.int32), Array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17], dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_expand_indptr_matches_searchsorted[array_api_strict-int32-random_1-[0, 5, 1]] _ namespace = counts = [0, 5, 1], index_dtype = 'int32' @pytest.mark.parametrize(("name", "counts"), _patterns(), ids=lambda v: str(v)) @pytest.mark.parametrize("index_dtype", ["int64", "int32"]) def test_expand_indptr_matches_searchsorted(namespace, name, counts, index_dtype): del name xp = namespace indptr = _indptr(xp, counts, getattr(xp, index_dtype)) nnz = sum(counts) > _assert_identical(xp, _expand_indptr(xp, indptr, nnz), _reference(xp, indptr, nnz)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_expand_indptr.py:59: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0, 0, 5, 6], dtype=array_api_strict.int32), Array([0, 1, 2, 3, 4, 5], dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_expand_indptr_matches_searchsorted[array_api_strict-int32-random_2-[0, 4, 0, 0, 0, 2, 2, 0]] _ namespace = counts = [0, 4, 0, 0, 0, 2, ...], index_dtype = 'int32' @pytest.mark.parametrize(("name", "counts"), _patterns(), ids=lambda v: str(v)) @pytest.mark.parametrize("index_dtype", ["int64", "int32"]) def test_expand_indptr_matches_searchsorted(namespace, name, counts, index_dtype): del name xp = namespace indptr = _indptr(xp, counts, getattr(xp, index_dtype)) nnz = sum(counts) > _assert_identical(xp, _expand_indptr(xp, indptr, nnz), _reference(xp, indptr, nnz)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_expand_indptr.py:59: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0, 0, 4, 4, 4, 4, 6, 8, 8], dtype=array_api_strict.int32), Array([0, 1, 2, 3, 4, 5, 6, 7], dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_expand_indptr_matches_searchsorted[array_api_strict-int32-random_3-[3, 4, 0, 0, 0, 5, 4, 2, 3, 1, 5, 0, 0, 4, 1, 0, 0, 3, 2, 5, 0, 1, 0, 1, 2, 0, 0, 0, 5, 0, 2, 1, 0, 0, 0, 5, 3, 2, 3, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 1, 0, 5, 3, 0, 2, 5, 5]] _ namespace = counts = [3, 4, 0, 0, 0, 5, ...], index_dtype = 'int32' @pytest.mark.parametrize(("name", "counts"), _patterns(), ids=lambda v: str(v)) @pytest.mark.parametrize("index_dtype", ["int64", "int32"]) def test_expand_indptr_matches_searchsorted(namespace, name, counts, index_dtype): del name xp = namespace indptr = _indptr(xp, counts, getattr(xp, index_dtype)) nnz = sum(counts) > _assert_identical(xp, _expand_indptr(xp, indptr, nnz), _reference(xp, indptr, nnz)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_expand_indptr.py:59: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([ 0, 3, 7, 7, 7, 7, 12, 16, 18, 21, 22, 27, 27, 27, 31, 32, 32, 32, 35, 37, 42, 42, 43, 43, ..., 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97], dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_expand_indptr_falls_back_without_array_repeat[array_api_strict-_NoRepeat] _ namespace = proxy = @pytest.mark.parametrize("proxy", [_NoRepeat, _RejectingRepeat]) def test_expand_indptr_falls_back_without_array_repeat(namespace, proxy): xp = namespace counts = [0, 2, 0, 3, 1, 0] indptr = _indptr(xp, counts, xp.int64) > got = _expand_indptr(proxy(xp), indptr, sum(counts)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_expand_indptr.py:93: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0, 0, 2, 2, 5, 6, 6], dtype=array_api_strict.int64), Array([0, 1, 2, 3, 4, 5], dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_expand_indptr_falls_back_without_array_repeat[array_api_strict-_RejectingRepeat] _ namespace = proxy = @pytest.mark.parametrize("proxy", [_NoRepeat, _RejectingRepeat]) def test_expand_indptr_falls_back_without_array_repeat(namespace, proxy): xp = namespace counts = [0, 2, 0, 3, 1, 0] indptr = _indptr(xp, counts, xp.int64) > got = _expand_indptr(proxy(xp), indptr, sum(counts)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_expand_indptr.py:93: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0, 0, 2, 2, 5, 6, 6], dtype=array_api_strict.int64), Array([0, 1, 2, 3, 4, 5], dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _______ test_expand_indptr_rejects_indptr_nnz_mismatch[array_api_strict] _______ namespace = def test_expand_indptr_rejects_indptr_nnz_mismatch(namespace): xp = namespace indptr = xp.asarray([0, 2, 3]) with pytest.raises(ValueError, match="indptr"): > _expand_indptr(xp, indptr, 5) tests/unit/test_expand_indptr.py:101: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0, 2, 3], dtype=array_api_strict.int64), Array([0, 1, 2, 3, 4], dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_csr_csc_constructors_use_identical_expansion[array_api_strict] ______ namespace = def test_csr_csc_constructors_use_identical_expansion(namespace): xp = namespace counts = [2, 0, 3, 0] indptr = _indptr(xp, counts, xp.int64) indices = xp.asarray([0, 2, 1, 2, 3]) data = xp.asarray([1.0, 2.0, 3.0, 4.0, 5.0], dtype=xp.float64) > rows_ref = _reference(xp, indptr, 5) ^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_expand_indptr.py:110: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_expand_indptr.py:23: in _reference return xp.searchsorted(indptr, arange, side="right") - 1 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0, 2, 2, 5, 5], dtype=array_api_strict.int64), Array([0, 1, 2, 3, 4], dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_driver_passes_certifier_at_feasible_iterates[array_api_strict] ______ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffaa365b00> def test_driver_passes_certifier_at_feasible_iterates(namespace, monkeypatch): # HS35 from a strictly feasible interior point: the linear inequality keeps # θ = 0 along the whole trajectory, so with the rescue enabled every line # search must receive the KKT-progress certifier. seen = _record_kkt_progress_kwargs(monkeypatch) problem = HS35(namespace) > result = solve( problem, array(namespace, [0.5, 0.5, 0.5]), options=Options( hessian="exact", linsolve="dense", line_search=LineSearchOptions(feasible_kkt_progress=0.1), ), ) tests/unit/test_feasible_kkt_acceptance.py:37: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____________ test_certifier_disabled_by_default[array_api_strict] _____________ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffaa3654e0> def test_certifier_disabled_by_default(namespace, monkeypatch): # OPT-IN since the S2MPJ v14 sweep: as a default the rescue walked # unconstrained/bounds-only runs (θ ≡ 0 — its whole domain) into worse # stationary points (48 corpus flips attributed). The default must not # wire the certifier at all. assert LineSearchOptions().feasible_kkt_progress is None seen = _record_kkt_progress_kwargs(monkeypatch) problem = HS35(namespace) > result = solve( problem, array(namespace, [0.5, 0.5, 0.5]), options=Options(hessian="exact", linsolve="dense"), ) tests/unit/test_feasible_kkt_acceptance.py:60: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____ test_certifier_computes_a_real_kkt_decrease_verdict[array_api_strict] _____ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffaa3655c0> def test_certifier_computes_a_real_kkt_decrease_verdict(namespace, monkeypatch): # The certifier is a closure over live solver state: it re-evaluates the # gradient/Jacobian at the trial point and rescores the scaled KKT error. # Exercise the arithmetic against a real solve rather than a stub — on this # convex QP the Newton step genuinely drives the KKT error down, so a 10% # decrease must be certified at least once. > verdicts = _certifier_verdicts(namespace, monkeypatch, gamma=0.1, alpha=1.0) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_feasible_kkt_acceptance.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_feasible_kkt_acceptance.py:83: in _certifier_verdicts result = solve( ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____________ test_certifier_threshold_is_honoured[array_api_strict] ____________ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa9c47a10> def test_certifier_threshold_is_honoured(namespace, monkeypatch): # The verdict is the option's decrease fraction applied to a real error # ratio: demanding a 99.9999% drop per step is unattainable here, so the # certificate must refuse every trial — proving the threshold is actually # consulted rather than the rescue rubber-stamping the step. > verdicts = _certifier_verdicts(namespace, monkeypatch, gamma=0.999999, alpha=1.0) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_feasible_kkt_acceptance.py:114: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_feasible_kkt_acceptance.py:83: in _certifier_verdicts result = solve( ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_certifier_advances_duals_even_for_a_null_primal_step[array_api_strict] __ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffaa654590> def test_certifier_advances_duals_even_for_a_null_primal_step(namespace, monkeypatch): # Design note worth pinning: the certificate scores the state the driver # would *adopt* — the trial primal plus the iteration's fraction-to-boundary # dual step — so the duals move even at α = 0. A null primal step is # therefore not automatically "no progress"; the dual step alone can reduce # the KKT error. (The line search only ever consults it at α > 0; this pins # the closure's semantics against an accidental "use α for the duals" edit.) > verdicts = _certifier_verdicts(namespace, monkeypatch, gamma=0.1, alpha=0.0) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_feasible_kkt_acceptance.py:126: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_feasible_kkt_acceptance.py:83: in _certifier_verdicts result = solve( ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ________ test_certifier_absent_at_infeasible_iterates[array_api_strict] ________ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffaa6541a0> def test_certifier_absent_at_infeasible_iterates(namespace, monkeypatch): # From an infeasible start (g = +3) the early iterations have θ0 > 0: the # rescue is a θ0 = 0 mechanism only, so even with the option enabled those # searches get no certifier. seen = _record_kkt_progress_kwargs(monkeypatch) problem = HS35(namespace) > result = solve( problem, array(namespace, [2.0, 2.0, 2.0]), options=Options( hessian="exact", linsolve="dense", line_search=LineSearchOptions(feasible_kkt_progress=0.1), ), ) tests/unit/test_feasible_kkt_acceptance.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___________ test_filter_is_reset_when_mu_decreases[array_api_strict] ___________ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffaa5ac050> def test_filter_is_reset_when_mu_decreases(namespace, monkeypatch): # HS7's nonlinear equality keeps early iterates infeasible, so accepted # θ-type steps augment the filter while μ steps down several times on the # way to optimality. Entries can only vanish again through a reset — # ``augment`` always appends — so an empty filter observed *after* it held # entries is exactly the μ-update re-initialization. entry_counts: list[int] = [] original = FilterLineSearch.search def recording(self, **kwargs): entry_counts.append(len(kwargs["entries"])) return original(self, **kwargs) monkeypatch.setattr(FilterLineSearch, "search", recording) problem = HS7(namespace) > result = solve( problem, array(namespace, [2.0, 2.0]), options=Options(hessian="exact", linsolve="dense"), ) tests/unit/test_filter_reset_on_mu_update.py:38: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:224: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([2.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _________ test_free_oracle_runs_the_weak_acceptance[array_api_strict] __________ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffaa5ac6e0> def test_free_oracle_runs_the_weak_acceptance(namespace, monkeypatch): # Opted in, with a free-mode μ oracle and the safeguard never tripping, # every line search goes through the weak path. kinds = _record_search_kinds(monkeypatch) problem = HS35(namespace) > result = solve( problem, array(namespace, [0.5, 0.5, 0.5]), options=Options( hessian="exact", linsolve="dense", mu_schedule="adaptive", barrier=BarrierOptions(fallback="never"), line_search=LineSearchOptions(free_mode_acceptance="obj-constr-filter"), ), ) tests/unit/test_free_mode_acceptance.py:210: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ______ test_monitor_trip_reinstates_the_rigorous_search[array_api_strict] ______ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffaa857690> def test_monitor_trip_reinstates_the_rigorous_search(namespace, monkeypatch): # A tripping KKT-error safeguard (tight κ) flips the loop to monotone mode # — from there the rigorous W&B filter search must govern again. kinds = _record_search_kinds(monkeypatch) problem = HS35(namespace) > result = solve( problem, array(namespace, [0.5, 0.5, 0.5]), options=Options( hessian="exact", linsolve="dense", mu_schedule="adaptive", barrier=BarrierOptions(fallback_kappa=0.01, fallback_window=0), line_search=LineSearchOptions(free_mode_acceptance="obj-constr-filter"), ), ) tests/unit/test_free_mode_acceptance.py:232: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _______ test_free_mode_acceptance_defaults_to_rigorous[array_api_strict] _______ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffaa6541a0> def test_free_mode_acceptance_defaults_to_rigorous(namespace, monkeypatch): # OPT-IN: the weak per-trial test is not IPOPT's behavior (released IPOPT # never weakens its per-trial test; its (f, θ) margin filter is an # iterate-level progress check), and the paired S2MPJ A/Bs put it at # ≈ neutral while trading wrong-basin flips on nonconvex problems. So even # under a free-mode oracle the rigorous W&B gate governs unless asked for. assert LineSearchOptions().free_mode_acceptance == "rigorous" kinds = _record_search_kinds(monkeypatch) problem = HS35(namespace) > result = solve( problem, array(namespace, [0.5, 0.5, 0.5]), options=Options( hessian="exact", linsolve="dense", mu_schedule="adaptive", # free-mode oracle, yet still rigorous ), ) tests/unit/test_free_mode_acceptance.py:259: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _______ test_free_search_failure_switches_to_monotone[array_api_strict] ________ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa961c910> def test_free_search_failure_switches_to_monotone(namespace, monkeypatch): # A failed free-mode line search is the switch-to-monotone trigger # (NWW §5; IPOPT's skipped-line-search signal), not a restoration entry: # the very next search must run the rigorous W&B gate from the same # iterate, and the solve must still converge. from ipax.ipm.filter_ls import LineSearchResult kinds: list[str] = [] original = FilterLineSearch.search original_free = FilterLineSearch.search_free forced_failure = LineSearchResult(1e-8, False, False, True, n_trials=3) failed_once: list[bool] = [] def free(self, **kwargs): kinds.append("free") if not failed_once: failed_once.append(True) return forced_failure return original_free(self, **kwargs) def rigorous(self, **kwargs): kinds.append("rigorous") return original(self, **kwargs) monkeypatch.setattr(FilterLineSearch, "search", rigorous) monkeypatch.setattr(FilterLineSearch, "search_free", free) problem = HS35(namespace) > result = solve( problem, array(namespace, [0.5, 0.5, 0.5]), options=Options( hessian="exact", linsolve="dense", mu_schedule="adaptive", line_search=LineSearchOptions(free_mode_acceptance="obj-constr-filter"), ), ) tests/unit/test_free_mode_acceptance.py:302: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __ test_weak_acceptance_is_inert_under_the_monotone_default[array_api_strict] __ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa961eeb0> def test_weak_acceptance_is_inert_under_the_monotone_default(namespace, monkeypatch): # Containment: the default μ schedule is monotone, so there is no free mode # and the weak path is unreachable — opting *in* must therefore change # nothing at all. Trace identity pins that on the observable output, so the # option cannot leak into the default trajectory. kinds = _record_search_kinds(monkeypatch) problem = HS35(namespace) x0 = array(namespace, [0.5, 0.5, 0.5]) > default = solve(problem, x0, options=Options(hessian="exact", linsolve="dense")) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_free_mode_acceptance.py:326: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_lbfgs_run_matches_exact_optimum_with_bounded_overhead[array_api_strict] _ namespace = def test_lbfgs_run_matches_exact_optimum_with_bounded_overhead(namespace): """L-BFGS reaches the same optimum as the exact Hessian. ``BoundConstrainedQP`` supplies the true identity Hessian. The L-BFGS run must hit the same point without a blow-up in iteration count. """ exact_problem = BoundConstrainedQP(namespace) lower, upper = exact_problem.bounds() def objective(x): diff = x - exact_problem.center return 0.5 * namespace.sum(diff * diff) def gradient(x): return x - exact_problem.center lbfgs_problem = FunctionProblem( 2, objective, gradient=gradient, bounds=(lower, upper), ) x0 = array(namespace, [0.25, 0.75]) > lbfgs = solve(lbfgs_problem, x0, options=Options(hessian="lbfgs", linsolve="dense")) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_hessian_lbfgs.py:210: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0. , 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _______ test_fixed_bound_pair_is_widened_symmetrically[array_api_strict] _______ namespace = def test_fixed_bound_pair_is_widened_symmetrically(namespace): # x1 is fixed (l == u == 2); x0 is a normal box [0, 10]. lower = array(namespace, [0.0, 2.0]) upper = array(namespace, [10.0, 2.0]) > new_l, new_u = relax_fixed_bounds(namespace, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_init_bounds.py:13: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([5., 2.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _______ test_one_sided_and_absent_bounds_are_untouched[array_api_strict] _______ namespace = def test_one_sided_and_absent_bounds_are_untouched(namespace): inf = float("inf") lower = array(namespace, [0.0, -inf]) upper = array(namespace, [inf, 5.0]) > new_l, new_u = relax_fixed_bounds(namespace, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_init_bounds.py:27: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_active_slack_is_refloored_on_mu_and_poisoned_dual_is_clipped[array_api_strict] _ namespace = def test_active_slack_is_refloored_on_mu_and_poisoned_dual_is_clipped(namespace): # HS101 limit-cycle state: an active constraint (g ~ 0) whose slack sits on # restoration's 1e-12 boundary floor while the stale multiplier has grown # to ~1e6 — together Sigma_s = lambda/s ~ 1e18 and no step survives the # fraction-to-boundary rule. Re-centering must give the slack mu-scale # interiority and squash the multiplier to the central band. xp = namespace mu = 0.1 g = array(xp, [-1e-14]) y = array(xp, [3.2e6]) > s_new, y_new = recenter_slacks_duals(xp, g, y, mu) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_init_recenter.py:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/init.py:214: in recenter_slacks_duals s = xp.maximum(-g, floor) ^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.e-14], dtype=array_api_strict.float64), Array([0.01], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____ test_inactive_slack_and_consistent_dual_pass_through[array_api_strict] ____ namespace = def test_inactive_slack_and_consistent_dual_pass_through(namespace): # A strictly-satisfied constraint keeps its natural slack s = -g, and a # multiplier already consistent with the central path (s*lambda ~ mu) must # not be disturbed — the repair only touches what is actually poisoned. xp = namespace mu = 0.1 g = array(xp, [-2.0]) y = array(xp, [mu / 2.0]) > s_new, y_new = recenter_slacks_duals(xp, g, y, mu) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_init_recenter.py:50: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/init.py:214: in recenter_slacks_duals s = xp.maximum(-g, floor) ^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([2.], dtype=array_api_strict.float64), Array([0.01], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _______ test_vanished_dual_is_raised_to_the_band_floor[array_api_strict] _______ namespace = def test_vanished_dual_is_raised_to_the_band_floor(namespace): # The opposite poisoning: a multiplier collapsed to ~0 on an active # constraint makes the primal-dual Sigma_s vanish; the clip raises it to # the lower edge of the central band. xp = namespace mu = 0.1 g = array(xp, [-1e-14]) y = array(xp, [1e-15]) > s_new, y_new = recenter_slacks_duals(xp, g, y, mu) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_init_recenter.py:64: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/init.py:214: in recenter_slacks_duals s = xp.maximum(-g, floor) ^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.e-14], dtype=array_api_strict.float64), Array([0.01], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _________ test_violated_constraint_gets_the_mu_floor[array_api_strict] _________ namespace = def test_violated_constraint_gets_the_mu_floor(namespace): # A (slightly) violated row has -g < 0: the slack lands on the mu-scale # floor, staying strictly interior. xp = namespace mu = 1e-6 g = array(xp, [0.5]) y = array(xp, [1.0]) > s_new, _ = recenter_slacks_duals(xp, g, y, mu) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_init_recenter.py:77: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/init.py:214: in recenter_slacks_duals s = xp.maximum(-g, floor) ^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([-0.5], dtype=array_api_strict.float64), Array([1.e-07], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_normal_equations_signature_is_none_without_a_stable_pattern[array_api_strict] _ namespace = def test_normal_equations_signature_is_none_without_a_stable_pattern(namespace): # The sparse-NE route may only reuse symbolic analysis when the caller # promised a stable pattern. Pattern reuse is opt-in, so a sparse Jacobian # constructed without a ``pattern_key`` declares none — and the NE tag must # propagate that rather than inventing a key of its own. from ipax.backend.operators import CSROperator dtype = array(namespace, [0.0]).dtype > ineq = CSROperator( namespace.asarray([0, 1, 2]), namespace.asarray([0, 1]), namespace.ones((2,), dtype=dtype), (2, 2), # no pattern_key: the caller promised nothing ) tests/unit/test_kkt.py:1296: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/backend/operators.py:1324: in __init__ rows = _expand_indptr(xp, indptr, int(data.shape[0])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0, 1, 2], dtype=array_api_strict.int64), Array([0, 1], dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ______ test_operator_lowering_matches_reference[array_api_strict-opaque] _______ namespace = kind = 'opaque' @pytest.mark.parametrize("kind", _ALL_KINDS) def test_operator_lowering_matches_reference(namespace, kind): _needs_adapter(namespace, kind) xp = namespace rows, lo, hi = _random_block() matrix, sizes = _make(xp, kind, rows) jac_ref, off_ref = _reference(rows, lo, hi, sizes) J = array(xp, jac_ref) Jt = transpose(xp, J) k = len(jac_ref) > op, offset = _lower(xp, matrix, lo, hi) ^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_linear_ineq_lowering.py:331: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_linear_ineq_lowering.py:310: in _lower return _lower_two_sided(matrix, array(xp, lo), array(xp, hi), xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:275: in _lower_two_sided return _lower_wrapped(matrix, lower, upper, xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:204: in _lower_wrapped op = _SignedRowSelection(matrix, finite_l, finite_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1493: in __init__ self._expand_lower = xp.cumulative_sum(lower_int) * lower_int ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0], dtype=array_api_strict.int64),) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function cumulative_sum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_sparse_lowering_is_triplet_level_and_keeps_the_family[array_api_strict-coo] _ namespace = kind = 'coo' @pytest.mark.parametrize("kind", _SPARSE_KINDS) def test_sparse_lowering_is_triplet_level_and_keeps_the_family(namespace, kind): # Pure Array API on the index/value vectors: runs on every backend, with or # without a sparse adapter (the adapter is needed only for the algebra). xp = namespace rows, lo, hi = _random_block() matrix, sizes = _make(xp, kind, rows) jac_ref, _ = _reference(rows, lo, hi, sizes) > op, _ = _lower(xp, matrix, lo, hi) ^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_linear_ineq_lowering.py:377: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_linear_ineq_lowering.py:310: in _lower return _lower_two_sided(matrix, array(xp, lo), array(xp, hi), xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:274: in _lower_two_sided return _lower_triplets(matrix, lower, upper, xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:144: in _lower_triplets rows, cols, values, k = _signed_row_select_triplets( ipax/backend/operators.py:1438: in _signed_row_select_triplets keep_lower, keep_upper, new_rows, k = _signed_row_select_plan( ipax/backend/operators.py:1398: in _signed_row_select_plan lower_rank = xp.cumulative_sum(lower_int) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0], dtype=array_api_strict.int64),) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function cumulative_sum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_sparse_lowering_is_triplet_level_and_keeps_the_family[array_api_strict-csr] _ namespace = kind = 'csr' @pytest.mark.parametrize("kind", _SPARSE_KINDS) def test_sparse_lowering_is_triplet_level_and_keeps_the_family(namespace, kind): # Pure Array API on the index/value vectors: runs on every backend, with or # without a sparse adapter (the adapter is needed only for the algebra). xp = namespace rows, lo, hi = _random_block() > matrix, sizes = _make(xp, kind, rows) ^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_linear_ineq_lowering.py:374: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_linear_ineq_lowering.py:279: in _make return _csr(xp, rows, pattern_key="A"), [_M] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_linear_ineq_lowering.py:203: in _csr return CSROperator( ipax/backend/operators.py:1324: in __init__ rows = _expand_indptr(xp, indptr, int(data.shape[0])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([ 0, 3, 7, 9, 11, 14, 14, 14, 15, 17, 20, 23, 27], dtype=array_api_strict.int64), Array([ 0, 1, 2, ..., 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_sparse_lowering_is_triplet_level_and_keeps_the_family[array_api_strict-csc] _ namespace = kind = 'csc' @pytest.mark.parametrize("kind", _SPARSE_KINDS) def test_sparse_lowering_is_triplet_level_and_keeps_the_family(namespace, kind): # Pure Array API on the index/value vectors: runs on every backend, with or # without a sparse adapter (the adapter is needed only for the algebra). xp = namespace rows, lo, hi = _random_block() > matrix, sizes = _make(xp, kind, rows) ^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_linear_ineq_lowering.py:374: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_linear_ineq_lowering.py:281: in _make return _csc(xp, rows), [_M] ^^^^^^^^^^^^^^ tests/unit/test_linear_ineq_lowering.py:217: in _csc return CSCOperator( ipax/backend/operators.py:1361: in __init__ cols = _expand_indptr(xp, indptr, int(data.shape[0])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([ 0, 4, 9, 16, 22, 27], dtype=array_api_strict.int64), Array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_sparse_lowering_is_triplet_level_and_keeps_the_family[array_api_strict-vstack] _ namespace = kind = 'vstack' @pytest.mark.parametrize("kind", _SPARSE_KINDS) def test_sparse_lowering_is_triplet_level_and_keeps_the_family(namespace, kind): # Pure Array API on the index/value vectors: runs on every backend, with or # without a sparse adapter (the adapter is needed only for the algebra). xp = namespace rows, lo, hi = _random_block() > matrix, sizes = _make(xp, kind, rows) ^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_linear_ineq_lowering.py:374: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_linear_ineq_lowering.py:283: in _make top = _csr(xp, rows[:_SPLIT], values_dtype_hint="float32", pattern_key="t") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_linear_ineq_lowering.py:203: in _csr return CSROperator( ipax/backend/operators.py:1324: in __init__ rows = _expand_indptr(xp, indptr, int(data.shape[0])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([ 0, 3, 7, 9, 11, 14, 14, 14], dtype=array_api_strict.int64), Array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____ test_vstack_lowering_keeps_per_block_precision_hints[array_api_strict] ____ namespace = def test_vstack_lowering_keeps_per_block_precision_hints(namespace): # gram_dtype="auto" reduces the Gram accumulate block by block, so a # float32-sourced block must stay its own block after lowering. xp = namespace rows, lo, hi = _random_block() > matrix, _ = _make(xp, "vstack", rows) ^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_linear_ineq_lowering.py:404: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_linear_ineq_lowering.py:283: in _make top = _csr(xp, rows[:_SPLIT], values_dtype_hint="float32", pattern_key="t") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_linear_ineq_lowering.py:203: in _csr return CSROperator( ipax/backend/operators.py:1324: in __init__ rows = _expand_indptr(xp, indptr, int(data.shape[0])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([ 0, 3, 7, 9, 11, 14, 14, 14], dtype=array_api_strict.int64), Array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_sparse_lowering_keeps_a_declared_values_hint[array_api_strict] ______ namespace = def test_sparse_lowering_keeps_a_declared_values_hint(namespace): xp = namespace rows, lo, hi = _random_block() > op, _ = _lower(xp, _csr(xp, rows, values_dtype_hint="float32"), lo, hi) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_linear_ineq_lowering.py:418: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_linear_ineq_lowering.py:203: in _csr return CSROperator( ipax/backend/operators.py:1324: in __init__ rows = _expand_indptr(xp, indptr, int(data.shape[0])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([ 0, 3, 7, 9, 11, 14, 14, 14, 15, 17, 20, 23, 27], dtype=array_api_strict.int64), Array([ 0, 1, 2, ..., 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_sparse_lowering_derives_a_stable_pattern_key[array_api_strict] ______ namespace = def test_sparse_lowering_derives_a_stable_pattern_key(namespace): xp = namespace rows, lo, hi = _random_block() > keyed = _csr(xp, rows, pattern_key="A") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_linear_ineq_lowering.py:426: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_linear_ineq_lowering.py:203: in _csr return CSROperator( ipax/backend/operators.py:1324: in __init__ rows = _expand_indptr(xp, indptr, int(data.shape[0])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([ 0, 3, 7, 9, 11, 14, 14, 14, 15, 17, 20, 23, 27], dtype=array_api_strict.int64), Array([ 0, 1, 2, ..., 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_operator_lowering_rejects_inverted_ranges[array_api_strict-csr] _____ namespace = kind = 'csr' @pytest.mark.parametrize("kind", ("csr", "opaque", "vstack")) def test_operator_lowering_rejects_inverted_ranges(namespace, kind): xp = namespace rows, lo, hi = _random_block() lo[2], hi[2] = 1.0, -1.0 > matrix, _ = _make(xp, kind, rows) ^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_linear_ineq_lowering.py:447: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_linear_ineq_lowering.py:279: in _make return _csr(xp, rows, pattern_key="A"), [_M] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_linear_ineq_lowering.py:203: in _csr return CSROperator( ipax/backend/operators.py:1324: in __init__ rows = _expand_indptr(xp, indptr, int(data.shape[0])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([ 0, 3, 7, 9, 11, 14, 14, 14, 15, 17, 20, 23, 27], dtype=array_api_strict.int64), Array([ 0, 1, 2, ..., 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___ test_operator_lowering_rejects_inverted_ranges[array_api_strict-vstack] ____ namespace = kind = 'vstack' @pytest.mark.parametrize("kind", ("csr", "opaque", "vstack")) def test_operator_lowering_rejects_inverted_ranges(namespace, kind): xp = namespace rows, lo, hi = _random_block() lo[2], hi[2] = 1.0, -1.0 > matrix, _ = _make(xp, kind, rows) ^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_linear_ineq_lowering.py:447: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_linear_ineq_lowering.py:283: in _make top = _csr(xp, rows[:_SPLIT], values_dtype_hint="float32", pattern_key="t") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_linear_ineq_lowering.py:203: in _csr return CSROperator( ipax/backend/operators.py:1324: in __init__ rows = _expand_indptr(xp, indptr, int(data.shape[0])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([ 0, 3, 7, 9, 11, 14, 14, 14], dtype=array_api_strict.int64), Array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __ test_operator_lowering_rejects_bound_length_mismatch[array_api_strict-csr] __ namespace = kind = 'csr' @pytest.mark.parametrize("kind", ("csr", "opaque", "vstack")) def test_operator_lowering_rejects_bound_length_mismatch(namespace, kind): xp = namespace rows, lo, hi = _random_block() > matrix, _ = _make(xp, kind, rows) ^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_linear_ineq_lowering.py:456: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_linear_ineq_lowering.py:279: in _make return _csr(xp, rows, pattern_key="A"), [_M] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_linear_ineq_lowering.py:203: in _csr return CSROperator( ipax/backend/operators.py:1324: in __init__ rows = _expand_indptr(xp, indptr, int(data.shape[0])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([ 0, 3, 7, 9, 11, 14, 14, 14, 15, 17, 20, 23, 27], dtype=array_api_strict.int64), Array([ 0, 1, 2, ..., 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_operator_lowering_rejects_bound_length_mismatch[array_api_strict-vstack] _ namespace = kind = 'vstack' @pytest.mark.parametrize("kind", ("csr", "opaque", "vstack")) def test_operator_lowering_rejects_bound_length_mismatch(namespace, kind): xp = namespace rows, lo, hi = _random_block() > matrix, _ = _make(xp, kind, rows) ^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_linear_ineq_lowering.py:456: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_linear_ineq_lowering.py:283: in _make top = _csr(xp, rows[:_SPLIT], values_dtype_hint="float32", pattern_key="t") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_linear_ineq_lowering.py:203: in _csr return CSROperator( ipax/backend/operators.py:1324: in __init__ rows = _expand_indptr(xp, indptr, int(data.shape[0])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([ 0, 3, 7, 9, 11, 14, 14, 14], dtype=array_api_strict.int64), Array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_all_unbounded_operator_block_lowers_to_nothing[array_api_strict-opaque] _ namespace = kind = 'opaque' @pytest.mark.parametrize("kind", ("csr", "opaque", "vstack")) def test_all_unbounded_operator_block_lowers_to_nothing(namespace, kind): _needs_adapter(namespace, kind) xp = namespace rows, _, _ = _random_block() matrix, _ = _make(xp, kind, rows) problem = _with_block(xp, rows, matrix, [-_INF] * _M, [_INF] * _M) > lowered = lower_linear_inequalities(problem, array(xp, [0.0] * _N), xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_linear_ineq_lowering.py:469: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/problem/linear_ineq.py:373: in lower_linear_inequalities lowered_jac, offset = _lower_two_sided(matrix, lower, upper, xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:275: in _lower_two_sided return _lower_wrapped(matrix, lower, upper, xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:204: in _lower_wrapped op = _SignedRowSelection(matrix, finite_l, finite_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1493: in __init__ self._expand_lower = xp.cumulative_sum(lower_int) * lower_int ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=array_api_strict.int64),) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function cumulative_sum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_operator_block_without_nonlinear_inequalities[array_api_strict-opaque] __ namespace = kind = 'opaque' @pytest.mark.parametrize("kind", ("csr", "vstack", "opaque")) def test_operator_block_without_nonlinear_inequalities(namespace, kind): _needs_adapter(namespace, kind) xp = namespace rows, lo, hi = _random_block() matrix, sizes = _make(xp, kind, rows) jac_ref, off_ref = _reference(rows, lo, hi, sizes) problem = _with_block(xp, rows, matrix, lo, hi) > lowered = lower_linear_inequalities(problem, array(xp, [0.0] * _N), xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_linear_ineq_lowering.py:485: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/problem/linear_ineq.py:373: in lower_linear_inequalities lowered_jac, offset = _lower_two_sided(matrix, lower, upper, xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:275: in _lower_two_sided return _lower_wrapped(matrix, lower, upper, xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:204: in _lower_wrapped op = _SignedRowSelection(matrix, finite_l, finite_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1493: in __init__ self._expand_lower = xp.cumulative_sum(lower_int) * lower_int ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0], dtype=array_api_strict.int64),) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function cumulative_sum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __ test_operator_block_multipliers_are_sliced_off[array_api_strict-opaque-1] ___ namespace = kind = 'opaque', n_blocks = 1 @pytest.mark.parametrize( ("kind", "n_blocks"), [("csr", 1), ("vstack", 2), ("opaque", 1)] ) def test_operator_block_multipliers_are_sliced_off(namespace, kind, n_blocks): _needs_adapter(namespace, kind) xp = namespace rows, lo, hi = _random_block() matrix, sizes = _make(xp, kind, rows) k = len(_reference(rows, lo, hi, sizes)[0]) inner = _NonlinearPlusLinear(xp, matrix, array(xp, lo), array(xp, hi)) > lowered = lower_linear_inequalities(inner, array(xp, [0.0] * _N), xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_linear_ineq_lowering.py:540: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/problem/linear_ineq.py:373: in lower_linear_inequalities lowered_jac, offset = _lower_two_sided(matrix, lower, upper, xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:275: in _lower_two_sided return _lower_wrapped(matrix, lower, upper, xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:204: in _lower_wrapped op = _SignedRowSelection(matrix, finite_l, finite_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1493: in __init__ self._expand_lower = xp.cumulative_sum(lower_int) * lower_int ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0], dtype=array_api_strict.int64),) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function cumulative_sum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_matrix_free_block_lowers_through_the_wrapper[array_api_strict] ______ namespace = def test_matrix_free_block_lowers_through_the_wrapper(namespace): # A callback-only operator: matvec/rmatvec work, while the explicit # capabilities it lacks stay unavailable (never a silent identity probe). xp = namespace rows, lo, hi = _random_block() a = array(xp, rows) matrix = MatrixFreeJacobian( (_M, _N), matvec=lambda v: xp.matmul(a, v), rmatvec=lambda v: xp.matmul(transpose(xp, a), v), ) jac_ref, _ = _reference(rows, lo, hi, [_M]) J = array(xp, jac_ref) > op, _ = _lower(xp, matrix, lo, hi) ^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_linear_ineq_lowering.py:573: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_linear_ineq_lowering.py:310: in _lower return _lower_two_sided(matrix, array(xp, lo), array(xp, hi), xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:275: in _lower_two_sided return _lower_wrapped(matrix, lower, upper, xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:204: in _lower_wrapped op = _SignedRowSelection(matrix, finite_l, finite_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1493: in __init__ self._expand_lower = xp.cumulative_sum(lower_int) * lower_int ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0], dtype=array_api_strict.int64),) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function cumulative_sum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___ test_wrapper_to_coo_remaps_a_structured_inner_operator[array_api_strict] ___ namespace = def test_wrapper_to_coo_remaps_a_structured_inner_operator(namespace): # A subclass of a sparse operator is wrapped (its overrides must survive), # but its triplets are still exposed — remapped — for the sparse route. xp = namespace rows, lo, hi = _random_block() class _Custom(COOOperator): pass r, c, v = _triplets(xp, rows) matrix = _Custom(r, c, v, (_M, _N), pattern_key="custom") jac_ref, _ = _reference(rows, lo, hi, [_M]) > op, _ = _lower(xp, matrix, lo, hi) ^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_linear_ineq_lowering.py:605: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_linear_ineq_lowering.py:310: in _lower return _lower_two_sided(matrix, array(xp, lo), array(xp, hi), xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:275: in _lower_two_sided return _lower_wrapped(matrix, lower, upper, xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:204: in _lower_wrapped op = _SignedRowSelection(matrix, finite_l, finite_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1493: in __init__ self._expand_lower = xp.cumulative_sum(lower_int) * lower_int ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0], dtype=array_api_strict.int64),) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function cumulative_sum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___________ test_csr_linear_ineq_no_longer_raises[array_api_strict] ____________ namespace = def test_csr_linear_ineq_no_longer_raises(namespace): # Regression: an operator-valued ``linear_ineq`` matrix raised # NotImplementedError ("require an explicit rank-2 array"), forcing large # sparse inequality sets through hand-lowered ineq_constraints callbacks. xp = namespace rows, lo, hi = _random_block() > problem = _with_block(xp, rows, _csr(xp, rows), lo, hi) ^^^^^^^^^^^^^^ tests/unit/test_linear_ineq_lowering.py:636: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_linear_ineq_lowering.py:203: in _csr return CSROperator( ipax/backend/operators.py:1324: in __init__ rows = _expand_indptr(xp, indptr, int(data.shape[0])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([ 0, 3, 7, 9, 11, 14, 14, 14, 15, 17, 20, 23, 27], dtype=array_api_strict.int64), Array([ 0, 1, 2, ..., 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __ test_dense_subclass_is_wrapped_so_its_overrides_survive[array_api_strict] ___ namespace = def test_dense_subclass_is_wrapped_so_its_overrides_survive(namespace): # Only the exact ``Dense`` type is unwrapped to its array; a subclass may # override the algebra (here a Gram counter) and must keep being consulted. xp = namespace rows, lo, hi = _random_block() calls = [] class _CountingDense(Dense): def gram(self, weights, *, accumulate_dtype=None, hinted_only=False): calls.append(1) a = self.dense_matrix() return xp.matmul(transpose(xp, a), xp.expand_dims(weights, axis=1) * a) def gram_capable(self): return True matrix = _CountingDense(array(xp, rows)) jac_ref, _ = _reference(rows, lo, hi, [_M]) J = array(xp, jac_ref) > op, _ = _lower(xp, matrix, lo, hi) ^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_linear_ineq_lowering.py:664: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_linear_ineq_lowering.py:310: in _lower return _lower_two_sided(matrix, array(xp, lo), array(xp, hi), xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:275: in _lower_two_sided return _lower_wrapped(matrix, lower, upper, xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:204: in _lower_wrapped op = _SignedRowSelection(matrix, finite_l, finite_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1493: in __init__ self._expand_lower = xp.cumulative_sum(lower_int) * lower_int ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0], dtype=array_api_strict.int64),) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function cumulative_sum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_wrapper_coo_values_reuse_the_cached_selection[array_api_strict] _____ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa57b94e0> def test_wrapper_coo_values_reuse_the_cached_selection(namespace, monkeypatch): # The sparse route refreshes values every iteration; with a structural # inner pattern the wrapper must not re-derive the selection (cumulative # sums + data-dependent nonzero syncs) on each refresh. import ipax.backend.operators as ops xp = namespace rows, lo, hi = _random_block() class _Custom(COOOperator): pass r, c, v = _triplets(xp, rows) > op, _ = _lower(xp, _Custom(r, c, v, (_M, _N), pattern_key="custom"), lo, hi) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_linear_ineq_lowering.py:689: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_linear_ineq_lowering.py:310: in _lower return _lower_two_sided(matrix, array(xp, lo), array(xp, hi), xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:275: in _lower_two_sided return _lower_wrapped(matrix, lower, upper, xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:204: in _lower_wrapped op = _SignedRowSelection(matrix, finite_l, finite_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1493: in __init__ self._expand_lower = xp.cumulative_sum(lower_int) * lower_int ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0], dtype=array_api_strict.int64),) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function cumulative_sum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____ test_wrapper_without_a_pattern_key_rederives_its_coo[array_api_strict] ____ namespace = def test_wrapper_without_a_pattern_key_rederives_its_coo(namespace): # No structural promise from the inner operator ⇒ no cached plan: the # values are re-derived with the pattern each time (always correct). xp = namespace rows, lo, hi = _random_block() class _Custom(COOOperator): pass r, c, v = _triplets(xp, rows) > op, _ = _lower(xp, _Custom(r, c, v, (_M, _N)), lo, hi) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_linear_ineq_lowering.py:721: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_linear_ineq_lowering.py:310: in _lower return _lower_two_sided(matrix, array(xp, lo), array(xp, hi), xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:275: in _lower_two_sided return _lower_wrapped(matrix, lower, upper, xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:204: in _lower_wrapped op = _SignedRowSelection(matrix, finite_l, finite_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1493: in __init__ self._expand_lower = xp.cumulative_sum(lower_int) * lower_int ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0], dtype=array_api_strict.int64),) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function cumulative_sum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_vstack_multipliers_are_ordered_block_by_block[array_api_strict] _____ namespace = def test_vstack_multipliers_are_ordered_block_by_block(namespace): # Documented order: a VStack lowers block by block (each block's lower rows, # then its upper rows); a single operator lowers all lower rows, then all # upper rows. Same set, different layout of y_ineq. xp = namespace rows, lo, hi = _random_block() stacked, sizes = _make(xp, "opaque", rows) top = _Opaque(array(xp, rows[:_SPLIT])) bottom = _Opaque(array(xp, rows[_SPLIT:])) > single, _ = _lower(xp, stacked, lo, hi) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_linear_ineq_lowering.py:740: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_linear_ineq_lowering.py:310: in _lower return _lower_two_sided(matrix, array(xp, lo), array(xp, hi), xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:275: in _lower_two_sided return _lower_wrapped(matrix, lower, upper, xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:204: in _lower_wrapped op = _SignedRowSelection(matrix, finite_l, finite_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1493: in __init__ self._expand_lower = xp.cumulative_sum(lower_int) * lower_int ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0], dtype=array_api_strict.int64),) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function cumulative_sum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __ test_vstack_subclass_is_wrapped_so_its_overrides_survive[array_api_strict] __ namespace = def test_vstack_subclass_is_wrapped_so_its_overrides_survive(namespace): # Regression: an ``isinstance`` dispatch decomposed a ``VStack`` subclass # into its blocks, silently dropping overridden algebra (the residuals of a # reproduction moved from [0, 2] to [-1, -1]). Only the exact ``VStack`` is # lowered block by block; a subclass takes the signed-row-selection path. xp = namespace rows, lo, hi = _random_block() calls = [] class _DoubledVStack(VStack): def matvec(self, v): return 2.0 * super().matvec(v) def rmatvec(self, v): return 2.0 * super().rmatvec(v) def gram(self, weights, *, accumulate_dtype=None, hinted_only=False): calls.append(1) return 4.0 * super().gram( weights, accumulate_dtype=accumulate_dtype, hinted_only=hinted_only ) top = _Opaque(array(xp, rows[:_SPLIT])) bottom = _Opaque(array(xp, rows[_SPLIT:])) matrix = _DoubledVStack((top, bottom)) jac_ref, _ = _reference(rows, lo, hi, [_M]) # one operator: no per-block split J = 2.0 * array(xp, jac_ref) > op, _ = _lower(xp, matrix, lo, hi) ^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_linear_ineq_lowering.py:779: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_linear_ineq_lowering.py:310: in _lower return _lower_two_sided(matrix, array(xp, lo), array(xp, hi), xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:275: in _lower_two_sided return _lower_wrapped(matrix, lower, upper, xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:204: in _lower_wrapped op = _SignedRowSelection(matrix, finite_l, finite_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1493: in __init__ self._expand_lower = xp.cumulative_sum(lower_int) * lower_int ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0], dtype=array_api_strict.int64),) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function cumulative_sum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____ test_vstack_with_one_bounded_block_is_not_restacked[array_api_strict] _____ namespace = def test_vstack_with_one_bounded_block_is_not_restacked(namespace): # Only the first block has finite bounds: the lowered result is that # block's own operator, not a one-element VStack. xp = namespace rows, lo, hi = _random_block() top = _Opaque(array(xp, rows[:_SPLIT])) bottom = _Opaque(array(xp, rows[_SPLIT:])) lo = lo[:_SPLIT] + [-_INF] * (_M - _SPLIT) hi = hi[:_SPLIT] + [_INF] * (_M - _SPLIT) > op, offset = _lower(xp, VStack((top, bottom)), lo, hi) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_linear_ineq_lowering.py:854: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_linear_ineq_lowering.py:310: in _lower return _lower_two_sided(matrix, array(xp, lo), array(xp, hi), xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:272: in _lower_two_sided return _lower_stacked(matrix, lower, upper, xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:228: in _lower_stacked op, offset = _lower_two_sided(block, lower[start:stop], upper[start:stop], xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:275: in _lower_two_sided return _lower_wrapped(matrix, lower, upper, xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:204: in _lower_wrapped op = _SignedRowSelection(matrix, finite_l, finite_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1493: in __init__ self._expand_lower = xp.cumulative_sum(lower_int) * lower_int ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1, 0, 1, 0, 1, 0, 1], dtype=array_api_strict.int64),) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function cumulative_sum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ______ test_row_selection_without_rows_adjoint_is_zero[array_api_strict] _______ namespace = def test_row_selection_without_rows_adjoint_is_zero(namespace): # k = 0: Sᵀ v is an empty-source expansion, so the adjoint products are # zero for rank-1 and rank-2 inputs alike. from ipax.backend.operators import _SignedRowSelection xp = namespace a = Dense(array(xp, [[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])) none = array(xp, [0.0, 0.0, 0.0]) > 0.5 > op = _SignedRowSelection(a, none, none) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_linear_ineq_lowering.py:884: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/backend/operators.py:1493: in __init__ self._expand_lower = xp.cumulative_sum(lower_int) * lower_int ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0, 0, 0], dtype=array_api_strict.int64),), kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function cumulative_sum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_wrapper_forwards_gram_coo_with_folded_weights[array_api_strict] _____ namespace = def test_wrapper_forwards_gram_coo_with_folded_weights(namespace): xp = namespace rows, lo, hi = _random_block() class _OpaqueCoo(_Opaque): def gram_coo(self, weights): g = self.gram(weights) r, c = [], [] for i in range(_N): for j in range(_N): r.append(i) c.append(j) flat = xp.reshape(g, (-1,)) return ( xp.asarray(r, dtype=xp.int64), xp.asarray(c, dtype=xp.int64), flat, (_N, _N), ) > op, _ = _lower(xp, _OpaqueCoo(array(xp, rows)), lo, hi) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_linear_ineq_lowering.py:912: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_linear_ineq_lowering.py:310: in _lower return _lower_two_sided(matrix, array(xp, lo), array(xp, hi), xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:275: in _lower_two_sided return _lower_wrapped(matrix, lower, upper, xp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/problem/linear_ineq.py:204: in _lower_wrapped op = _SignedRowSelection(matrix, finite_l, finite_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1493: in __init__ self._expand_lower = xp.cumulative_sum(lower_int) * lower_int ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0], dtype=array_api_strict.int64),) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function cumulative_sum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __________ test_gram_accumulate_dtype_hint_protocol[array_api_strict] __________ namespace = def test_gram_accumulate_dtype_hint_protocol(namespace): # The hint is how gram_dtype="auto" discovers that the constraint data # carries only float32 information: storage-level metadata, forwarded by # every wrapper. Absent evidence, the answer is None (native). from ipax.backend.operators import CSROperator, VStack from ipax.problem.scaling import _RowScaled xp = namespace dense64 = Dense(xp.asarray([[1.0, 2.0], [3.0, 4.0]], dtype=xp.float64)) dense32 = Dense(xp.asarray([[1.0, 2.0], [3.0, 4.0]], dtype=xp.float32)) assert dense64.gram_accumulate_dtype_hint() is None assert dense32.gram_accumulate_dtype_hint() == "float32" indptr = xp.asarray([0, 1, 2]) indices = xp.asarray([0, 1]) values64 = xp.asarray([1.0, 2.0], dtype=xp.float64) > csr64 = CSROperator(indptr, indices, values64, (2, 2)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_mixed_precision_dense.py:711: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/backend/operators.py:1324: in __init__ rows = _expand_indptr(xp, indptr, int(data.shape[0])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0, 1, 2], dtype=array_api_strict.int64), Array([0, 1], dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_solve_hs35_with_mixed_gram_matches_reference[array_api_strict] ______ namespace = def test_solve_hs35_with_mixed_gram_matches_reference(namespace): # End-to-end: the full IPM with the mixed-precision dense route converges # to the known optimum of an inequality QP on every backend. from ipax import Options, Status, solve from ipax.testing.problems import HS35 xp = namespace problem = HS35(xp) x0 = xp.asarray([0.5, 0.5, 0.5], dtype=xp.float64) > result = solve( problem, x0, options=Options( hessian="exact", linsolve="dense", dense=DenseOptions(gram_dtype="float32"), ), ) tests/unit/test_mixed_precision_dense.py:1225: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _______ test_complementarity_measures_average_and_min[array_api_strict] ________ namespace = def test_complementarity_measures_average_and_min(namespace): xp = namespace # 2 slack pairs (0.5, 0.5), active-lower pairs (0.2, 0.2), active-upper # pair (0.4); masked-out entries carry junk that must not leak in. > avg, mn = complementarity_measures( s=array(xp, [1.0, 2.0]), y_ineq=array(xp, [0.5, 0.25]), z_lower=array(xp, [2.0, 1.0, 5.0]), z_upper=array(xp, [9.0, 9.0, 0.8]), x_minus_l=array(xp, [0.1, 0.2, 7.0]), u_minus_x=array(xp, [3.0, 4.0, 0.5]), mask_l=xp.asarray([True, True, False]), mask_u=xp.asarray([False, False, True]), m=2, n_bounds=3, ) tests/unit/test_mu_schedule.py:101: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/barrier.py:234: in complementarity_measures xp.minimum( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0.2, 0.2, inf], dtype=array_api_strict.float64), Array([inf, inf, 0.4], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _________ test_complementarity_measures_bounds_only[array_api_strict] __________ namespace = def test_complementarity_measures_bounds_only(namespace): xp = namespace > avg, mn = complementarity_measures( s=array(xp, []), y_ineq=array(xp, []), z_lower=array(xp, [2.0, 1.0, 5.0]), z_upper=array(xp, [9.0, 9.0, 0.8]), x_minus_l=array(xp, [0.1, 0.2, 7.0]), u_minus_x=array(xp, [3.0, 4.0, 0.5]), mask_l=xp.asarray([True, True, False]), mask_u=xp.asarray([False, False, True]), m=0, n_bounds=3, ) tests/unit/test_mu_schedule.py:119: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/barrier.py:234: in complementarity_measures xp.minimum( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0.2, 0.2, inf], dtype=array_api_strict.float64), Array([inf, inf, 0.4], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __ test_schedule_solves_hs35_and_changes_mu_trace[array_api_strict-adaptive] ___ namespace = schedule = 'adaptive' @pytest.mark.parametrize("schedule", ["adaptive", "breedveld", "quality"]) def test_schedule_solves_hs35_and_changes_mu_trace(namespace, schedule): > problem, result = _solve_hs35(namespace, schedule) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_mu_schedule.py:175: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_mu_schedule.py:157: in _solve_hs35 return problem, solve( ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __ test_schedule_solves_hs35_and_changes_mu_trace[array_api_strict-breedveld] __ namespace = schedule = 'breedveld' @pytest.mark.parametrize("schedule", ["adaptive", "breedveld", "quality"]) def test_schedule_solves_hs35_and_changes_mu_trace(namespace, schedule): > problem, result = _solve_hs35(namespace, schedule) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_mu_schedule.py:175: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_mu_schedule.py:157: in _solve_hs35 return problem, solve( ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___ test_schedule_solves_hs35_and_changes_mu_trace[array_api_strict-quality] ___ namespace = schedule = 'quality' @pytest.mark.parametrize("schedule", ["adaptive", "breedveld", "quality"]) def test_schedule_solves_hs35_and_changes_mu_trace(namespace, schedule): > problem, result = _solve_hs35(namespace, schedule) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_mu_schedule.py:175: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_mu_schedule.py:157: in _solve_hs35 return problem, solve( ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___________ test_schedule_solves_bound_qp[array_api_strict-adaptive] ___________ namespace = schedule = 'adaptive' @pytest.mark.parametrize("schedule", ["adaptive", "breedveld", "quality"]) def test_schedule_solves_bound_qp(namespace, schedule): problem = BoundConstrainedQP(namespace) > result = solve( problem, array(namespace, [0.25, 0.75]), options=Options(hessian="exact", linsolve="dense", mu_schedule=schedule), ) tests/unit/test_mu_schedule.py:188: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0. , 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __________ test_schedule_solves_bound_qp[array_api_strict-breedveld] ___________ namespace = schedule = 'breedveld' @pytest.mark.parametrize("schedule", ["adaptive", "breedveld", "quality"]) def test_schedule_solves_bound_qp(namespace, schedule): problem = BoundConstrainedQP(namespace) > result = solve( problem, array(namespace, [0.25, 0.75]), options=Options(hessian="exact", linsolve="dense", mu_schedule=schedule), ) tests/unit/test_mu_schedule.py:188: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0. , 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___________ test_schedule_solves_bound_qp[array_api_strict-quality] ____________ namespace = schedule = 'quality' @pytest.mark.parametrize("schedule", ["adaptive", "breedveld", "quality"]) def test_schedule_solves_bound_qp(namespace, schedule): problem = BoundConstrainedQP(namespace) > result = solve( problem, array(namespace, [0.25, 0.75]), options=Options(hessian="exact", linsolve="dense", mu_schedule=schedule), ) tests/unit/test_mu_schedule.py:188: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0. , 0.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_breedveld_schedule_keeps_mu_until_first_step[array_api_strict] ______ namespace = def test_breedveld_schedule_keeps_mu_until_first_step(namespace): # σ(α) needs a previously *accepted* steplength (Breedveld 2017, eq. (12)); # before the first step the schedule must leave μ at μ_init rather than # consume the α = 1 sentinel (which would crash μ to the floor at once). > _, result = _solve_hs35(namespace, "breedveld") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_mu_schedule.py:201: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_mu_schedule.py:157: in _solve_hs35 return problem, solve( ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____ test_probing_standalone_solves_and_changes_mu_trace[array_api_strict] _____ namespace = def test_probing_standalone_solves_and_changes_mu_trace(namespace): # NWW 2009 "Mehrotra probing" as a plain strategy: the affine solve is only # a σ probe; the step itself is the ordinary centered Newton direction. > problem, result = _solve_hs35(namespace, "probing") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_mu_schedule.py:213: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_mu_schedule.py:157: in _solve_hs35 return problem, solve( ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____ test_quality_standalone_solves_and_changes_mu_trace[array_api_strict] _____ namespace = def test_quality_standalone_solves_and_changes_mu_trace(namespace): # NWW 2009 §3.3 quality function as a plain strategy: like probing it needs # the affine direction, so the standalone mode runs the corrector path with # a plain centered re-solve; σ then minimizes the predicted full-KKT model. > problem, result = _solve_hs35(namespace, "quality") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_mu_schedule.py:225: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_mu_schedule.py:157: in _solve_hs35 return problem, solve( ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____________ test_default_schedule_is_monotone[array_api_strict] ______________ namespace = def test_default_schedule_is_monotone(namespace): # Default decided by the S2MPJ v10 paired A/B (2026-07-08): monotone beat # probing on every config, 3837 vs 3770 correct in total — probing crashes # μ faster than the duals can follow on enough problems (tail stalls at # kkt ~1e-4). The non-monotone oracles remain explicit opt-ins. assert Options().mu_schedule == "monotone" problem = HS35(namespace) x0 = array(namespace, [0.5, 0.5, 0.5]) > default = solve(problem, x0, options=Options(hessian="exact", linsolve="dense")) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_mu_schedule.py:242: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_adaptive_oracle_steers_the_corrector[array_api_strict-mehrotra] _____ namespace = corrections = 'mehrotra' @pytest.mark.parametrize("corrections", ["mehrotra", "gondzio"]) def test_adaptive_oracle_steers_the_corrector(namespace, corrections): # The corrector consumes the oracle's μ target (NWW 2009: "the corrector is # not part of the selection of the barrier parameter"): choosing the LOQO # oracle with corrections active must change the μ trace vs. probing. > problem, result = _solve_hs35(namespace, "adaptive", corrections=corrections) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_mu_schedule.py:260: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_mu_schedule.py:157: in _solve_hs35 return problem, solve( ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_adaptive_oracle_steers_the_corrector[array_api_strict-gondzio] ______ namespace = corrections = 'gondzio' @pytest.mark.parametrize("corrections", ["mehrotra", "gondzio"]) def test_adaptive_oracle_steers_the_corrector(namespace, corrections): # The corrector consumes the oracle's μ target (NWW 2009: "the corrector is # not part of the selection of the barrier parameter"): choosing the LOQO # oracle with corrections active must change the μ trace vs. probing. > problem, result = _solve_hs35(namespace, "adaptive", corrections=corrections) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_mu_schedule.py:260: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_mu_schedule.py:157: in _solve_hs35 return problem, solve( ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ________ test_breedveld_oracle_with_corrector_solves[array_api_strict] _________ namespace = def test_breedveld_oracle_with_corrector_solves(namespace): > problem, result = _solve_hs35(namespace, "breedveld", corrections="gondzio") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_mu_schedule.py:269: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_mu_schedule.py:157: in _solve_hs35 return problem, solve( ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_probing_sigma_default_never_consults_the_mehrotra_rule[array_api_strict] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffaa5acd70> def test_probing_sigma_default_never_consults_the_mehrotra_rule(namespace, monkeypatch): # The unclipped Mehrotra σ rule is opt-in: under the default options the # probing oracle must go through the NWW rule (``probing_mu``) and never # reach ``mehrotra_probing_mu``. import ipax.ipm.driver as driver_module assert BarrierOptions().probing_sigma == "nww" calls = {"nww": 0, "mehrotra": 0} original_nww = driver_module.probing_mu original_mehrotra = driver_module.mehrotra_probing_mu def nww_spy(context): calls["nww"] += 1 return original_nww(context) def mehrotra_spy(context, tau): calls["mehrotra"] += 1 return original_mehrotra(context, tau=tau) monkeypatch.setattr(driver_module, "probing_mu", nww_spy) monkeypatch.setattr(driver_module, "mehrotra_probing_mu", mehrotra_spy) > _, default = _solve_hs35_probing(namespace) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_mu_schedule.py:314: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_mu_schedule.py:279: in _solve_hs35_probing return problem, solve( ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_mehrotra_probing_sigma_solves_and_uses_the_breedveld_tau[array_api_strict] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa9f10670> def test_mehrotra_probing_sigma_solves_and_uses_the_breedveld_tau( namespace, monkeypatch ): # probing_sigma="mehrotra" routes the probing oracle to the unclipped rule # (Mehrotra 1992; Breedveld 2017 supplement eqs. (4)–(7)) with the probe # step cut back by BreedveldOptions.tau. import ipax.ipm.driver as driver_module seen: list[float] = [] original = driver_module.mehrotra_probing_mu def spy(context, tau): seen.append(tau) return original(context, tau=tau) monkeypatch.setattr(driver_module, "mehrotra_probing_mu", spy) > problem, result = _solve_hs35_probing(namespace, probing_sigma="mehrotra") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_mu_schedule.py:346: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_mu_schedule.py:279: in _solve_hs35_probing return problem, solve( ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___ test_breedveld_mehrotra_and_gondzio_variant_solve_hs35[array_api_strict] ___ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa5710590> def test_breedveld_mehrotra_and_gondzio_variant_solve_hs35(namespace, monkeypatch): # Breedveld 2017 supplement A.1 + A.2 together (σ rule + Gondzio variant). import dataclasses import ipax.ipm.corrections as corrections_module from ipax.options import CorrectionsOptions # Spy: at least one candidate corrector solve of the Breedveld Gondzio # loop must run (not only the Mehrotra step preceding it). candidate_solves = [] original = corrections_module._breedveld_gondzio def spy(ctx, xp, step, mu_target, targets, max_corrections): def counting_solve(*args): candidate_solves.append(mu_target) return ctx.solve(*args) counted = dataclasses.replace(ctx, solve=counting_solve) return original(counted, xp, step, mu_target, targets, max_corrections) monkeypatch.setattr(corrections_module, "_breedveld_gondzio", spy) problem = HS35(namespace) > result = solve( problem, array(namespace, [0.5, 0.5, 0.5]), options=Options( hessian="exact", linsolve="dense", mu_schedule="probing", corrections=CorrectionsOptions( method="gondzio", gondzio_variant="breedveld" ), globalization="breedveld", barrier=BarrierOptions(probing_sigma="mehrotra"), ), ) tests/unit/test_mu_schedule.py:378: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _________ test_centrality_floor_steers_free_mode_mu[array_api_strict] __________ namespace = def test_centrality_floor_steers_free_mode_mu(namespace): # μ_free ≥ κ_cent·max(dual, primal infeasibility): a large κ visibly lifts # the μ trace on a problem the oracle would otherwise decenter, without # costing convergence. problem = HS35(namespace) x0 = array(namespace, [0.5, 0.5, 0.5]) def run(barrier: BarrierOptions): return solve( problem, x0, options=Options( hessian="exact", linsolve="dense", mu_schedule="adaptive", barrier=barrier, ), ) > lifted = run(BarrierOptions(kappa_centrality=0.5)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_mu_schedule.py:536: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_mu_schedule.py:525: in run return solve( ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_forced_fallback_steers_mu_and_still_converges[array_api_strict] _____ namespace = def test_forced_fallback_steers_mu_and_still_converges(namespace): # κ = 0.01 with a length-0 window demands a 100× KKT-error reduction every # free-mode iteration — practically guaranteed to trip, so the run must # fall back to monotone μ handling and still reach the optimum. problem = HS35(namespace) x0 = array(namespace, [0.5, 0.5, 0.5]) def run(barrier: BarrierOptions): return solve( problem, x0, options=Options( hessian="exact", linsolve="dense", mu_schedule="adaptive", barrier=barrier, ), ) > forced = run(BarrierOptions(fallback_kappa=0.01, fallback_window=0)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_mu_schedule.py:563: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_mu_schedule.py:552: in run return solve( ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ______ test_driver_passes_infeasibility_to_fallback_mu[array_api_strict] _______ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa9f11780> def test_driver_passes_infeasibility_to_fallback_mu(namespace, monkeypatch): # Wiring proof for the fallback-path centrality floor: when the safeguard # trips, the driver must hand the current primal/dual infeasibility to # ``fallback_mu`` so the re-entry μ respects the El-Bakry floor. (The # formula itself is pinned by the fallback_mu unit tests above; a trace # comparison cannot discriminate this path because the free-mode oracles # share the same floor.) import ipax.ipm.driver as driver_mod seen: dict[str, float] = {} original = driver_mod.fallback_mu def recording(avg_compl, options, tol, infeasibility=0.0): seen["infeasibility"] = float(infeasibility) return original(avg_compl, options, tol) monkeypatch.setattr(driver_mod, "fallback_mu", recording) problem = HS35(namespace) > result = solve( problem, array(namespace, [0.5, 0.5, 0.5]), options=Options( hessian="exact", linsolve="dense", mu_schedule="adaptive", # Forced trip: κ = 0.01 with a length-0 window demands a 100× KKT # error reduction every free-mode iteration (see above). barrier=BarrierOptions(fallback_kappa=0.01, fallback_window=0), ), ) tests/unit/test_mu_schedule.py:591: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _________ test_csr_expands_to_correct_coo_structure[array_api_strict] __________ namespace = tol = {'rtol': 1e-09, 'atol': 1e-09} def test_csr_expands_to_correct_coo_structure(namespace, tol): # CSR for [[2, -1, 0.5], [0, 3, 4]]. indptr = namespace.asarray([0, 3, 5]) indices = namespace.asarray([0, 1, 2, 1, 2]) data = array(namespace, [2.0, -1.0, 0.5, 3.0, 4.0]) > op = CSROperator(indptr, indices, data, (2, 3)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_public_sparse_operators.py:76: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/backend/operators.py:1324: in __init__ rows = _expand_indptr(xp, indptr, int(data.shape[0])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0, 3, 5], dtype=array_api_strict.int64), Array([0, 1, 2, 3, 4], dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _________ test_csc_expands_to_correct_coo_structure[array_api_strict] __________ namespace = tol = {'rtol': 1e-09, 'atol': 1e-09} def test_csc_expands_to_correct_coo_structure(namespace, tol): # CSC for [[2, -1, 0.5], [0, 3, 4]]. indptr = namespace.asarray([0, 1, 3, 5]) indices = namespace.asarray([0, 0, 1, 0, 1]) data = array(namespace, [2.0, -1.0, 3.0, 0.5, 4.0]) > op = CSCOperator(indptr, indices, data, (2, 3)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_public_sparse_operators.py:90: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/backend/operators.py:1361: in __init__ cols = _expand_indptr(xp, indptr, int(data.shape[0])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0, 1, 3, 5], dtype=array_api_strict.int64), Array([0, 1, 2, 3, 4], dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___________ test_coo_values_matches_to_coo_values[array_api_strict] ____________ namespace = tol = {'rtol': 1e-09, 'atol': 1e-09} def test_coo_values_matches_to_coo_values(namespace, tol): indptr = namespace.asarray([0, 1, 3, 5]) indices = namespace.asarray([0, 0, 1, 0, 1]) data = array(namespace, [2.0, -1.0, 3.0, 0.5, 4.0]) > op = CSCOperator(indptr, indices, data, (2, 3)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_public_sparse_operators.py:103: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/backend/operators.py:1361: in __init__ cols = _expand_indptr(xp, indptr, int(data.shape[0])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0, 1, 3, 5], dtype=array_api_strict.int64), Array([0, 1, 2, 3, 4], dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___________ test_first_feasible_recenter_keeps_mu[array_api_strict] ____________ namespace = def test_first_feasible_recenter_keeps_mu(namespace): # The HS101 fix: the first re-center repairs slacks/duals at the *current* # μ. No barrier escalation — outcome.mu is None (keep the loop's μ). opts = Options() driver = _driver(namespace, opts) rstate = _RestorationState() > outcome = _handle(driver, namespace, mu=1e-9, rstate=rstate) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_recenter_mu_escalation.py:77: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_recenter_mu_escalation.py:45: in _handle return driver._handle_restoration( ipax/ipm/driver.py:3181: in _handle_restoration s, y_ineq = recenter_slacks_duals(xp, g, y_ineq, mu_eff) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:214: in recenter_slacks_duals s = xp.maximum(-g, floor) ^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([1.e-10], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __________ test_repeat_feasible_recenter_raises_mu[array_api_strict] ___________ namespace = def test_repeat_feasible_recenter_raises_mu(namespace): # The treadmill signature: a second feasible re-center in the same solve # means re-centering at the current μ already failed once — raise μ so the # next barrier problem is one the step/line search can actually solve. opts = Options() driver = _driver(namespace, opts) rstate = _RestorationState() mu = 1e-9 > first = _handle(driver, namespace, mu=mu, rstate=rstate) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_recenter_mu_escalation.py:93: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_recenter_mu_escalation.py:45: in _handle return driver._handle_restoration( ipax/ipm/driver.py:3181: in _handle_restoration s, y_ineq = recenter_slacks_duals(xp, g, y_ineq, mu_eff) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:214: in recenter_slacks_duals s = xp.maximum(-g, floor) ^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([1.e-10], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _________ test_repeat_recenter_mu_capped_at_mu_init[array_api_strict] __________ namespace = def test_repeat_recenter_mu_capped_at_mu_init(namespace): # At μ already equal to mu_init there is no headroom: the re-center must # still resume, and any μ it returns must not exceed the cold-start value. opts = Options() driver = _driver(namespace, opts) rstate = _RestorationState() mu = opts.barrier.mu_init > _handle(driver, namespace, mu=mu, rstate=rstate) tests/unit/test_recenter_mu_escalation.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_recenter_mu_escalation.py:45: in _handle return driver._handle_restoration( ipax/ipm/driver.py:3181: in _handle_restoration s, y_ineq = recenter_slacks_duals(xp, g, y_ineq, mu_eff) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:214: in recenter_slacks_duals s = xp.maximum(-g, floor) ^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([0.01], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ________ test_restoration_reduces_equality_violation[array_api_strict] _________ namespace = def test_restoration_reduces_equality_violation(namespace): problem = HS6(namespace) # A point off the constraint manifold: 10(x2 - x1^2) = 10(0 - 4) = -40. x = array(namespace, [2.0, 0.0]) s = namespace.zeros((0,), dtype=x.dtype) theta0 = float(namespace.max(namespace.abs(problem.eq_constraints(x)))) > x_new, _, exit_reason = restore( xp=namespace, x=x, s=s, m=0, m_eq=1, eq_fn=problem.eq_constraints, eq_jac_fn=lambda z: as_operator(problem.eq_jacobian(z)), ineq_fn=_no_ineq, ineq_jac_fn=_no_ineq, mask_l=namespace.zeros((2,), dtype=namespace.bool), mask_u=namespace.zeros((2,), dtype=namespace.bool), lower_safe=namespace.zeros((2,), dtype=x.dtype), upper_safe=namespace.zeros((2,), dtype=x.dtype), tol=1e-8, ) tests/unit/test_restoration.py:72: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([2., 0.], dtype=array_api_strict.float64), Array([1.e-08, 1.e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __ test_matrix_free_restoration_uses_only_jacobian_products[array_api_strict] __ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa969f850> def test_matrix_free_restoration_uses_only_jacobian_products(namespace, monkeypatch): """The opt-in route must never construct an n-by-n identity or probe matmat.""" xp = namespace n = 3 x = array(xp, [2.0, 0.0, -1.0]) eye_shapes: list[int] = [] original_eye = xp.eye def recording_eye(size, *args, **kwargs): eye_shapes.append(int(size)) return original_eye(size, *args, **kwargs) monkeypatch.setattr(xp, "eye", recording_eye) eq_fn, _ = _two_equalities(xp) def eq_jac_fn(z): del z def matvec(v): return xp.stack((v[0] + 2.0 * v[1], v[2])) def rmatvec(v): return xp.stack((v[0], 2.0 * v[0], v[1])) op = MatrixFreeJacobian((2, n), matvec, rmatvec) def forbidden_matmat(V): del V raise AssertionError("matrix-free restoration densified the Jacobian") op.matmat = forbidden_matmat # type: ignore[method-assign] return op > x_new, _, exit_reason = restore( **_restore_kwargs(xp, x, m_eq=2, eq_fn=eq_fn, eq_jac_fn=eq_jac_fn), linear_solver=_krylov_solver(rtol=1e-10), ) tests/unit/test_restoration.py:127: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([ 2., 0., -1.], dtype=array_api_strict.float64), Array([1.e-08, 1.e-08, 1.e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_matrix_free_restoration_uses_the_truncated_krylov_iterate[array_api_strict] _ namespace = def test_matrix_free_restoration_uses_the_truncated_krylov_iterate(namespace): """A work-capped inner solve is a trial direction, not a rejected rung. CG iterates minimize the Gauss-Newton model over a growing Krylov space, so the truncated iterate is a descent direction (Steihaug 1983). Discarding it and climbing the LM ladder would degrade the route to damped steepest descent at large λ — and with a one-iteration cap could never certify anything but a solve failure. """ xp = namespace x = array(xp, [2.0, 0.0, -1.0]) eq_fn, eq_jac_fn = _two_equalities(xp) > x_new, _, exit_reason = restore( **_restore_kwargs(xp, x, m_eq=2, eq_fn=eq_fn, eq_jac_fn=eq_jac_fn), linear_solver=_krylov_solver(max_iter=1, rtol=1e-12), ) tests/unit/test_restoration.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([ 2., 0., -1.], dtype=array_api_strict.float64), Array([1.e-08, 1.e-08, 1.e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_matrix_free_restoration_tracks_dense_on_an_ill_conditioned_jacobian[array_api_strict] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa969d400> def test_matrix_free_restoration_tracks_dense_on_an_ill_conditioned_jacobian( namespace, monkeypatch ): """Where restoration is actually entered — rank-deficient, ill-conditioned Jacobians — the Krylov route must make progress comparable to the dense Gauss-Newton solve on the same outer budget, not crawl along the LM ladder.""" import numpy as np import ipax.ipm.restoration as restoration_mod monkeypatch.setattr(restoration_mod, "_MAX_ITER", 20) xp = namespace rng = np.random.default_rng(0) # Sized so that discarding truncated CG iterates (climbing the LM ladder # instead) measurably lags dense: 3.8x here vs 1.4x with the reuse. n, m, rank = 200, 150, 130 u, _ = np.linalg.qr(rng.standard_normal((m, m))) v, _ = np.linalg.qr(rng.standard_normal((n, n))) sv = np.zeros(m) sv[:rank] = np.logspace(0, -5, rank) a = (u * sv) @ v[:m, :] b = a @ rng.standard_normal(n) + 1e-3 * rng.standard_normal(m) a_xp = array(xp, a.tolist()) b_xp = array(xp, b.tolist()) x0 = array(xp, rng.standard_normal(n).tolist()) def eq_fn(z): return xp.matmul(a_xp, z) - b_xp def eq_jac_fn(z): del z return as_operator(a_xp) kwargs = _restore_kwargs(xp, x0, m_eq=m, eq_fn=eq_fn, eq_jac_fn=eq_jac_fn) > x_dense, _, _ = restore(**kwargs) ^^^^^^^^^^^^^^^^^ tests/unit/test_restoration.py:193: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([-1.48308042e+00, -2.23211623e+00, 6.88233525e-01, -9.54544096e-01, -2.87439099e-01, -9.00755695...1.e-08, 1.e-08, 1.e-08, 1.e-08, 1.e-08, 1.e-08, 1.e-08, 1.e-08, 1.e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_matrix_free_restoration_does_not_fall_back_on_krylov_failure[array_api_strict] _ namespace = def test_matrix_free_restoration_does_not_fall_back_on_krylov_failure(namespace): """Failed inner solves must climb the LM ladder, never allocate a dense matrix.""" xp = namespace calls = {"factor": 0, "solve": 0} class FailingSolver: def factor(self, operator): calls["factor"] += 1 assert operator.shape == (1, 1) def solve(self, rhs): del rhs calls["solve"] += 1 raise LinearSolveError("synthetic Krylov failure") def eq_jac_fn(z): del z return MatrixFreeJacobian((1, 1), lambda v: v, lambda v: v) x = array(xp, [0.0]) > _, _, exit_reason = restore( **_restore_kwargs(xp, x, m_eq=1, eq_fn=lambda z: z - 1.0, eq_jac_fn=eq_jac_fn), linear_solver=FailingSolver(), # type: ignore[arg-type] ) tests/unit/test_restoration.py:222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0.], dtype=array_api_strict.float64), Array([1.e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_matrix_free_and_dense_restoration_match_with_active_bounds_and_inequality[array_api_strict] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa969d160> def test_matrix_free_and_dense_restoration_match_with_active_bounds_and_inequality( namespace, monkeypatch ): """The product operator must reproduce the dense reduced normal equations.""" import ipax.ipm.restoration as restoration_mod monkeypatch.setattr(restoration_mod, "_MAX_ITER", 1) xp = namespace x = xp.zeros((3,), dtype=xp.float64) def eq_fn(z): return xp.stack((z[0] + z[1] + 1.0,)) def eq_jac_fn(z): del z return as_operator(array(xp, [[1.0, 1.0, 0.0]])) def ineq_fn(z): return xp.stack((z[2] + 0.5,)) def ineq_jac_fn(z): del z return as_operator(array(xp, [[0.0, 0.0, 1.0]])) kwargs = _restore_kwargs( xp, x, s=xp.ones((1,), dtype=x.dtype), m=1, m_eq=1, eq_fn=eq_fn, eq_jac_fn=eq_jac_fn, ineq_fn=ineq_fn, ineq_jac_fn=ineq_jac_fn, mask_l=xp.asarray([True, False, False], dtype=xp.bool), ) > x_dense, s_dense, dense_exit = restore(**kwargs) ^^^^^^^^^^^^^^^^^ tests/unit/test_restoration.py:269: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0., 0., 0.], dtype=array_api_strict.float64), Array([1.e-08, 1.e-08, 1.e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ______ test_matrix_free_restoration_requires_an_adjoint[array_api_strict] ______ namespace = def test_matrix_free_restoration_requires_an_adjoint(namespace): xp = namespace x = array(xp, [0.0]) with pytest.raises(NotImplementedError, match="adjoint"): > restore( **_restore_kwargs( xp, x, m_eq=1, eq_fn=lambda z: z - 1.0, eq_jac_fn=lambda z: MatrixFreeJacobian((1, 1), lambda v: v), ), linear_solver=_krylov_solver(), ) tests/unit/test_restoration.py:284: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0.], dtype=array_api_strict.float64), Array([1.e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_solve_rejects_matrix_free_restoration_without_an_adjoint_up_front[array_api_strict] _ namespace = def test_solve_rejects_matrix_free_restoration_without_an_adjoint_up_front( namespace, ): """A matvec-only Jacobian must be refused at entry, not hundreds of iterations later when restoration first needs the adjoint.""" xp = namespace class MatvecOnly(Problem): @property def n_vars(self) -> int: return 2 def objective(self, x): return xp.sum(x * x) def gradient(self, x): return 2.0 * x def eq_constraints(self, x): return xp.stack((x[0] + x[1] - 1.0,)) def eq_jacobian(self, x): del x return MatrixFreeJacobian((1, 2), lambda v: xp.stack((v[0] + v[1],))) options = Options( hessian="lbfgs", restoration=RestorationOptions(linear_solver="krylov") ) with pytest.raises(ValueError, match="adjoint"): > solve(MatvecOnly(), array(xp, [0.0, 0.0]), options=options) tests/unit/test_restoration.py:325: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ----------------------------- Captured stderr call ----------------------------- ipax solving: 2 variables (bounds: 0 lower, 0 upper), 1 equalities, 0 inequalities | linear solver = dense | hessian = lbfgs problem structure: variables = 2 inequalities = 0 equalities = 1 nonlinear + 0 linear bounded vars = 0 lower, 0 upper solver setup: hessian = lbfgs linear solver = auto (DenseSolver) globalization = filter mu schedule = monotone scaling = gradient-based corrections = none krylov method = cg ------------------------------ Captured log call ------------------------------- RESULT ipax:solve.py:365 ipax solving: 2 variables (bounds: 0 lower, 0 upper), 1 equalities, 0 inequalities | linear solver = dense | hessian = lbfgs PROBLEM ipax:solve.py:378 problem structure: variables = 2 inequalities = 0 equalities = 1 nonlinear + 0 linear bounded vars = 0 lower, 0 upper SOLVER ipax:solve.py:390 solver setup: hessian = lbfgs linear solver = auto (DenseSolver) globalization = filter mu schedule = monotone scaling = gradient-based corrections = none krylov method = cg _______ test_restoration_flags_inconsistent_equalities[array_api_strict] _______ namespace = def test_restoration_flags_inconsistent_equalities(namespace): problem = InfeasibleEqualities(namespace) x = array(namespace, [0.5]) s = namespace.zeros((0,), dtype=x.dtype) > _, _, exit_reason = restore( xp=namespace, x=x, s=s, m=0, m_eq=2, eq_fn=problem.eq_constraints, eq_jac_fn=lambda z: as_operator(problem.eq_jacobian(z)), ineq_fn=_no_ineq, ineq_jac_fn=_no_ineq, mask_l=namespace.zeros((1,), dtype=namespace.bool), mask_u=namespace.zeros((1,), dtype=namespace.bool), lower_safe=namespace.zeros((1,), dtype=x.dtype), upper_safe=namespace.zeros((1,), dtype=x.dtype), tol=1e-8, ) tests/unit/test_restoration.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0.5], dtype=array_api_strict.float64), Array([1.e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_restoration_keeps_projected_bound_point_strictly_interior[array_api_strict] _ namespace = def test_restoration_keeps_projected_bound_point_strictly_interior(namespace): class BoundaryEquality(Problem): @property def n_vars(self) -> int: return 1 def objective(self, x): return namespace.sum(x * x) def eq_constraints(self, x): return namespace.stack((x[0],)) def eq_jacobian(self, x): del x return array(namespace, [[1.0]]) problem = BoundaryEquality() x = array(namespace, [0.5]) s = namespace.zeros((0,), dtype=x.dtype) > x_new, _, exit_reason = restore( xp=namespace, x=x, s=s, m=0, m_eq=1, eq_fn=problem.eq_constraints, eq_jac_fn=lambda z: as_operator(problem.eq_jacobian(z)), ineq_fn=_no_ineq, ineq_jac_fn=_no_ineq, mask_l=namespace.asarray([True], dtype=namespace.bool), mask_u=namespace.asarray([False], dtype=namespace.bool), lower_safe=array(namespace, [0.0]), upper_safe=array(namespace, [0.0]), tol=1e-8, ) tests/unit/test_restoration.py:374: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0.5], dtype=array_api_strict.float64), Array([1.e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___ test_restoration_survives_singular_gauss_newton_system[array_api_strict] ___ namespace = def test_restoration_survives_singular_gauss_newton_system(namespace): # Regression: an extreme-scale constraint Jacobian makes the Gauss-Newton # normal matrix J^T J numerically singular (cf. HS7, whose (1+x1^2)^2 # Jacobian reaches ~1e201 at a bad restoration iterate). The damped solve # must degrade gracefully — previously numpy's solve raised # ``LinAlgError: Singular matrix`` and crashed the whole solve. xp = namespace x = array(xp, [1.0, 1.0]) s = xp.zeros((0,), dtype=x.dtype) # Moderate residual but a hugely ill-scaled Jacobian at this iterate. jac = array(xp, [[4.0e100, -1.9e27]]) def eq_fn(z): del z return array(xp, [1.0]) def eq_jac_fn(z): del z return as_operator(jac) > x_new, _, exit_reason = restore( xp=xp, x=x, s=s, m=0, m_eq=1, eq_fn=eq_fn, eq_jac_fn=eq_jac_fn, ineq_fn=_no_ineq, ineq_jac_fn=_no_ineq, mask_l=xp.zeros((2,), dtype=xp.bool), mask_u=xp.zeros((2,), dtype=xp.bool), lower_safe=xp.zeros((2,), dtype=x.dtype), upper_safe=xp.zeros((2,), dtype=x.dtype), tol=1e-8, ) tests/unit/test_restoration.py:415: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([1.e-08, 1.e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_dense_gauss_newton_solve_propagates_non_numerical_errors[array_api_strict-TypeError] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa94c6580> bug = TypeError("asarray() got an unexpected keyword argument 'device'") @pytest.mark.parametrize( "bug", [ TypeError("asarray() got an unexpected keyword argument 'device'"), MemoryError("host allocation failed"), ], ids=lambda e: type(e).__name__, ) def test_dense_gauss_newton_solve_propagates_non_numerical_errors( namespace, monkeypatch, bug ): # The dense LM solve treats only a numerical failure # (``numerical_failure_types()``) as a rejected trial; a bug or a resource # failure must leave ``restore`` as itself instead of being turned into a # NO_DESCENT "infeasibility certificate". xp = namespace x = array(xp, [1.0, 1.0]) def raising_solve(*args, **kwargs): del args, kwargs raise bug monkeypatch.setattr(xp.linalg, "solve", raising_solve) with pytest.raises(type(bug)) as info: > restore( xp=xp, x=x, s=xp.zeros((0,), dtype=x.dtype), m=0, m_eq=1, eq_fn=lambda z: array(xp, [1.0]), eq_jac_fn=lambda z: as_operator(array(xp, [[1.0, 2.0]])), ineq_fn=_no_ineq, ineq_jac_fn=_no_ineq, mask_l=xp.zeros((2,), dtype=xp.bool), mask_u=xp.zeros((2,), dtype=xp.bool), lower_safe=xp.zeros((2,), dtype=x.dtype), upper_safe=xp.zeros((2,), dtype=x.dtype), tol=1e-8, ) tests/unit/test_restoration.py:463: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([1.e-08, 1.e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_dense_gauss_newton_solve_propagates_non_numerical_errors[array_api_strict-MemoryError] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa94c4670> bug = MemoryError('host allocation failed') @pytest.mark.parametrize( "bug", [ TypeError("asarray() got an unexpected keyword argument 'device'"), MemoryError("host allocation failed"), ], ids=lambda e: type(e).__name__, ) def test_dense_gauss_newton_solve_propagates_non_numerical_errors( namespace, monkeypatch, bug ): # The dense LM solve treats only a numerical failure # (``numerical_failure_types()``) as a rejected trial; a bug or a resource # failure must leave ``restore`` as itself instead of being turned into a # NO_DESCENT "infeasibility certificate". xp = namespace x = array(xp, [1.0, 1.0]) def raising_solve(*args, **kwargs): del args, kwargs raise bug monkeypatch.setattr(xp.linalg, "solve", raising_solve) with pytest.raises(type(bug)) as info: > restore( xp=xp, x=x, s=xp.zeros((0,), dtype=x.dtype), m=0, m_eq=1, eq_fn=lambda z: array(xp, [1.0]), eq_jac_fn=lambda z: as_operator(array(xp, [[1.0, 2.0]])), ineq_fn=_no_ineq, ineq_jac_fn=_no_ineq, mask_l=xp.zeros((2,), dtype=xp.bool), mask_u=xp.zeros((2,), dtype=xp.bool), lower_safe=xp.zeros((2,), dtype=x.dtype), upper_safe=xp.zeros((2,), dtype=x.dtype), tol=1e-8, ) tests/unit/test_restoration.py:463: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([1.e-08, 1.e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _________ test_rejected_lm_trials_reuse_the_jacobian[array_api_strict] _________ namespace = def test_rejected_lm_trials_reuse_the_jacobian(namespace): # Levenberg-Marquardt damping control: a rejected trial step must retry with # a larger damping WITHOUT rebuilding the Jacobian/normal matrix — they # belong to the unchanged current iterate. arctan(x)=0 from x=2 makes the # undamped Gauss-Newton step overshoot (|dx| = |atan(x)|(1+x^2) > |x|), so # the first several trials are rejected while the damping grows. xp = namespace calls = {"jac": 0} def eq_fn(z): return xp.atan(z) def eq_jac_fn(z): calls["jac"] += 1 return as_operator(xp.reshape(1.0 / (1.0 + z * z), (1, 1))) x = array(xp, [2.0]) s = xp.zeros((0,), dtype=x.dtype) > x_new, _, exit_reason = restore( xp=xp, x=x, s=s, m=0, m_eq=1, eq_fn=eq_fn, eq_jac_fn=eq_jac_fn, ineq_fn=_no_ineq, ineq_jac_fn=_no_ineq, mask_l=xp.zeros((1,), dtype=xp.bool), mask_u=xp.zeros((1,), dtype=xp.bool), lower_safe=xp.zeros((1,), dtype=x.dtype), upper_safe=xp.zeros((1,), dtype=x.dtype), tol=1e-8, ) tests/unit/test_restoration.py:500: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([2.], dtype=array_api_strict.float64), Array([1.e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_bound_blocked_infeasibility_is_box_stationary[array_api_strict] _____ namespace = def test_bound_blocked_infeasibility_is_box_stationary(namespace): # c(x) = x - 1 = 0 with the upper bound x <= 0: the descent direction points # out of the box, so the projected gradient is zero — a first-order # stationary point of the bound-constrained infeasibility. The verdict must # come from that test directly instead of grinding the LM damping to its # ceiling with one Jacobian rebuild per rejected (projection-swallowed) # trial (the MANNE stall anatomy, S2MPJ 2026-07 audit). xp = namespace calls = {"jac": 0} def eq_fn(z): return z - 1.0 def eq_jac_fn(z): calls["jac"] += 1 return as_operator(xp.ones((1, 1), dtype=z.dtype)) x = array(xp, [-0.5]) s = xp.zeros((0,), dtype=x.dtype) > x_new, _, exit_reason = restore( xp=xp, x=x, s=s, m=0, m_eq=1, eq_fn=eq_fn, eq_jac_fn=eq_jac_fn, ineq_fn=_no_ineq, ineq_jac_fn=_no_ineq, mask_l=xp.zeros((1,), dtype=xp.bool), mask_u=xp.asarray([True], dtype=xp.bool), lower_safe=xp.zeros((1,), dtype=x.dtype), upper_safe=xp.zeros((1,), dtype=x.dtype), tol=1e-8, ) tests/unit/test_restoration.py:543: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([-0.5], dtype=array_api_strict.float64), Array([1.e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_restoration_recovers_inequality_slack_without_filter_residual[array_api_strict] _ namespace = def test_restoration_recovers_inequality_slack_without_filter_residual(namespace): class InactiveInequality(Problem): @property def n_vars(self) -> int: return 1 def objective(self, x): return namespace.sum(x * x) def ineq_constraints(self, x): del x return array(namespace, [-1e-4]) def ineq_jacobian(self, x): del x return array(namespace, [[0.0]]) problem = InactiveInequality() x = array(namespace, [0.0]) s = array(namespace, [1.0]) > _, s_new, exit_reason = restore( xp=namespace, x=x, s=s, m=1, m_eq=0, eq_fn=lambda z: namespace.zeros((0,), dtype=z.dtype), eq_jac_fn=lambda z: as_operator(namespace.zeros((0, 1), dtype=z.dtype)), ineq_fn=problem.ineq_constraints, ineq_jac_fn=lambda z: as_operator(problem.ineq_jacobian(z)), mask_l=namespace.zeros((1,), dtype=namespace.bool), mask_u=namespace.zeros((1,), dtype=namespace.bool), lower_safe=namespace.zeros((1,), dtype=x.dtype), upper_safe=namespace.zeros((1,), dtype=x.dtype), tol=1e-8, ) tests/unit/test_restoration.py:588: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0.], dtype=array_api_strict.float64), Array([1.e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_blocked_bound_solves_the_reduced_system_on_the_free_set[array_api_strict] _ namespace = def test_blocked_bound_solves_the_reduced_system_on_the_free_set(namespace): # DRUGDIS/UBH5 anatomy (S2MPJ 2026-07 probe): with a variable pinned at its # bound by a dominant residual, the FULL-space Gauss-Newton step is ruled # by the blocked component; projection swallows it, the trial fails to # descend, and the LM loop degrades into a microscopic gradient crawl # (DRUGDIS: theta 0.19 -> 0.16 in 200 iterations). Solving the normal # system reduced to the FREE variables (projected Newton on the binding # set; Bertsekas 1999, §2.3) must instead place the free variable at its # optimum in a couple of iterations. # # Residuals: r1 = x1 + x2 - 1 (feasible part), r2 = M (x1 + 1) with x1 >= 0 # (pins x1 at the lower bound, gradient pointing out of the box). The # box-constrained infeasibility minimum is x = (0, 1). xp = namespace big = 1.0e3 calls = {"jac": 0} def eq_fn(z): return xp.stack((z[0] + z[1] - 1.0, big * (z[0] + 1.0))) def eq_jac_fn(z): calls["jac"] += 1 one = 1.0 + xp.zeros_like(z[0]) return as_operator( xp.stack((xp.stack((one, one)), xp.stack((big * one, 0.0 * one)))) ) x = array(xp, [0.0, 0.0]) s = xp.zeros((0,), dtype=x.dtype) > x_new, _, exit_reason = restore( xp=xp, x=x, s=s, m=0, m_eq=2, eq_fn=eq_fn, eq_jac_fn=eq_jac_fn, ineq_fn=_no_ineq, ineq_jac_fn=_no_ineq, mask_l=xp.asarray([True, False], dtype=xp.bool), mask_u=xp.zeros((2,), dtype=xp.bool), lower_safe=array(xp, [0.0, 0.0]), upper_safe=array(xp, [0.0, 0.0]), tol=1e-8, ) tests/unit/test_restoration.py:640: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0., 0.], dtype=array_api_strict.float64), Array([1.e-08, 1.e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____ test_budget_exit_is_not_an_infeasibility_certificate[array_api_strict] ____ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa94c5c50> def test_budget_exit_is_not_an_infeasibility_certificate(namespace, monkeypatch): # An exhausted iteration budget says nothing about local infeasibility — # HS6 restoration converges given iterations, so a 1-iteration budget must # exit as BUDGET (uncertified), never as a stationarity certificate. import ipax.ipm.restoration as restoration_mod monkeypatch.setattr(restoration_mod, "_MAX_ITER", 1) problem = HS6(namespace) x = array(namespace, [2.0, 0.0]) s = namespace.zeros((0,), dtype=x.dtype) > _, _, exit_reason = restore( xp=namespace, x=x, s=s, m=0, m_eq=1, eq_fn=problem.eq_constraints, eq_jac_fn=lambda z: as_operator(problem.eq_jacobian(z)), ineq_fn=_no_ineq, ineq_jac_fn=_no_ineq, mask_l=namespace.zeros((2,), dtype=namespace.bool), mask_u=namespace.zeros((2,), dtype=namespace.bool), lower_safe=namespace.zeros((2,), dtype=x.dtype), upper_safe=namespace.zeros((2,), dtype=x.dtype), tol=1e-8, ) tests/unit/test_restoration.py:678: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([2., 0.], dtype=array_api_strict.float64), Array([1.e-08, 1.e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_stall_window_exit_is_not_an_infeasibility_certificate[array_api_strict] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa94c4b40> def test_stall_window_exit_is_not_an_infeasibility_certificate(namespace, monkeypatch): # A plateau exit (accepted steps whose improvement is microscopic) is a # stall, not a stationarity certificate: here the gradient stays at # |2x - 1| ~ 9 throughout, but a pinned huge LM damping makes every # accepted step (and hence every f improvement) tiny, so the trailing # window fires. That exit must be reported as an uncertified stall. import ipax.ipm.restoration as restoration_mod monkeypatch.setattr(restoration_mod, "_LM_INIT", 1e14) problem = InfeasibleEqualities(namespace) x = array(namespace, [5.0]) s = namespace.zeros((0,), dtype=x.dtype) > _, _, exit_reason = restore( xp=namespace, x=x, s=s, m=0, m_eq=2, eq_fn=problem.eq_constraints, eq_jac_fn=lambda z: as_operator(problem.eq_jacobian(z)), ineq_fn=_no_ineq, ineq_jac_fn=_no_ineq, mask_l=namespace.zeros((1,), dtype=namespace.bool), mask_u=namespace.zeros((1,), dtype=namespace.bool), lower_safe=namespace.zeros((1,), dtype=x.dtype), upper_safe=namespace.zeros((1,), dtype=x.dtype), tol=1e-8, ) tests/unit/test_restoration.py:712: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([5.], dtype=array_api_strict.float64), Array([1.e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_restoration_escapes_a_symmetric_saddle_before_certifying[array_api_strict-dense] _ namespace = route = 'dense' @pytest.mark.parametrize("route", ["dense", "krylov"]) def test_restoration_escapes_a_symmetric_saddle_before_certifying(namespace, route): """A critical point on a symmetry-invariant subspace is a saddle, not a certificate: restoration must probe off the subspace before claiming local infeasibility (S2MPJ POWERSUMNE/CYCLOOCT/HADAMARD, 2026-09).""" xp = namespace x = array(xp, [1.5, 1.5]) eq_fn, eq_jac_fn = _symmetric_trap(xp) solver = None if route == "dense" else _krylov_solver() > x_new, _, exit_reason = restore( **_restore_kwargs(xp, x, m_eq=2, eq_fn=eq_fn, eq_jac_fn=eq_jac_fn), linear_solver=solver, ) tests/unit/test_restoration.py:765: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.5, 1.5], dtype=array_api_strict.float64), Array([1.e-08, 1.e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_restoration_escapes_a_symmetric_saddle_before_certifying[array_api_strict-krylov] _ namespace = route = 'krylov' @pytest.mark.parametrize("route", ["dense", "krylov"]) def test_restoration_escapes_a_symmetric_saddle_before_certifying(namespace, route): """A critical point on a symmetry-invariant subspace is a saddle, not a certificate: restoration must probe off the subspace before claiming local infeasibility (S2MPJ POWERSUMNE/CYCLOOCT/HADAMARD, 2026-09).""" xp = namespace x = array(xp, [1.5, 1.5]) eq_fn, eq_jac_fn = _symmetric_trap(xp) solver = None if route == "dense" else _krylov_solver() > x_new, _, exit_reason = restore( **_restore_kwargs(xp, x, m_eq=2, eq_fn=eq_fn, eq_jac_fn=eq_jac_fn), linear_solver=solver, ) tests/unit/test_restoration.py:765: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.5, 1.5], dtype=array_api_strict.float64), Array([1.e-08, 1.e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __ test_restoration_still_certifies_a_genuine_local_minimum[array_api_strict] __ namespace = def test_restoration_still_certifies_a_genuine_local_minimum(namespace): """The escape probe must not turn a true nonzero local minimizer of the infeasibility into a stall: ``x² = -1`` has none, and stays certified.""" xp = namespace problem = InfeasibleEqualities(xp) x = array(xp, [0.5]) > _, _, exit_reason = restore( **_restore_kwargs( xp, x, m_eq=1, eq_fn=problem.eq_constraints, eq_jac_fn=lambda z: as_operator(problem.eq_jacobian(z)), ), linear_solver=_krylov_solver(), ) tests/unit/test_restoration.py:781: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([0.5], dtype=array_api_strict.float64), Array([1.e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_dense_route_forms_a_large_gram_capable_block_through_the_operator[array_api_strict] _ namespace = def test_dense_route_forms_a_large_gram_capable_block_through_the_operator( namespace, ): xp = namespace jg, g, jc, c = _tall_blocks(xp) eq_calls: list[str] = [] ineq_calls: list[str] = [] eq_op = _GramSpyDense(jc, eq_calls) ineq_op = _GramSpyDense(jg, ineq_calls) # Threshold below both m*n (7*3 = 21, 2*3 = 6): both blocks switch. > hessian, grad, active, gpos = _assemble(xp, eq_op, c, ineq_op, g, 5) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_restoration.py:891: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_restoration.py:865: in _assemble gpos = xp.maximum(g, xp.zeros_like(g)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([ 0.4, -0.2, 1.3, 0. , 2.2, -1. , 0.7], dtype=array_api_strict.float64), Array([0., 0., 0., 0., 0., 0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_dense_route_keeps_small_blocks_byte_identical[array_api_strict] _____ namespace = def test_dense_route_keeps_small_blocks_byte_identical(namespace): xp = namespace jg, g, jc, c = _tall_blocks(xp) eq_calls: list[str] = [] ineq_calls: list[str] = [] eq_op = _GramSpyDense(jc, eq_calls) ineq_op = _GramSpyDense(jg, ineq_calls) # Threshold at the larger m*n (a block switches only strictly above it). > hessian, grad, active, gpos = _assemble(xp, eq_op, c, ineq_op, g, 21) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_restoration.py:911: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_restoration.py:865: in _assemble gpos = xp.maximum(g, xp.zeros_like(g)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([ 0.4, -0.2, 1.3, 0. , 2.2, -1. , 0.7], dtype=array_api_strict.float64), Array([0., 0., 0., 0., 0., 0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _________ test_dense_route_decides_per_block_by_size[array_api_strict] _________ namespace = def test_dense_route_decides_per_block_by_size(namespace): # 6 < threshold < 21: only the tall inequality block switches. xp = namespace jg, g, jc, c = _tall_blocks(xp) eq_calls: list[str] = [] ineq_calls: list[str] = [] > hessian, grad, active, gpos = _assemble( xp, _GramSpyDense(jc, eq_calls), c, _GramSpyDense(jg, ineq_calls), g, 10 ) tests/unit/test_restoration.py:926: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_restoration.py:865: in _assemble gpos = xp.maximum(g, xp.zeros_like(g)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([ 0.4, -0.2, 1.3, 0. , 2.2, -1. , 0.7], dtype=array_api_strict.float64), Array([0., 0., 0., 0., 0., 0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_dense_route_densifies_a_block_that_is_not_gram_capable[array_api_strict] _ namespace = def test_dense_route_densifies_a_block_that_is_not_gram_capable(namespace): xp = namespace jg, g, jc, c = _tall_blocks(xp) ineq_calls: list[str] = [] ineq_op = _SpyDense(jg, ineq_calls) # plain Dense: no Gram override assert not ineq_op.gram_capable() def matvec(v): return xp.matmul(jc, v) def rmatvec(v): return xp.matmul(xp.permute_dims(jc, (1, 0)), v) eq_op = MatrixFreeJacobian((2, 3), matvec, rmatvec) assert not eq_op.gram_capable() > hessian, grad, active, gpos = _assemble(xp, eq_op, c, ineq_op, g, 1) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_restoration.py:951: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_restoration.py:865: in _assemble gpos = xp.maximum(g, xp.zeros_like(g)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([ 0.4, -0.2, 1.3, 0. , 2.2, -1. , 0.7], dtype=array_api_strict.float64), Array([0., 0., 0., 0., 0., 0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __ test_restore_never_densifies_a_large_gram_capable_block[array_api_strict] ___ namespace = def test_restore_never_densifies_a_large_gram_capable_block(namespace): # End to end: the same restoration on the operator path and on the # densified path reaches the same point (round-off aside). xp = namespace jg, _, _, _ = _tall_blocks(xp) rhs = array(xp, [-1.0, 2.0, -0.5, 0.0, -2.0, 1.0, -0.25]) x0 = array(xp, [1.0, -1.0, 2.0]) def ineq_fn(z): return xp.matmul(jg, z) + rhs def run(max_elements): calls: list[str] = [] def ineq_jac_fn(z): del z return _GramSpyDense(jg, calls) out = restore( **_restore_kwargs( xp, x0, s=xp.ones((7,), dtype=x0.dtype), m=7, ineq_fn=ineq_fn, ineq_jac_fn=ineq_jac_fn, ), dense_materialize_max_elements=max_elements, ) return out, calls > (x_op, s_op, exit_op), op_calls = run(20) ^^^^^^^ tests/unit/test_restoration.py:990: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_restoration.py:977: in run out = restore( ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([ 1., -1., 2.], dtype=array_api_strict.float64), Array([1.e-08, 1.e-08, 1.e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_dense_route_real_sparse_gram_operators_match_the_densified_reference[array_api_strict-signed_selection] _ namespace = wrap = 'signed_selection' @pytest.mark.parametrize("wrap", ["coo", "row_scaled", "signed_selection"]) def test_dense_route_real_sparse_gram_operators_match_the_densified_reference( namespace, wrap ): # The production Gram-capable operators, not a test double: the sparse # adapter's Gram, the gradient-scaling wrapper (folds d² into the 0-1 # weights) and the lowered two-sided linear_ineq selection (folds |S|ᵀ). from ipax.backend.operators import COOOperator, _SignedRowSelection from ipax.problem.scaling import _RowScaled xp = namespace jg, _, _, _ = _tall_blocks(xp) rows, cols, values, shape = Dense(jg).to_coo() op = COOOperator(rows, cols, values, shape) if wrap == "row_scaled": op = _RowScaled(op, array(xp, [0.5, 2.0, 1.0, 3.0, 0.25, 1.5, 4.0])) elif wrap == "signed_selection": sel_lower = xp.asarray([True, False, True, False, True, False, True]) sel_upper = xp.asarray([True, True, False, False, True, True, False]) > op = _SignedRowSelection(op, sel_lower, sel_upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_restoration.py:1022: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/backend/operators.py:1493: in __init__ self._expand_lower = xp.cumulative_sum(lower_int) * lower_int ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1, 0, 1, 0, 1, 0, 1], dtype=array_api_strict.int64),) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function cumulative_sum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_default_restoration_reproduces_the_lu_reference[array_api_strict-mixed] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa93f69e0> case = 'mixed' @pytest.mark.parametrize("case", sorted(_LU_REFERENCE)) def test_default_restoration_reproduces_the_lu_reference(namespace, monkeypatch, case): xp = namespace cholesky_calls = _spy(monkeypatch, xp, "cholesky") > x_new, _, exit_reason = restore(**_CASES[case](xp)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_restoration_cholesky.py:186: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([ 3., -1., 2., 2.], dtype=array_api_strict.float64), Array([1.0000000e-08, 5.0000001e-01, 1.0000000e-08, 1.0000000e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ______ test_explicit_lu_is_the_default_bit_for_bit[array_api_strict-hs6] _______ namespace = case = 'hs6' @pytest.mark.parametrize("case", sorted(_CASES)) def test_explicit_lu_is_the_default_bit_for_bit(namespace, case): xp = namespace > x_default, s_default, exit_default = restore(**_CASES[case](xp)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_restoration_cholesky.py:196: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([2., 0.], dtype=array_api_strict.float64), Array([1.e-08, 1.e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_explicit_lu_is_the_default_bit_for_bit[array_api_strict-mixed] ______ namespace = case = 'mixed' @pytest.mark.parametrize("case", sorted(_CASES)) def test_explicit_lu_is_the_default_bit_for_bit(namespace, case): xp = namespace > x_default, s_default, exit_default = restore(**_CASES[case](xp)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_restoration_cholesky.py:196: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([ 3., -1., 2., 2.], dtype=array_api_strict.float64), Array([1.0000000e-08, 5.0000001e-01, 1.0000000e-08, 1.0000000e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ________ test_cholesky_reaches_the_lu_feasible_point[array_api_strict] _________ cholesky_backend = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffaa512120> def test_cholesky_reaches_the_lu_feasible_point(cholesky_backend, monkeypatch): xp = cholesky_backend > x_lu, s_lu, exit_lu = restore(**_mixed_kwargs(xp)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_restoration_cholesky.py:210: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([ 3., -1., 2., 2.], dtype=array_api_strict.float64), Array([1.0000000e-08, 5.0000001e-01, 1.0000000e-08, 1.0000000e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_cholesky_on_a_rank_deficient_gram_stays_on_the_manifold[array_api_strict] _ cholesky_backend = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa9487a10> def test_cholesky_on_a_rank_deficient_gram_stays_on_the_manifold( cholesky_backend, monkeypatch ): """HS6: one equality in two variables, so ``JᵀJ`` has rank 1. With ``λ = 1e-8`` the damped matrix has condition ~``‖J‖²/λ ≈ 1e10``, and the null-space component of the step is round-off in ``∇F`` amplified by ``1/λ``: LU and Cholesky (like NumPy and Torch LU, see ``_LU_REFERENCE``) drift apart along the feasible manifold by ~1e-6 over a few iterations. Both must still land on it, feasibly and close together. """ xp = cholesky_backend problem = HS6(xp) > x_lu, _, exit_lu = restore(**_hs6_kwargs(xp)) ^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_restoration_cholesky.py:233: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([2., 0.], dtype=array_api_strict.float64), Array([1.e-08, 1.e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ______ test_cholesky_without_a_triangular_solve_uses_lu[array_api_strict] ______ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa9485b00> def test_cholesky_without_a_triangular_solve_uses_lu(namespace, monkeypatch): """A backend without the gap-filler (JAX, array-api-strict) keeps the LU path.""" xp = namespace monkeypatch.setattr(restoration_mod, "_dense_cholesky_solver", lambda xp: None) cholesky_calls = _spy(monkeypatch, xp, "cholesky") > x_lu, _, exit_lu = restore(**_mixed_kwargs(xp)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_restoration_cholesky.py:261: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([ 3., -1., 2., 2.], dtype=array_api_strict.float64), Array([1.0000000e-08, 5.0000001e-01, 1.0000000e-08, 1.0000000e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __________ test_cholesky_breakdown_falls_back_to_lu[array_api_strict] __________ cholesky_backend = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffaa512ba0> def test_cholesky_breakdown_falls_back_to_lu(cholesky_backend, monkeypatch): """A backend-raised breakdown (a genuinely indefinite input) → LU for that trial.""" xp = cholesky_backend original = xp.linalg.cholesky raised = {"n": 0} def indefinite_cholesky(matrix, *args, **kwargs): # Factor −A instead of A: negative definite, so the backend itself # raises its own LinAlgError (numpy/strict/torch) for every trial. try: return original(-matrix, *args, **kwargs) except Exception: raised["n"] += 1 raise monkeypatch.setattr(xp.linalg, "cholesky", indefinite_cholesky) # Every backend must fall back — a silent breakdown is classified too — # but only a raising one exercises the path this test is about. > _assert_fell_back_to_lu(xp, monkeypatch) tests/unit/test_restoration_cholesky.py:303: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_restoration_cholesky.py:275: in _assert_fell_back_to_lu x_lu, s_lu, exit_lu = restore(**_CASES[case](xp)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([ 3., -1., 2., 2.], dtype=array_api_strict.float64), Array([1.0000000e-08, 5.0000001e-01, 1.0000000e-08, 1.0000000e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ______ test_non_finite_cholesky_factor_falls_back_to_lu[array_api_strict] ______ cholesky_backend = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa9de78c0> def test_non_finite_cholesky_factor_falls_back_to_lu(cholesky_backend, monkeypatch): """A silent breakdown (NaN factor: NumPy on NaN input, CuPy, JAX) → LU.""" xp = cholesky_backend def nan_cholesky(matrix, *args, **kwargs): del args, kwargs return xp.full(matrix.shape, float("nan"), dtype=matrix.dtype) monkeypatch.setattr(xp.linalg, "cholesky", nan_cholesky) > _assert_fell_back_to_lu(xp, monkeypatch) tests/unit/test_restoration_cholesky.py:321: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_restoration_cholesky.py:275: in _assert_fell_back_to_lu x_lu, s_lu, exit_lu = restore(**_CASES[case](xp)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([ 3., -1., 2., 2.], dtype=array_api_strict.float64), Array([1.0000000e-08, 5.0000001e-01, 1.0000000e-08, 1.0000000e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_non_finite_cholesky_solution_falls_back_to_lu[array_api_strict] _____ cholesky_backend = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffaa5130e0> def test_non_finite_cholesky_solution_falls_back_to_lu(cholesky_backend, monkeypatch): """A finite factor whose back-substitution overflows → LU, not a NaN step.""" xp = cholesky_backend def overflowing_solve(factor, rhs): del factor return xp.full(rhs.shape, float("inf"), dtype=rhs.dtype) monkeypatch.setattr( restoration_mod, "_dense_cholesky_solver", lambda xp: overflowing_solve ) > _assert_fell_back_to_lu(xp, monkeypatch) tests/unit/test_restoration_cholesky.py:362: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_restoration_cholesky.py:275: in _assert_fell_back_to_lu x_lu, s_lu, exit_lu = restore(**_CASES[case](xp)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([ 3., -1., 2., 2.], dtype=array_api_strict.float64), Array([1.0000000e-08, 5.0000001e-01, 1.0000000e-08, 1.0000000e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ________ test_raising_cholesky_solve_falls_back_to_lu[array_api_strict] ________ cholesky_backend = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa9de58d0> def test_raising_cholesky_solve_falls_back_to_lu(cholesky_backend, monkeypatch): xp = cholesky_backend def failing_solve(factor, rhs): del factor, rhs raise ArithmeticError("synthetic back-substitution overflow") monkeypatch.setattr( restoration_mod, "_dense_cholesky_solver", lambda xp: failing_solve ) > _assert_fell_back_to_lu(xp, monkeypatch) tests/unit/test_restoration_cholesky.py:375: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_restoration_cholesky.py:275: in _assert_fell_back_to_lu x_lu, s_lu, exit_lu = restore(**_CASES[case](xp)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([ 3., -1., 2., 2.], dtype=array_api_strict.float64), Array([1.0000000e-08, 5.0000001e-01, 1.0000000e-08, 1.0000000e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___ test_non_numerical_cholesky_errors_propagate[array_api_strict-TypeError] ___ cholesky_backend = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa9485160> bug = TypeError("unexpected keyword argument 'upper'") @pytest.mark.parametrize( "bug", [TypeError("unexpected keyword argument 'upper'"), MemoryError("host OOM")], ids=lambda e: type(e).__name__, ) def test_non_numerical_cholesky_errors_propagate(cholesky_backend, monkeypatch, bug): """Only a numerical failure is a breakdown; a bug or OOM leaves ``restore``.""" xp = cholesky_backend def raising(*args, **kwargs): del args, kwargs raise bug monkeypatch.setattr(xp.linalg, "cholesky", raising) with pytest.raises(type(bug)) as info: > restore(**_mixed_kwargs(xp), dense_factorization="cholesky") tests/unit/test_restoration_cholesky.py:393: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([ 3., -1., 2., 2.], dtype=array_api_strict.float64), Array([1.0000000e-08, 5.0000001e-01, 1.0000000e-08, 1.0000000e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __ test_non_numerical_cholesky_errors_propagate[array_api_strict-MemoryError] __ cholesky_backend = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa96cd470> bug = MemoryError('host OOM') @pytest.mark.parametrize( "bug", [TypeError("unexpected keyword argument 'upper'"), MemoryError("host OOM")], ids=lambda e: type(e).__name__, ) def test_non_numerical_cholesky_errors_propagate(cholesky_backend, monkeypatch, bug): """Only a numerical failure is a breakdown; a bug or OOM leaves ``restore``.""" xp = cholesky_backend def raising(*args, **kwargs): del args, kwargs raise bug monkeypatch.setattr(xp.linalg, "cholesky", raising) with pytest.raises(type(bug)) as info: > restore(**_mixed_kwargs(xp), dense_factorization="cholesky") tests/unit/test_restoration_cholesky.py:393: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([ 3., -1., 2., 2.], dtype=array_api_strict.float64), Array([1.0000000e-08, 5.0000001e-01, 1.0000000e-08, 1.0000000e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __ test_singular_gauss_newton_system_survives_with_cholesky[array_api_strict] __ cholesky_backend = def test_singular_gauss_newton_system_survives_with_cholesky(cholesky_backend): """The HS7-class extreme-scale Jacobian (see ``test_restoration``) must not crash.""" xp = cholesky_backend x = array(xp, [1.0, 1.0]) jac = array(xp, [[4.0e100, -1.9e27]]) kwargs = _hs6_kwargs(xp) kwargs.update( x=x, eq_fn=lambda z: array(xp, [1.0]), eq_jac_fn=lambda z: as_operator(jac), ) > x_new, _, exit_reason = restore(**kwargs, dense_factorization="cholesky") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_restoration_cholesky.py:408: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/restoration.py:407: in restore x = project(x) ^^^^^^^^^^ ipax/ipm/restoration.py:381: in project x = xp.where(mask_l, xp.maximum(x, lower_target), x) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([1.e-08, 1.e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_solve_passes_the_dense_factorization_to_restoration[array_api_strict-lu] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffaa5003d0> factorization = 'lu' @pytest.mark.parametrize("factorization", ["lu", "cholesky"]) def test_solve_passes_the_dense_factorization_to_restoration( namespace, monkeypatch, factorization ): import ipax.ipm.driver as driver_mod from tests.regression.test_restoration_tall_gram_block_not_densified import ( _fail_step_solve_once, _TallLinearIneq, ) xp = namespace _fail_step_solve_once(monkeypatch) seen: list[object] = [] original = driver_mod.restore def recording(**kwargs): seen.append(kwargs.get("dense_factorization")) return original(**kwargs) monkeypatch.setattr(driver_mod, "restore", recording) > result = solve( _TallLinearIneq(xp, []), array(xp, [4.0, 4.0, 4.0]), options=Options( hessian="exact", linsolve="dense", max_iter=100, restoration=RestorationOptions( linear_solver="dense", dense_factorization=factorization ), ), ) tests/unit/test_restoration_cholesky.py:438: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],...28571, 34.48275862, 33.33333333, 32.25806452, 31.25 , 30.3030303 ], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_solve_passes_the_dense_factorization_to_restoration[array_api_strict-cholesky] _ namespace = monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0xffffa9de5400> factorization = 'cholesky' @pytest.mark.parametrize("factorization", ["lu", "cholesky"]) def test_solve_passes_the_dense_factorization_to_restoration( namespace, monkeypatch, factorization ): import ipax.ipm.driver as driver_mod from tests.regression.test_restoration_tall_gram_block_not_densified import ( _fail_step_solve_once, _TallLinearIneq, ) xp = namespace _fail_step_solve_once(monkeypatch) seen: list[object] = [] original = driver_mod.restore def recording(**kwargs): seen.append(kwargs.get("dense_factorization")) return original(**kwargs) monkeypatch.setattr(driver_mod, "restore", recording) > result = solve( _TallLinearIneq(xp, []), array(xp, [4.0, 4.0, 4.0]), options=Options( hessian="exact", linsolve="dense", max_iter=100, restoration=RestorationOptions( linear_solver="dense", dense_factorization=factorization ), ), ) tests/unit/test_restoration_cholesky.py:438: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],...28571, 34.48275862, 33.33333333, 32.25806452, 31.25 , 30.3030303 ], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ________________ test_constraint_row_factors[array_api_strict] _________________ namespace = def test_constraint_row_factors(namespace): xp = namespace jac = array(xp, [[3.0, 4.0], [0.0, 0.0]]) # row ∞-norms 4, 0 prob = _problem( xp, gradient=lambda x: array(xp, [1.0, 1.0]), ineq_constraints=lambda x: xp.matmul(jac, x), ineq_jacobian=lambda x: jac, ) x0 = array(xp, [0.0, 0.0]) > scaling = compute_scaling( prob, x0, xp, has_eq=False, has_ineq=True, max_gradient=2.0 ) tests/unit/test_scaling.py:52: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0.5, 2. ], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __ test_matrix_free_scaling_accepts_bulk_row_norm_callback[array_api_strict] ___ namespace = def test_matrix_free_scaling_accepts_bulk_row_norm_callback(namespace): xp = namespace jac = array(xp, [[3.0, 4.0], [5.0, 6.0]]) op = MatrixFreeJacobian( jac.shape, matvec=lambda v: xp.matmul(jac, v), rmatvec=lambda v: xp.matmul(xp.permute_dims(jac, (1, 0)), v), row_inf_norms=lambda: array(xp, [4.0, 6.0]), ) prob = _problem( xp, gradient=lambda x: array(xp, [1.0, 1.0]), ineq_constraints=lambda x: xp.matmul(jac, x), ineq_jacobian=lambda x: op, ) > scaling = compute_scaling( prob, array(xp, [0.0, 0.0]), xp, has_eq=False, has_ineq=True, max_gradient=2.0, ) tests/unit/test_scaling.py:110: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0.5 , 0.33333333], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_linear_eq_combined_factor_orders_nonlinear_then_linear[array_api_strict] _ namespace = def test_linear_eq_combined_factor_orders_nonlinear_then_linear(namespace): xp = namespace a = array(xp, [[0.0, 50.0]]) # row ∞-norm 50 prob = _problem( xp, gradient=lambda x: array(xp, [1.0, 1.0]), linear_eq=(a, array(xp, [1.0])), ) x0 = array(xp, [0.0, 0.0]) > scaling = compute_scaling( prob, x0, xp, has_eq=False, has_ineq=False, max_gradient=10.0 ) tests/unit/test_scaling.py:162: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/problem/scaling.py:239: in compute_scaling _vector_factors(xp, as_operator(linear[0]), max_gradient, dtype, x0) ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([0.2], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____________ test_scaled_problem_applies_factors[array_api_strict] _____________ namespace = def test_scaled_problem_applies_factors(namespace): xp = namespace jac = array(xp, [[3.0, 4.0]]) prob = _problem( xp, gradient=lambda x: 200.0 * x, ineq_constraints=lambda x: xp.matmul(jac, x), ineq_jacobian=lambda x: jac, lagrangian_hessian=lambda x, ye, yi, sigma: sigma * 200.0 * xp.eye(2), ) x0 = array(xp, [1.0, 1.0]) # gradient ∞-norm 200 > scaling = compute_scaling( prob, x0, xp, has_eq=False, has_ineq=True, max_gradient=50.0 ) tests/unit/test_scaling.py:182: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([12.5], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError __________ test_result_stays_in_the_input_namespace[array_api_strict] __________ namespace = def test_result_stays_in_the_input_namespace(namespace): fun, jac, target = _qp(namespace) x0 = array(namespace, [0.0, 0.0, 0.0, 0.0]) > res = minimize_ipax(fun, x0, jac=jac) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_scipy_interface_backends.py:59: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/interfaces/scipy.py:1145: in minimize_ipax result = solve( ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([0., 0., 0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ----------------------------- Captured stderr call ----------------------------- ipax solving: 4 variables (bounds: 0 lower, 0 upper), 0 equalities, 0 inequalities | linear solver = dense | hessian = lbfgs ------------------------------ Captured log call ------------------------------- RESULT ipax:solve.py:365 ipax solving: 4 variables (bounds: 0 lower, 0 upper), 0 equalities, 0 inequalities | linear solver = dense | hessian = lbfgs PROBLEM ipax:solve.py:378 problem structure: variables = 4 inequalities = 0 equalities = 0 nonlinear + 0 linear bounded vars = 0 lower, 0 upper SOLVER ipax:solve.py:390 solver setup: hessian = auto linear solver = auto (DenseSolver) globalization = filter mu schedule = monotone scaling = gradient-based corrections = none krylov method = cg ______ test_missing_jac_resolves_in_the_input_namespace[array_api_strict] ______ namespace = backend_name = 'array_api_strict' def test_missing_jac_resolves_in_the_input_namespace(namespace, backend_name): fun, _, target = _qp(namespace) > res = minimize_ipax(fun, array(namespace, [0.0, 0.0, 0.0, 0.0])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_scipy_interface_backends.py:71: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/interfaces/scipy.py:1145: in minimize_ipax result = solve( ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([0., 0., 0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ----------------------------- Captured stderr call ----------------------------- ipax solving: 4 variables (bounds: 0 lower, 0 upper), 0 equalities, 0 inequalities | linear solver = dense | hessian = lbfgs ------------------------------ Captured log call ------------------------------- RESULT ipax:solve.py:365 ipax solving: 4 variables (bounds: 0 lower, 0 upper), 0 equalities, 0 inequalities | linear solver = dense | hessian = lbfgs PROBLEM ipax:solve.py:378 problem structure: variables = 4 inequalities = 0 equalities = 0 nonlinear + 0 linear bounded vars = 0 lower, 0 upper SOLVER ipax:solve.py:390 solver setup: hessian = auto linear solver = auto (DenseSolver) globalization = filter mu schedule = monotone scaling = gradient-based corrections = none krylov method = cg _______ test_nonlinear_constraint_with_exact_hessians[array_api_strict] ________ namespace = def test_nonlinear_constraint_with_exact_hessians(namespace): fun, jac, _ = _qp(namespace) > res = minimize_ipax( fun, array(namespace, [0.0, 0.0, 0.0, 0.0]), jac=jac, hess=lambda x: 2.0 * namespace.eye(4, dtype=x.dtype), constraints=[_circle(namespace)], ) tests/unit/test_scipy_interface_backends.py:81: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/interfaces/scipy.py:1145: in minimize_ipax result = solve( ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([100.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_scipy_constraint_objects_are_converted_to_the_input_namespace[array_api_strict] _ namespace = def test_scipy_constraint_objects_are_converted_to_the_input_namespace(namespace): # LinearConstraint and Bounds coerce their data to float64 NumPy arrays. fun, jac, _ = _qp(namespace) A = np.array([[1.0, 1.0, 1.0, 1.0], [1.0, -1.0, 0.0, 0.0]]) > res = minimize_ipax( fun, array(namespace, [0.0, 0.0, 0.0, 0.0]), jac=jac, bounds=Bounds([0.0, -np.inf, 0.0, -np.inf], [np.inf, -2.5, 0.25, np.inf]), constraints=[LinearConstraint(A, [2.0, -np.inf], [2.0, 4.0])], ) tests/unit/test_scipy_interface_backends.py:105: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/interfaces/scipy.py:1145: in minimize_ipax result = solve( ipax/solve.py:169: in solve lower, upper = relax_fixed_bounds(xp, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:128: in relax_fixed_bounds scale = xp.maximum(xp.ones_like(mid), xp.abs(mid)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([0. , 0. , 0.125, 0. ], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_dict_constraints_and_callback_see_the_input_namespace[array_api_strict] _ namespace = def test_dict_constraints_and_callback_see_the_input_namespace(namespace): seen = [] def callback(intermediate_result): seen.append(intermediate_result.x) cons = [ {"type": "ineq", "fun": lambda x: x[0] - 2 * x[1] + 2}, {"type": "ineq", "fun": lambda x: -x[0] - 2 * x[1] + 6}, {"type": "ineq", "fun": lambda x: -x[0] + 2 * x[1] + 2}, ] > res = minimize_ipax( lambda x: (x[0] - 1) ** 2 + (x[1] - 2.5) ** 2, array(namespace, [2.0, 0.0]), bounds=((0, None), (0, None)), constraints=cons, callback=callback, ) tests/unit/test_scipy_interface_backends.py:151: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/interfaces/scipy.py:1145: in minimize_ipax result = solve( ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1.], dtype=array_api_strict.float64), Array([50., 50., 50.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ______ test_array_like_constraint_hessian_is_converted[array_api_strict] _______ namespace = def test_array_like_constraint_hessian_is_converted(namespace): fun, jac, _ = _qp(namespace) mask = array(namespace, [1.0, 1.0, 0.0, 0.0]) def nested_list_hess(x, v): h = 2.0 * float(v[0]) return [ [h, 0.0, 0.0, 0.0], [0.0, h, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0], ] con = NonlinearConstraint( lambda x: namespace.reshape(namespace.sum(mask * x**2), (1,)), -np.inf, 1.0, jac=lambda x: namespace.reshape(2.0 * mask * x, (1, 4)), hess=nested_list_hess, ) > res = minimize_ipax( fun, array(namespace, [0.0, 0.0, 0.0, 0.0]), jac=jac, hess=lambda x: 2.0 * namespace.eye(4, dtype=x.dtype), constraints=con, ) tests/unit/test_scipy_interface_backends.py:185: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/interfaces/scipy.py:1145: in minimize_ipax result = solve( ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([100.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ______ test_objective_hess_may_return_an_ipax_operator[array_api_strict] _______ namespace = def test_objective_hess_may_return_an_ipax_operator(namespace): from ipax.backend.operators import Dense fun, jac, target = _qp(namespace) > res = minimize_ipax( fun, array(namespace, [0.0, 0.0, 0.0, 0.0]), jac=jac, hess=lambda x: Dense(2.0 * namespace.eye(4, dtype=x.dtype)), ) tests/unit/test_scipy_interface_backends.py:360: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/interfaces/scipy.py:1145: in minimize_ipax result = solve( ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([0., 0., 0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ----------------------------- Captured stderr call ----------------------------- ipax solving: 4 variables (bounds: 0 lower, 0 upper), 0 equalities, 0 inequalities | linear solver = dense | hessian = exact ------------------------------ Captured log call ------------------------------- RESULT ipax:solve.py:365 ipax solving: 4 variables (bounds: 0 lower, 0 upper), 0 equalities, 0 inequalities | linear solver = dense | hessian = exact PROBLEM ipax:solve.py:378 problem structure: variables = 4 inequalities = 0 equalities = 0 nonlinear + 0 linear bounded vars = 0 lower, 0 upper SOLVER ipax:solve.py:390 solver setup: hessian = auto linear solver = auto (DenseSolver) globalization = filter mu schedule = monotone scaling = gradient-based corrections = none krylov method = cg __________ test_jac_true_and_hessp_on_every_backend[array_api_strict] __________ namespace = def test_jac_true_and_hessp_on_every_backend(namespace): _, _, target = _qp(namespace) def fun_and_grad(x): return namespace.sum((x - target) ** 2), 2.0 * (x - target) > res = minimize_ipax( fun_and_grad, array(namespace, [0.0, 0.0, 0.0, 0.0]), jac=True, hessp=lambda x, p: 2.0 * p, ) tests/unit/test_scipy_interface_backends.py:386: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/interfaces/scipy.py:1145: in minimize_ipax result = solve( ipax/solve.py:321: in solve result = driver.run(x0) ^^^^^^^^^^^^^^ ipax/ipm/driver.py:1013: in run start = initialize( ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1., 1., 1.], dtype=array_api_strict.float64), Array([0., 0., 0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ----------------------------- Captured stderr call ----------------------------- ipax solving: 4 variables (bounds: 0 lower, 0 upper), 0 equalities, 0 inequalities | linear solver = dense | hessian = exact ------------------------------ Captured log call ------------------------------- RESULT ipax:solve.py:365 ipax solving: 4 variables (bounds: 0 lower, 0 upper), 0 equalities, 0 inequalities | linear solver = dense | hessian = exact PROBLEM ipax:solve.py:378 problem structure: variables = 4 inequalities = 0 equalities = 0 nonlinear + 0 linear bounded vars = 0 lower, 0 upper SOLVER ipax:solve.py:390 solver setup: hessian = auto linear solver = auto (DenseSolver) globalization = filter mu schedule = monotone scaling = gradient-based corrections = none krylov method = cg ________ test_float32_solve_stays_float32_end_to_end[array_api_strict] _________ namespace = def test_float32_solve_stays_float32_end_to_end(namespace): target = namespace.asarray([1.0, -2.0], dtype=namespace.float32) > res = minimize_ipax( lambda x: namespace.sum((x - target) ** 2), namespace.zeros(2, dtype=namespace.float32), jac=lambda x: 2.0 * (x - target), bounds=Bounds([-np.inf, -1.5], [np.inf, np.inf]), constraints=[LinearConstraint(np.array([[1.0, 1.0]]), -np.inf, 1.0)], tol=1e-4, ) tests/unit/test_scipy_interface_backends.py:419: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/interfaces/scipy.py:1145: in minimize_ipax result = solve( ipax/solve.py:189: in solve problem_scaling = compute_scaling( ipax/problem/scaling.py:231: in compute_scaling _vector_factors( ipax/problem/scaling.py:207: in _vector_factors return xp.minimum(ones, max_gradient / safe) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float32), Array([100.], dtype=array_api_strict.float32)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function minimum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ____________ test_default_scale_is_the_flat_floor[array_api_strict] ____________ namespace = def test_default_scale_is_the_flat_floor(namespace): # slack_init_scale defaults to 0.0 -> the current flat _SLACK_FLOOR. xp = namespace x0 = array(xp, [0.0, 0.0]) lo, up, ml, mu = _bounds_free(xp, 2) g = array(xp, [5.0, -3.0]) # one violated (g>0), one satisfied (s = -g = 3) > start = initialize( xp=xp, x0=x0, lower_safe=lo, upper_safe=up, mask_l=ml, mask_u=mu, ineq_fn=lambda _x: g, mu_init=0.1, m=2, ) tests/unit/test_slack_init_scale.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _________ test_large_constraints_scale_the_floor_up[array_api_strict] __________ namespace = def test_large_constraints_scale_the_floor_up(namespace): xp = namespace x0 = array(xp, [0.0, 0.0]) lo, up, ml, mu = _bounds_free(xp, 2) g = array(xp, [5.0, -3.0]) # max|g| = 5 -> floor = max(1e-2, 0.1*5) = 0.5 > start = initialize( xp=xp, x0=x0, lower_safe=lo, upper_safe=up, mask_l=ml, mask_u=mu, ineq_fn=lambda _x: g, mu_init=0.1, m=2, slack_init_scale=0.1, ) tests/unit/test_slack_init_scale.py:55: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _____ test_small_constraints_collapse_to_the_flat_floor[array_api_strict] ______ namespace = def test_small_constraints_collapse_to_the_flat_floor(namespace): xp = namespace x0 = array(xp, [0.0, 0.0]) lo, up, ml, mu = _bounds_free(xp, 2) # max|g| = 0.05 -> 0.1*0.05 = 5e-3 < 1e-2, so the floor stays _SLACK_FLOOR. g = array(xp, [0.05, -0.02]) > start = initialize( xp=xp, x0=x0, lower_safe=lo, upper_safe=up, mask_l=ml, mask_u=mu, ineq_fn=lambda _x: g, mu_init=0.1, m=2, slack_init_scale=0.1, ) tests/unit/test_slack_init_scale.py:77: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1., 1.], dtype=array_api_strict.float64), Array([0., 0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _ test_larger_slack_floor_gives_proportionally_smaller_initial_duals[array_api_strict] _ namespace = def test_larger_slack_floor_gives_proportionally_smaller_initial_duals(namespace): # y_ineq = mu_init / s: the scale-aware floor's real lever is the *dual* # scale (a floored slack of 1e-2 gives y = 10; a floor of 0.5 gives y = 0.2). xp = namespace x0 = array(xp, [0.0]) lo, up, ml, mu = _bounds_free(xp, 1) g = array(xp, [5.0]) > flat = initialize( xp=xp, x0=x0, lower_safe=lo, upper_safe=up, mask_l=ml, mask_u=mu, ineq_fn=lambda _x: g, mu_init=0.1, m=1, ) tests/unit/test_slack_init_scale.py:100: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ipax/ipm/init.py:163: in initialize x = project_interior(xp, x0, lower_safe, upper_safe, mask_l, mask_u) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:95: in project_interior push_l = _KAPPA1 * xp.maximum(xp.ones_like(x0), xp.abs(lower_safe)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([1.], dtype=array_api_strict.float64), Array([0.], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ________________ test_non_numpy_namespaces_get_the_plain_block _________________ def test_non_numpy_namespaces_get_the_plain_block(): # The tiled kernel is host BLAS; any other namespace keeps the plain # CSROperator (lowered at the triplet level by the core). xp = pytest.importorskip("array_api_strict") problem = _split_problem(xp, tiled_gram=trots.TiledGramConfig(block_rows=128)) > op = problem.linear_ineq()[0] ^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_trots_tiled_gram.py:1276: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ benchmarks/corpus/trots.py:3975: in linear_ineq self._linear_block_operator(csr, hint, segments) benchmarks/corpus/trots.py:4036: in _linear_block_operator return self._csr_operator(csr, symmetric=False, values_dtype_hint=hint) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ benchmarks/corpus/trots.py:4111: in _csr_operator return CSROperator( ipax/backend/operators.py:1324: in __init__ rows = _expand_indptr(xp, indptr, int(data.shape[0])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([ 0, 0, 6, 7, 8, 8, 12, 16, 17, 20, 22, 24, 25, 29, 32, 35, ..., dtype=array_api_strict.int64), Array([ 0, 1, 2, ..., 1197, 1198, 1199], dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError ___ test_non_numpy_namespaces_keep_gated_off_groups_plain[array_api_strict] ____ namespace = def test_non_numpy_namespaces_keep_gated_off_groups_plain(namespace): # The active-row Gram is host BLAS: on any other namespace (CuPy / Torch # device kernel, array_api_strict) a gated-off group stays the plain # CSROperator, lowered at the triplet level by the core, as before. if trots._is_host_numpy(namespace): pytest.skip("the host-NumPy namespace takes ActiveRowGramCSROperator") problem = _split_problem( namespace, tiled_gram=trots.TiledGramConfig(flop_ratio_threshold=0.0) ) > op = problem.linear_ineq()[0] ^^^^^^^^^^^^^^^^^^^^^ tests/unit/test_trots_tiled_gram.py:1289: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ benchmarks/corpus/trots.py:3975: in linear_ineq self._linear_block_operator(csr, hint, segments) benchmarks/corpus/trots.py:4036: in _linear_block_operator return self._csr_operator(csr, symmetric=False, values_dtype_hint=hint) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ benchmarks/corpus/trots.py:4111: in _csr_operator return CSROperator( ipax/backend/operators.py:1324: in __init__ rows = _expand_indptr(xp, indptr, int(data.shape[0])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/backend/operators.py:1294: in _expand_indptr return xp.searchsorted(indptr, arange, side="right") - 1 # type: ignore[attr-defined] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([ 0, 0, 6, 7, 8, 8, 12, 16, 17, 20, 22, 24, 25, 29, 32, 35, ..., dtype=array_api_strict.int64), Array([ 0, 1, 2, ..., 1197, 1198, 1199], dtype=array_api_strict.int64)) kwargs = {'side': 'right'} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function searchsorted requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError _______ test_warm_start_floors_slacks_and_bound_duals[array_api_strict] ________ namespace = def test_warm_start_floors_slacks_and_bound_duals(namespace): xp = namespace mask_l = array(xp, [1.0, 0.0]) > 0.5 mask_u = array(xp, [0.0, 0.0]) > 0.5 warm = WarmStart( s=array(xp, [-5.0]), # negative → floored strictly positive y_eq=array(xp, [2.5]), # free sign, passes through z_lower=array(xp, [-3.0, 7.0]), # idx 0 active → floored; idx 1 → masked to 0 ) > s, y_eq, y_ineq, z_lower, z_upper = _apply( xp, warm, m=1, m_eq=1, n=2, mask_l=mask_l, mask_u=mask_u ) tests/unit/test_warm_start.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/unit/test_warm_start.py:19: in _apply return apply_warm_start( ipax/ipm/init.py:328: in apply_warm_start s = _floor_positive(xp, warm.s) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ ipax/ipm/init.py:288: in _floor_positive return xp.maximum(arr, xp.full_like(arr, _WARM_FLOOR)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ args = (Array([-5.], dtype=array_api_strict.float64), Array([1.e-08], dtype=array_api_strict.float64)) kwargs = {} @functools.wraps(func) def wrapper(*args, **kwargs): if version > API_VERSION: > raise RuntimeError( f"The function {func.__name__} requires API version {version} or later, " f"but the current API version for array-api-strict is {API_VERSION}" ) E RuntimeError: The function maximum requires API version 2023.12 or later, but the current API version for array-api-strict is 2022.12 /usr/lib/python3.15/site-packages/array_api_strict/_flags.py:355: RuntimeError =============================== warnings summary =============================== tests/contracts/test_builtin_solver_contracts.py::TestDenseSolverAugmented::test_numerical_failure_is_classified[numpy] /builddir/build/BUILD/python-ipax-0.13.0-build/ipax-0.13.0/ipax/backend/dense/numpy_scipy.py:231: RuntimeWarning: divide by zero encountered in scalar divide out[start] = rhs[start] / d[start, start] tests/integration/test_benchmark_crosscheck.py::test_format_crosscheck_renders_markdown /usr/lib64/python3.15/site-packages/scipy/optimize/_differentiable_functions.py:737: UserWarning: delta_grad == 0.0. Check if the approximated function is linear. If the function is linear better results can be obtained by defining the Hessian as zero instead of using quasi-Newton approximations. self.H.update(delta_x, delta_g) tests/unit/test_cupy_sparse_adapter.py::test_cupy_adapter_builds_and_spsolve_fallback /builddir/build/BUILD/python-ipax-0.13.0-build/ipax-0.13.0/tests/unit/test_cupy_sparse_adapter.py:235: RuntimeWarning: cuDSS is unavailable (missing cuDSS); falling back to CuPy spsolve, which re-factorizes on every solve solver.factor(operator) tests/unit/test_cupy_sparse_adapter.py::test_cudss_missing_runtime_uses_spsolve_fallback /builddir/build/BUILD/python-ipax-0.13.0-build/ipax-0.13.0/tests/unit/test_cupy_sparse_adapter.py:1096: RuntimeWarning: cuDSS is unavailable (the user-managed NVIDIA cuDSS runtime could not be loaded); falling back to CuPy spsolve, which re-factorizes on every solve solver.factor(operator) tests/unit/test_s2mpj_fasteval.py::test_batched_path_preserves_overflow_semantics :10: RuntimeWarning: overflow encountered in power tests/unit/test_scipy_interface.py: 8 warnings tests/unit/test_scipy_interface_backends.py: 5 warnings /builddir/build/BUILD/python-ipax-0.13.0-build/ipax-0.13.0/ipax/solve.py:173: UserWarning: objective gradient resolved by finite differences; supply an analytic gradient or an autodiff backend for accuracy and speed resolved: Problem = resolve(problem, xp, opts) tests/unit/test_scipy_interface.py::test_dict_constraints_use_scipy_sign_and_args /builddir/build/BUILD/python-ipax-0.13.0-build/ipax-0.13.0/tests/unit/test_scipy_interface.py:354: OptimizeWarning: some constraints have no callable jac; using central differences for those (supply jac for accuracy and speed) res = minimize_ipax( tests/unit/test_scipy_interface.py::test_dict_equality_constraint /builddir/build/BUILD/python-ipax-0.13.0-build/ipax-0.13.0/ipax/solve.py:173: UserWarning: eq_constraints Jacobian resolved by finite differences; this is dense and only appropriate for small problems resolved: Problem = resolve(problem, xp, opts) tests/unit/test_scipy_interface.py::test_constraint_values_and_multipliers_follow_input_order /builddir/build/BUILD/python-ipax-0.13.0-build/ipax-0.13.0/tests/unit/test_scipy_interface.py:381: OptimizeWarning: some constraints have no callable jac; using central differences for those (supply jac for accuracy and speed) res = minimize_ipax(_qp, np.zeros(4), jac=_qp_grad, constraints=cons) tests/unit/test_scipy_interface_backends.py::test_dict_constraints_and_callback_see_the_input_namespace[numpy] tests/unit/test_scipy_interface_backends.py::test_dict_constraints_and_callback_see_the_input_namespace[array_api_strict] /builddir/build/BUILD/python-ipax-0.13.0-build/ipax-0.13.0/ipax/solve.py:173: UserWarning: ineq_constraints Jacobian resolved by finite differences; this is dense and only appropriate for small problems resolved: Problem = resolve(problem, xp, opts) tests/unit/test_sparse_gram_cache.py::test_gram_dense_strategy_nonfinite_weights_fall_back tests/unit/test_trots_tiled_gram.py::test_active_row_gram_non_finite_weights_agree_with_the_plain_verdict /builddir/build/BUILD/python-ipax-0.13.0-build/ipax-0.13.0/ipax/backend/sparse/numpy_scipy.py:593: RuntimeWarning: invalid value encountered in multiply out += block.T @ (w[start:end, None] * block) tests/unit/test_sparse_gram_cache.py::test_gram_dense_strategy_nonfinite_weights_fall_back tests/unit/test_trots_tiled_gram.py::test_active_row_gram_non_finite_weights_agree_with_the_plain_verdict /builddir/build/BUILD/python-ipax-0.13.0-build/ipax-0.13.0/ipax/backend/sparse/numpy_scipy.py:593: RuntimeWarning: invalid value encountered in matmul out += block.T @ (w[start:end, None] * block) tests/unit/test_sparse_gram_cache.py::test_gram_dense_strategy_nonfinite_weights_fall_back /builddir/build/BUILD/python-ipax-0.13.0-build/ipax-0.13.0/tests/unit/test_sparse_gram_cache.py:49: RuntimeWarning: invalid value encountered in multiply return dense.T @ (weights[:, None] * dense) tests/unit/test_sparse_gram_cache.py::test_gram_dense_strategy_nonfinite_weights_fall_back /builddir/build/BUILD/python-ipax-0.13.0-build/ipax-0.13.0/tests/unit/test_sparse_gram_cache.py:49: RuntimeWarning: invalid value encountered in matmul return dense.T @ (weights[:, None] * dense) tests/unit/test_trots_tiled_gram.py::test_densify_on_the_pool_is_bitwise_the_whole_tile_toarray[False-float64-float32] tests/unit/test_trots_tiled_gram.py::test_densify_on_the_pool_is_bitwise_the_whole_tile_toarray[True-float64-float32] /builddir/build/BUILD/python-ipax-0.13.0-build/ipax-0.13.0/benchmarks/corpus/trots.py:1258: RuntimeWarning: overflow encountered in cast dense[r0:r1] = window.toarray() # the per-element astype cast tests/unit/test_trots_tiled_gram.py::test_active_row_gram_non_finite_weights_agree_with_the_plain_verdict /builddir/build/BUILD/python-ipax-0.13.0-build/ipax-0.13.0/benchmarks/corpus/trots.py:2100: RuntimeWarning: invalid value encountered in multiply acc += block.T @ (wa[start:stop, None].astype(acc_dtype) * block) tests/unit/test_trots_tiled_gram.py::test_active_row_gram_non_finite_weights_agree_with_the_plain_verdict /builddir/build/BUILD/python-ipax-0.13.0-build/ipax-0.13.0/benchmarks/corpus/trots.py:2100: RuntimeWarning: invalid value encountered in matmul acc += block.T @ (wa[start:stop, None].astype(acc_dtype) * block) -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html =========================== short test summary info ============================ SKIPPED [1] tests/integration/test_baseline_ipyopt.py:17: could not import 'ipyopt': No module named 'ipyopt' SKIPPED [1] tests/integration/test_s2mpj_corpus.py:23: no S2MPJ checkout (set IPAX_S2MPJ_DIR) SKIPPED [1] tests/integration/test_trots_corpus.py:23: could not import 'h5py': No module named 'h5py' SKIPPED [1] tests/integration/test_trots_reference_dataset.py:24: no TROTS dataset (set IPAX_TROTS_DIR) SKIPPED [1] tests/unit/test_cudss_refinement_gpu.py:20: could not import 'cupy': No module named 'cupy' SKIPPED [1] tests/unit/test_cupy_sparse_determinism_gpu.py:29: could not import 'cupy': No module named 'cupy' SKIPPED [1] tests/unit/test_dense_cupy_ldl.py:15: could not import 'cupy': No module named 'cupy' SKIPPED [1] tests/unit/test_dense_torch_ldl.py:10: could not import 'torch': No module named 'torch' SKIPPED [1] tests/unit/test_trots_loader.py:30: could not import 'h5py': No module named 'h5py' SKIPPED [4] tests/contracts/test_builtin_solver_contracts.py:142: no sparse adapter for backend 'array_api_strict' SKIPPED [1] tests/contracts/test_builtin_solver_contracts.py:72: no sparse adapter for backend 'array_api_strict' SKIPPED [1] tests/integration/test_benchmark_phase4.py:30: could not import 'matplotlib': No module named 'matplotlib' SKIPPED [1] tests/integration/test_benchmark_phase4.py:45: could not import 'matplotlib': No module named 'matplotlib' SKIPPED [1] tests/integration/test_benchmark_phase4.py:71: could not import 'osqp': No module named 'osqp' SKIPPED [1] tests/integration/test_benchmark_phase4.py:86: could not import 'osqp': No module named 'osqp' SKIPPED [2] tests/integration/test_corrections_solve.py:110: no sparse adapter for 'array_api_strict' SKIPPED [1] tests/integration/test_result_routes.py:98: no sparse adapter for backend 'array_api_strict' SKIPPED [4] tests/regression/test_driver_host_sync_budget.py:54: scalar-sync counting unavailable for SKIPPED [1] tests/regression/test_fraction_to_boundary_no_elementwise_sync.py:34: scalar-sync counting unavailable for SKIPPED [4] tests/regression/test_linear_ineq_lbfgs.py:20: backend has no sparse adapter SKIPPED [2] tests/unit/test_autodiff.py:41: backend has no autodiff adapter SKIPPED [2] tests/unit/test_autodiff.py:54: backend has no autodiff adapter SKIPPED [2] tests/unit/test_autodiff.py:70: backend has no autodiff adapter SKIPPED [2] tests/unit/test_autodiff.py:85: backend has no autodiff adapter SKIPPED [13] tests/unit/test_dense_cholesky_reuse.py:58: backend has no triangular-solve primitive SKIPPED [8] tests/unit/test_dense_cholesky_reuse.py:100: the CuPy adapter's triangular solves SKIPPED [1] tests/unit/test_dense_diagonal_adder.py:34: backend has no O(n) diagonal-add primitive SKIPPED [1] tests/unit/test_dense_diagonal_adder.py:47: backend has no O(n) diagonal-add primitive SKIPPED [1] tests/unit/test_dense_diagonal_adder.py:70: backend has no O(n) diagonal-add primitive SKIPPED [1] tests/unit/test_dense_diagonal_adder.py:93: backend has no O(n) diagonal-add primitive SKIPPED [1] tests/unit/test_dense_diagonal_adder.py:111: backend has no O(n) diagonal-add primitive SKIPPED [1] tests/unit/test_dense_diagonal_adder.py:188: could not import 'torch': No module named 'torch' SKIPPED [1] tests/unit/test_dense_dispatch.py:29: could not import 'torch': No module named 'torch' SKIPPED [1] tests/unit/test_dense_dispatch.py:44: could not import 'cupy': No module named 'cupy' SKIPPED [1] tests/unit/test_dense_dispatch.py:65: could not import 'torch': No module named 'torch' SKIPPED [1] tests/unit/test_dense_dispatch.py:108: could not import 'torch': No module named 'torch' SKIPPED [1] tests/unit/test_dense_dispatch.py:151: could not import 'torch': No module named 'torch' SKIPPED [1] tests/unit/test_dense_dispatch.py:175: could not import 'torch': No module named 'torch' SKIPPED [1] tests/unit/test_dense_dispatch.py:197: could not import 'torch': No module named 'torch' SKIPPED [1] tests/unit/test_kkt.py:141: no sparse adapter for backend 'array_api_strict' SKIPPED [1] tests/unit/test_kkt.py:173: no sparse adapter for backend 'array_api_strict' SKIPPED [10] tests/unit/test_linear_ineq_lowering.py:293: no sparse adapter for backend 'array_api_strict' SKIPPED [1] tests/unit/test_operator_batched_hooks.py:91: no sparse adapter for backend 'array_api_strict' SKIPPED [6] tests/unit/test_public_sparse_operators.py:22: no sparse adapter for backend 'array_api_strict' SKIPPED [2] tests/unit/test_restoration.py:1024: no sparse Gram adapter for this backend SKIPPED [1] tests/unit/test_restoration_cholesky.py:247: no native triangular-solve adapter for this backend SKIPPED [1] tests/unit/test_scaling.py:235: no sparse adapter for backend 'array_api_strict' SKIPPED [2] tests/unit/test_scipy_interface_backends.py:281: needs an autodiff backend SKIPPED [1] tests/unit/test_scipy_interface_backends.py:315: needs a CUDA device (CuPy or a CUDA build of PyTorch) SKIPPED [1] tests/unit/test_scipy_interface_backends.py:402: array-api-strict has no sparse adapter (sparse needs one) SKIPPED [1] tests/unit/test_sparse_device_routing.py:95: no sparse adapter for 'array_api_strict' SKIPPED [1] tests/unit/test_sparse_device_routing.py:109: no sparse adapter for 'array_api_strict' SKIPPED [1] tests/unit/test_sparse_dispatch.py:48: torch namespace unavailable: backend 'torch' is not installed SKIPPED [1] tests/unit/test_trots_breedveld_start.py:423: on NumPy the problem is its own host twin SKIPPED [1] tests/unit/test_trots_breedveld_start.py:425: the TROTS linear block needs a sparse adapter to be applied SKIPPED [1] tests/unit/test_trots_breedveld_start.py:641: could not import 'cupy': No module named 'cupy' SKIPPED [1] tests/unit/test_trots_breedveld_start.py:716: the TROTS linear block needs a sparse adapter to be applied SKIPPED [2] tests/unit/test_trots_exact_hessian.py:438: device Hessian runs on CuPy / Torch namespaces only SKIPPED [2] tests/unit/test_trots_exact_hessian.py:467: device Hessian runs on CuPy / Torch namespaces only SKIPPED [2] tests/unit/test_trots_exact_hessian.py:485: device Hessian runs on CuPy / Torch namespaces only SKIPPED [12] tests/unit/test_trots_exact_hessian.py:528: device Hessian runs on CuPy / Torch namespaces only SKIPPED [1] tests/unit/test_trots_exact_hessian.py:896: tile plans run on NumPy / CuPy / Torch namespaces only SKIPPED [2] tests/unit/test_trots_exact_hessian.py:931: device Hessian runs on CuPy / Torch namespaces only SKIPPED [2] tests/unit/test_trots_exact_hessian.py:967: could not import 'numba': No module named 'numba' SKIPPED [7] tests/unit/test_trots_hessian_gram_merge.py:57: tiled plans run on NumPy / CuPy / Torch namespaces only SKIPPED [2] tests/unit/test_trots_hessian_gram_merge.py:258: device Hessian runs on CuPy / Torch namespaces only SKIPPED [1] tests/unit/test_trots_tiled_gram.py:1285: the host-NumPy namespace takes ActiveRowGramCSROperator SKIPPED [88] tests/unit/test_trots_tiled_gram.py:1323: device tiled Gram runs on CuPy / Torch namespaces only SKIPPED [1] tests/unit/test_trots_tiled_gram.py:1842: could not import 'torch': No module named 'torch' SKIPPED [1] tests/unit/test_trots_tiled_gram.py:1853: could not import 'cupy': No module named 'cupy' SKIPPED [32] tests/unit/test_trots_tiled_gram.py:2207: could not import 'numba': No module named 'numba' FAILED tests/backends/test_cross_backend_conformance.py::test_same_solution_across_backends FAILED tests/contracts/test_builtin_operator_contracts.py::TestSignedRowSelection::test_shape_consistency[array_api_strict] FAILED tests/contracts/test_builtin_operator_contracts.py::TestSignedRowSelection::test_matvec_matches_dense[array_api_strict] FAILED tests/contracts/test_builtin_operator_contracts.py::TestSignedRowSelection::test_adjoint_identity[array_api_strict] FAILED tests/contracts/test_builtin_operator_contracts.py::TestSignedRowSelection::test_matmat_matches_dense[array_api_strict] FAILED tests/contracts/test_builtin_operator_contracts.py::TestSignedRowSelection::test_dense_matrix_matches_dense_when_available[array_api_strict] FAILED tests/contracts/test_builtin_operator_contracts.py::TestSignedRowSelection::test_positive_definite_hint_is_honest[array_api_strict] FAILED tests/contracts/test_builtin_operator_contracts.py::TestSignedRowSelection::test_dense_matrix_with_gram_is_honest_when_offered[array_api_strict] FAILED tests/contracts/test_builtin_operator_contracts.py::TestSignedRowSelection::test_exact_lbfgs_inverse_claim_is_honest[array_api_strict] FAILED tests/integration/test_benchmark_harness.py::test_run_case_scores_a_known_optimum[array_api_strict] FAILED tests/integration/test_benchmark_harness.py::test_run_case_reports_soc_attempted_and_accepted[array_api_strict] FAILED tests/integration/test_benchmark_harness.py::test_run_case_converged_but_not_correct_when_objective_differs[array_api_strict] FAILED tests/integration/test_benchmark_harness.py::test_run_case_applies_prepare_solve[array_api_strict] FAILED tests/integration/test_breedveld_soc.py::test_soc_reaches_the_same_optimum_as_backtracking[array_api_strict] FAILED tests/integration/test_breedveld_soc.py::test_filter_soc_recorded_on_iteration_history[array_api_strict] FAILED tests/integration/test_breedveld_soc.py::test_soc_composes_with_common_step[array_api_strict] FAILED tests/integration/test_breedveld_soc.py::test_breedveld_soc_rounds_come_from_breedveld_options[array_api_strict] FAILED tests/integration/test_breedveld_soc.py::test_soc_leaves_hock_schittkowski_optima_unchanged[array_api_strict-HS71] FAILED tests/integration/test_breedveld_soc.py::test_soc_leaves_hock_schittkowski_optima_unchanged[array_api_strict-HS43] FAILED tests/integration/test_breedveld_soc.py::test_soc_trials_are_logged_at_debug_level[array_api_strict] FAILED tests/integration/test_callback_and_logging.py::test_callback_is_invoked_once_per_recorded_iteration[array_api_strict] FAILED tests/integration/test_callback_and_logging.py::test_callback_truthy_return_requests_stop[array_api_strict] FAILED tests/integration/test_callback_and_logging.py::test_acceptable_stopping_is_integrated_with_the_driver[array_api_strict] FAILED tests/integration/test_callback_and_logging.py::test_component_optimality_threshold_is_integrated_with_the_driver[array_api_strict] FAILED tests/integration/test_callback_and_logging.py::test_wall_time_stopping_is_integrated_with_the_driver[array_api_strict] FAILED tests/integration/test_callback_and_logging.py::test_objective_stagnation_is_guarded_and_skips_the_initial_record[array_api_strict] FAILED tests/integration/test_callback_and_logging.py::test_convergence_takes_priority_over_stop_request[array_api_strict] FAILED tests/integration/test_callback_and_logging.py::test_verbose_emits_iteration_log_to_ipax_logger[array_api_strict] FAILED tests/integration/test_callback_and_logging.py::test_iteration_header_is_reprinted_periodically[array_api_strict] FAILED tests/integration/test_callback_and_logging.py::test_iterates_meeting_acceptable_criteria_are_marked[array_api_strict] FAILED tests/integration/test_callback_and_logging.py::test_restoration_jump_marks_the_resulting_iteration[array_api_strict] FAILED tests/integration/test_callback_and_logging.py::test_verbosity_tiers_are_emitted_at_their_levels[array_api_strict] FAILED tests/integration/test_callback_and_logging.py::test_silent_by_default[array_api_strict] FAILED tests/integration/test_corrections_solve.py::test_corrections_match_optimum_on_bound_qp[array_api_strict-mehrotra] FAILED tests/integration/test_corrections_solve.py::test_corrections_match_optimum_on_bound_qp[array_api_strict-gondzio] FAILED tests/integration/test_corrections_solve.py::test_corrections_solve_inequality_qp[array_api_strict-mehrotra] FAILED tests/integration/test_corrections_solve.py::test_corrections_solve_inequality_qp[array_api_strict-gondzio] FAILED tests/integration/test_corrections_solve.py::test_corrections_reduce_outer_iterations_on_inequality_qp[array_api_strict] FAILED tests/integration/test_corrections_solve.py::test_corrections_work_across_repeated_solve_routes[array_api_strict-krylov-mehrotra] FAILED tests/integration/test_corrections_solve.py::test_corrections_work_across_repeated_solve_routes[array_api_strict-krylov-gondzio] FAILED tests/integration/test_dense_augmented_route.py::test_augmented_route_reaches_known_optimum[array_api_strict] FAILED tests/integration/test_dense_augmented_route.py::test_augmented_route_agrees_with_condensed_route[array_api_strict] FAILED tests/integration/test_dense_augmented_route.py::test_augmented_route_reports_itself_in_linear_solver[array_api_strict] FAILED tests/integration/test_dense_augmented_route.py::test_augmented_route_escapes_saddle_like_condensed[array_api_strict] FAILED tests/integration/test_dense_nonconvex.py::test_dense_route_pd_guard_escapes_saddle[array_api_strict] FAILED tests/integration/test_device_efficiency.py::test_measure_device_solve_populates_metrics[array_api_strict] FAILED tests/integration/test_device_efficiency.py::test_sync_counter_restores_dunders_after_window[array_api_strict] FAILED tests/integration/test_hock_schittkowski.py::test_hs1_rosenbrock_reaches_published_optimum[array_api_strict] FAILED tests/integration/test_hock_schittkowski.py::test_hs6_nonconvex_equality[array_api_strict] FAILED tests/integration/test_hock_schittkowski.py::test_hs7_log_objective_equality[array_api_strict] FAILED tests/integration/test_hock_schittkowski.py::test_hs8_two_quadratic_equalities[array_api_strict] FAILED tests/integration/test_hock_schittkowski.py::test_hs35_inequality_qp_with_bounds[array_api_strict] FAILED tests/integration/test_hock_schittkowski.py::test_hs43_rosen_suzuki_inequalities[array_api_strict] FAILED tests/integration/test_hock_schittkowski.py::test_hs21_active_bound_with_linear_inequality[array_api_strict] FAILED tests/integration/test_hock_schittkowski.py::test_hs28_equality_qp_degenerate_multiplier[array_api_strict] FAILED tests/integration/test_hock_schittkowski.py::test_hs9_nonunique_periodic_optimum[array_api_strict] FAILED tests/integration/test_hock_schittkowski.py::test_hs71_full_constraint_mix[array_api_strict] FAILED tests/integration/test_known_optima.py::test_unconstrained_quadratic_hits_closed_form[array_api_strict] FAILED tests/integration/test_known_optima.py::test_unreachable_optimality_stops_acceptable_not_max_iter[array_api_strict] FAILED tests/integration/test_known_optima.py::test_bound_constrained_qp_finds_known_active_bounds[array_api_strict] FAILED tests/integration/test_known_optima.py::test_inequality_qp_finds_known_active_set[array_api_strict] FAILED tests/integration/test_known_optima.py::test_equality_constrained_qp_satisfies_kkt[array_api_strict] FAILED tests/integration/test_known_optima.py::test_mixed_linear_and_nonlinear_equalities_slice_hessian_multipliers[array_api_strict] FAILED tests/integration/test_known_optima.py::test_fixed_variable_solves_via_bound_relaxation[array_api_strict] FAILED tests/integration/test_known_optima.py::test_infeasible_problem_reports_infeasible[array_api_strict] FAILED tests/integration/test_known_optima.py::test_inconsistent_equalities_report_infeasible[array_api_strict] FAILED tests/integration/test_known_optima.py::test_result_history_tracks_monotone_kkt_progress[array_api_strict] FAILED tests/integration/test_krylov_solve.py::test_krylov_unconstrained_quadratic[array_api_strict] FAILED tests/integration/test_krylov_solve.py::test_krylov_bound_constrained_qp[array_api_strict] FAILED tests/integration/test_krylov_solve.py::test_krylov_inequality_qp[array_api_strict] FAILED tests/integration/test_krylov_solve.py::test_krylov_jacobi_preconditioner_cuts_total_iterations[array_api_strict] FAILED tests/integration/test_krylov_solve.py::test_krylov_equality_constrained_qp_uses_minres[array_api_strict] FAILED tests/integration/test_krylov_solve.py::test_gmres_solves_bound_constrained_qp[array_api_strict] FAILED tests/integration/test_krylov_solve.py::test_lbfgs_preconditioner_solves_bound_constrained_qp[array_api_strict] FAILED tests/integration/test_krylov_solve.py::test_krylov_solves_synthetic_rt_like_problem[array_api_strict] FAILED tests/integration/test_krylov_solve.py::test_krylov_solve_never_materializes_the_kkt_matrix[array_api_strict] FAILED tests/integration/test_krylov_solve.py::test_krylov_operator_errors_propagate[array_api_strict] FAILED tests/integration/test_linear_inequalities.py::test_lower_bounded_linear_inequality[array_api_strict] FAILED tests/integration/test_linear_inequalities.py::test_two_sided_range_upper_active[array_api_strict] FAILED tests/integration/test_linear_inequalities.py::test_mixed_nonlinear_and_linear_inequalities[array_api_strict] FAILED tests/integration/test_linear_inequalities.py::test_linear_inequality_with_gradient_scaling[array_api_strict] FAILED tests/integration/test_linear_inequalities.py::test_hs21_via_linear_ineq_matches_known_optimum[array_api_strict] FAILED tests/integration/test_linear_inequalities.py::test_matrix_free_linear_ineq_is_lowered_and_solved[array_api_strict] FAILED tests/integration/test_result_routes.py::test_routes_record_the_default_auto_selection[array_api_strict] FAILED tests/integration/test_result_routes.py::test_routes_reflect_forced_krylov[array_api_strict] FAILED tests/integration/test_result_routes.py::test_routes_reflect_the_dense_augmented_form[array_api_strict] FAILED tests/integration/test_result_routes.py::test_routes_echo_configured_algorithm_pieces[array_api_strict] FAILED tests/integration/test_result_routes.py::test_routes_absent_on_pre_solver_exits[array_api_strict] FAILED tests/integration/test_result_routes.py::test_format_result_reports_routes[array_api_strict] FAILED tests/integration/test_scaling_solve.py::test_badly_scaled_qp_solves_with_scaling[array_api_strict] FAILED tests/integration/test_scaling_solve.py::test_options_accepts_simple_scaling_shorthand[array_api_strict] FAILED tests/integration/test_scaling_solve.py::test_history_and_callback_use_original_problem_units[array_api_strict] FAILED tests/integration/test_scaling_solve.py::test_callback_slacks_and_inequality_duals_use_original_units[array_api_strict] FAILED tests/integration/test_scaling_solve.py::test_scaling_off_by_default_leaves_problem_unscaled[array_api_strict] FAILED tests/integration/test_scaling_solve.py::test_scaling_matches_across_solver_routes[array_api_strict] FAILED tests/integration/test_warm_start_solve.py::test_warm_start_from_optimum_converges_immediately[array_api_strict] FAILED tests/integration/test_warm_start_solve.py::test_warm_start_with_scaling_round_trips[array_api_strict] FAILED tests/integration/test_warm_start_solve.py::test_warm_start_with_scaling_round_trips_inequalities[array_api_strict] FAILED tests/integration/test_warm_start_solve.py::test_warm_start_dimension_mismatch_raises[array_api_strict] FAILED tests/regression/test_adaptive_alpha_min.py::test_driver_derives_theta_min_from_the_initial_violation[array_api_strict] FAILED tests/regression/test_adaptive_alpha_min.py::test_theta_min_floors_at_one_for_a_feasible_start[array_api_strict] FAILED tests/regression/test_bound_only_lbfgs_structured_routes.py::test_dense_route_never_materializes_bound_only_lbfgs[array_api_strict] FAILED tests/regression/test_bound_only_lbfgs_structured_routes.py::test_krylov_route_uses_exact_lbfgs_inverse_on_bound_only[array_api_strict] FAILED tests/regression/test_bound_only_lbfgs_structured_routes.py::test_structured_routes_agree_with_each_other[array_api_strict] FAILED tests/regression/test_budget_exhaustion_acceptable.py::test_max_iter_within_relaxed_tolerance_reports_acceptable[array_api_strict] FAILED tests/regression/test_budget_exhaustion_acceptable.py::test_max_iter_far_from_tolerance_stays_max_iter[array_api_strict] FAILED tests/regression/test_callback_evaluation_counts.py::test_unconstrained_lbfgs_evaluates_each_point_once[array_api_strict] FAILED tests/regression/test_callback_evaluation_counts.py::test_constrained_without_soc_evaluates_each_point_once[array_api_strict-HS43-ineq] FAILED tests/regression/test_callback_evaluation_counts.py::test_constrained_without_soc_evaluates_each_point_once[array_api_strict-HS7-eq] FAILED tests/regression/test_callback_evaluation_counts.py::test_constrained_without_soc_evaluates_each_point_once[array_api_strict-HS71-eq-ineq-bounds] FAILED tests/regression/test_callback_evaluation_counts.py::test_constrained_with_soc_bounded_by_visited_points[array_api_strict-HS43-ineq] FAILED tests/regression/test_callback_evaluation_counts.py::test_constrained_with_soc_bounded_by_visited_points[array_api_strict-HS7-eq] FAILED tests/regression/test_callback_evaluation_counts.py::test_constrained_with_soc_bounded_by_visited_points[array_api_strict-HS71-eq-ineq-bounds] FAILED tests/regression/test_corrector_operator_counts.py::test_no_corrector_monotone_passes[array_api_strict] FAILED tests/regression/test_corrector_operator_counts.py::test_mehrotra_corrector_passes[array_api_strict-monotone-filter] FAILED tests/regression/test_corrector_operator_counts.py::test_mehrotra_corrector_passes[array_api_strict-monotone-breedveld] FAILED tests/regression/test_corrector_operator_counts.py::test_mehrotra_corrector_passes[array_api_strict-probing-filter] FAILED tests/regression/test_corrector_operator_counts.py::test_mehrotra_corrector_passes[array_api_strict-probing-breedveld] FAILED tests/regression/test_corrector_operator_counts.py::test_gondzio_corrector_passes[array_api_strict-filter] FAILED tests/regression/test_corrector_operator_counts.py::test_gondzio_corrector_passes[array_api_strict-breedveld] FAILED tests/regression/test_delta_c_rank_deficient_constraints.py::test_dense_solves_rank_deficient_equality[array_api_strict] FAILED tests/regression/test_delta_c_rank_deficient_constraints.py::test_lbfgs_solves_rank_deficient_equality[array_api_strict] FAILED tests/regression/test_driver_host_sync_budget.py::test_host_syncs_per_iteration_bounded[array_api_strict-rosenbrock-unconstrained] FAILED tests/regression/test_driver_host_sync_budget.py::test_host_syncs_per_iteration_bounded[array_api_strict-HS43-ineq] FAILED tests/regression/test_driver_host_sync_budget.py::test_host_syncs_per_iteration_bounded[array_api_strict-HS71-eq-ineq-bounds] FAILED tests/regression/test_driver_host_sync_budget.py::test_host_syncs_per_iteration_bounded[array_api_strict-bound-only-lbfgs-krylov-direct] FAILED tests/regression/test_false_infeasible_veto.py::test_infeasible_verdict_vetoed_by_feasible_history[array_api_strict] FAILED tests/regression/test_false_infeasible_veto.py::test_failure_status_returns_best_iterate[array_api_strict] FAILED tests/regression/test_false_infeasible_veto.py::test_genuine_infeasibility_still_reported[array_api_strict] FAILED tests/regression/test_feasible_ascent_stall.py::test_krylov_escapes_feasible_ascent_direction[array_api_strict] FAILED tests/regression/test_feasible_ascent_stall.py::test_stall_detector_terminates_honestly[array_api_strict] FAILED tests/regression/test_feasible_ascent_stall.py::test_stall_detector_disabled_runs_to_budget[array_api_strict] FAILED tests/regression/test_feasible_ascent_stall.py::test_descent_enforcement_reuses_step_when_already_descent[array_api_strict] FAILED tests/regression/test_feasible_point_restoration_recenter.py::test_feasible_entry_recenters_instead_of_restoring[array_api_strict] FAILED tests/regression/test_feasible_point_restoration_recenter.py::test_infeasible_entry_still_restores[array_api_strict] FAILED tests/regression/test_feasible_point_restoration_recenter.py::test_recenter_breaks_a_poisoned_dual_deadlock[array_api_strict] FAILED tests/regression/test_hs7_lbfgs_no_false_infeasible.py::test_hs7_lbfgs_dense_does_not_diverge[array_api_strict] FAILED tests/regression/test_hs7_lbfgs_no_false_infeasible.py::test_hs7_lbfgs_krylov_does_not_diverge[array_api_strict] FAILED tests/regression/test_hs9_krylov_zero_hessian.py::test_hs9_exact_krylov_recovers_from_zero_hessian_start[array_api_strict] FAILED tests/regression/test_iteration_operator_lifetime.py::test_previous_hessian_is_released_before_the_next_assembly[array_api_strict-filter] FAILED tests/regression/test_iteration_operator_lifetime.py::test_previous_hessian_is_released_before_the_next_assembly[array_api_strict-breedveld] FAILED tests/regression/test_lbfgs_gradient_overshoot.py::test_lbfgs_recovers_from_non_finite_gradient_overshoot[array_api_strict] FAILED tests/regression/test_linear_ineq_lbfgs.py::test_affine_lbfgs_active_inequality_and_bound[array_api_strict-linear_ineq-dense] FAILED tests/regression/test_linear_ineq_lbfgs.py::test_affine_lbfgs_active_inequality_and_bound[array_api_strict-linear_ineq-krylov] FAILED tests/regression/test_mu_oracle_inflation.py::test_free_mode_oracles_do_not_run_away_on_ill_scaled_ls[array_api_strict-probing-none] FAILED tests/regression/test_mu_oracle_inflation.py::test_free_mode_oracles_do_not_run_away_on_ill_scaled_ls[array_api_strict-probing-gondzio] FAILED tests/regression/test_mu_oracle_inflation.py::test_free_mode_oracles_do_not_run_away_on_ill_scaled_ls[array_api_strict-adaptive-gondzio] FAILED tests/regression/test_mu_oracle_inflation.py::test_free_mode_oracles_do_not_run_away_on_ill_scaled_ls[array_api_strict-breedveld-mehrotra] FAILED tests/regression/test_mu_oracle_inflation.py::test_free_mode_oracles_do_not_run_away_on_ill_scaled_ls[array_api_strict-quality-none] FAILED tests/regression/test_mu_oracle_inflation.py::test_free_mode_oracles_do_not_run_away_on_ill_scaled_ls[array_api_strict-quality-gondzio] FAILED tests/regression/test_near_feasible_not_infeasible.py::test_near_feasible_restoration_stall_is_not_infeasible[array_api_strict] FAILED tests/regression/test_near_feasible_not_infeasible.py::test_genuinely_infeasible_restoration_still_reports_infeasible[array_api_strict] FAILED tests/regression/test_point_cache_lifetime.py::test_at_most_two_jacobians_alive_during_a_solve[array_api_strict] FAILED tests/regression/test_point_cache_lifetime.py::test_descent_retry_diagnostic_formats[array_api_strict] FAILED tests/regression/test_repeat_recenter_raises_mu.py::test_repeat_recenter_raise_sticks_in_the_loop[array_api_strict] FAILED tests/regression/test_restoration_on_step_failure.py::test_step_solve_failure_enters_restoration_not_numerical_error[array_api_strict-dense] FAILED tests/regression/test_restoration_on_step_failure.py::test_step_solve_failure_enters_restoration_not_numerical_error[array_api_strict-krylov] FAILED tests/regression/test_restoration_on_step_failure.py::test_matrix_free_restoration_does_not_pin_its_operator_after_returning[array_api_strict] FAILED tests/regression/test_restoration_on_step_failure.py::test_step_solve_failure_on_infeasible_problem_reports_honestly[array_api_strict] FAILED tests/regression/test_restoration_on_step_failure.py::test_step_failure_near_optimum_still_converges[array_api_strict] FAILED tests/regression/test_restoration_tall_gram_block_not_densified.py::test_tall_gram_block_through_restoration_is_not_densified[array_api_strict-operator] FAILED tests/regression/test_restoration_tall_gram_block_not_densified.py::test_tall_gram_block_through_restoration_is_not_densified[array_api_strict-dense] FAILED tests/regression/test_restoration_tall_gram_block_not_densified.py::test_operator_path_restoration_matches_the_densified_path[array_api_strict] FAILED tests/regression/test_second_chance_restoration.py::test_second_chance_restoration_rescues_a_bad_basin[array_api_strict] FAILED tests/regression/test_second_chance_restoration.py::test_second_chance_fires_at_most_once[array_api_strict] FAILED tests/regression/test_soc_factorization_reuse.py::test_soc_solves_reuse_the_step_factorization[array_api_strict-dense] FAILED tests/regression/test_soc_factorization_reuse.py::test_soc_solves_reuse_the_step_factorization[array_api_strict-krylov] FAILED tests/regression/test_soc_factorization_reuse.py::test_soc_gate_follows_a_regularized_fallback_inside_the_soc_loop[array_api_strict-dense] FAILED tests/regression/test_soc_factorization_reuse.py::test_soc_gate_follows_a_regularized_fallback_inside_the_soc_loop[array_api_strict-krylov] FAILED tests/regression/test_soc_factorization_reuse.py::test_direct_soc_never_reuses_the_steps_regularized_factorization[array_api_strict] FAILED tests/regression/test_soc_factorization_reuse.py::test_iterative_soc_reuses_the_steps_regularized_factorization[array_api_strict] FAILED tests/regression/test_soc_factorization_reuse.py::test_direct_soc_skips_the_correction_when_its_fresh_solve_fails[array_api_strict] FAILED tests/regression/test_step_solve_callback_errors_propagate.py::test_linear_ineq_gram_type_error_propagates[array_api_strict-exact] FAILED tests/regression/test_step_solve_callback_errors_propagate.py::test_linear_ineq_gram_type_error_propagates[array_api_strict-lbfgs] FAILED tests/regression/test_step_solve_callback_errors_propagate.py::test_ineq_jacobian_gram_type_error_propagates[array_api_strict-exact] FAILED tests/regression/test_step_solve_callback_errors_propagate.py::test_ineq_jacobian_gram_type_error_propagates[array_api_strict-lbfgs] FAILED tests/regression/test_step_solve_callback_errors_propagate.py::test_mixed_precision_gram_keyword_bug_is_not_retried_away[array_api_strict] FAILED tests/regression/test_step_solve_callback_errors_propagate.py::test_hessian_operator_materialization_type_error_propagates[array_api_strict] FAILED tests/regression/test_step_solve_callback_errors_propagate.py::test_lagrangian_hessian_callback_type_error_propagates[array_api_strict] FAILED tests/regression/test_step_solve_numerical_failure_ladder.py::test_numerical_failure_in_first_factorization_escalates_delta_w[array_api_strict-backend-linalg-error] FAILED tests/regression/test_step_solve_numerical_failure_ladder.py::test_numerical_failure_in_first_factorization_escalates_delta_w[array_api_strict-floating-point-error] FAILED tests/regression/test_step_solve_numerical_failure_ladder.py::test_numerical_failure_in_first_factorization_escalates_delta_w[array_api_strict-zero-division-error] FAILED tests/regression/test_step_solve_numerical_failure_ladder.py::test_exhausted_ladder_hands_the_step_to_restoration[array_api_strict-backend-linalg-error] FAILED tests/regression/test_step_solve_numerical_failure_ladder.py::test_exhausted_ladder_hands_the_step_to_restoration[array_api_strict-floating-point-error] FAILED tests/regression/test_step_solve_numerical_failure_ladder.py::test_exhausted_ladder_hands_the_step_to_restoration[array_api_strict-zero-division-error] FAILED tests/regression/test_terminal_dual_certificate.py::test_budget_exit_with_repairable_duals_reports_acceptable[array_api_strict] FAILED tests/regression/test_terminal_dual_certificate.py::test_certificate_declines_at_an_infeasible_point[array_api_strict] FAILED tests/regression/test_terminal_dual_certificate.py::test_stall_with_certifiable_gradient_reports_acceptable[array_api_strict] FAILED tests/regression/test_terminal_dual_certificate.py::test_stall_at_a_non_stationary_point_stays_stalled[array_api_strict] FAILED tests/regression/test_terminal_dual_certificate.py::test_stall_at_an_active_bound_stays_stalled[array_api_strict] FAILED tests/regression/test_terminal_dual_certificate.py::test_disabled_acceptable_stopping_disables_the_certificate[array_api_strict] FAILED tests/regression/test_terminal_dual_certificate.py::test_certificate_requires_the_dual_tolerance_enabled[array_api_strict-acceptable0] FAILED tests/regression/test_terminal_dual_certificate.py::test_certificate_requires_the_dual_tolerance_enabled[array_api_strict-acceptable1] FAILED tests/regression/test_terminal_dual_certificate.py::test_an_enabled_f_tol_is_honored_terminally[array_api_strict] FAILED tests/regression/test_terminal_dual_certificate.py::test_max_time_exit_is_certified_too[array_api_strict] FAILED tests/regression/test_terminal_dual_certificate.py::test_certificate_survives_a_raising_dual_estimator[array_api_strict] FAILED tests/regression/test_terminal_dual_certificate.py::test_certificate_declines_a_non_finite_dual_estimate[array_api_strict] FAILED tests/regression/test_terminal_dual_certificate.py::test_stall_returning_a_best_iterate_within_relaxed_tol[array_api_strict] FAILED tests/regression/test_terminal_dual_certificate.py::test_enabled_relative_change_tolerance_declines_the_certificate[array_api_strict] FAILED tests/regression/test_terminal_dual_certificate.py::test_a_failing_residual_declines_the_certificate_instead_of_raising[array_api_strict] FAILED tests/regression/test_theta_min_ftype_gate.py::test_ftype_branch_is_gated_by_the_driver_supplied_theta_min[array_api_strict] FAILED tests/regression/test_unbounded_detection.py::test_unbounded_problem_reports_unbounded[array_api_strict] FAILED tests/regression/test_unbounded_detection.py::test_well_posed_problem_is_not_flagged_unbounded[array_api_strict] FAILED tests/regression/test_unbounded_detection.py::test_far_optimum_is_not_misreported_unbounded[array_api_strict] FAILED tests/regression/test_unbounded_detection.py::test_diverging_iterates_tol_none_disables_detection[array_api_strict] FAILED tests/regression/test_uncertified_restoration_stall.py::test_non_progressing_uncertified_stall_is_restoration_failed[array_api_strict] FAILED tests/regression/test_uncertified_restoration_stall.py::test_progressing_uncertified_stalls_resume_the_main_loop[array_api_strict] FAILED tests/regression/test_uncertified_restoration_stall.py::test_uncertified_stall_still_gets_the_x0_anchored_rescue[array_api_strict] FAILED tests/regression/test_uncertified_restoration_stall.py::test_certified_stationary_claim_still_reports_infeasible[array_api_strict] FAILED tests/test_purity_gate.py::test_no_banned_imports_in_core - AssertionE... FAILED tests/test_purity_gate.py::test_core_may_not_import_the_interfaces_front_ends FAILED tests/test_purity_gate.py::test_relative_imports_of_the_interfaces_are_caught_too FAILED tests/unit/test_backend_namespace.py::test_capabilities_reports_real_devices[array_api_strict] FAILED tests/unit/test_breedveld.py::test_breedveld_globalization_solves_bound_qp[array_api_strict] FAILED tests/unit/test_breedveld.py::test_breedveld_globalization_uses_breedveld_tau[array_api_strict] FAILED tests/unit/test_breedveld.py::test_common_step_couples_the_primal_and_dual_step_lengths[array_api_strict] FAILED tests/unit/test_breedveld.py::test_common_step_hands_the_controller_the_smaller_length[array_api_strict] FAILED tests/unit/test_breedveld.py::test_common_step_backtracking_shrinks_both_updates[array_api_strict] FAILED tests/unit/test_breedveld.py::test_common_step_leaves_the_corrector_probes_separate[array_api_strict] FAILED tests/unit/test_breedveld.py::test_common_step_is_inert_under_the_filter_line_search[array_api_strict] FAILED tests/unit/test_breedveld.py::test_common_step_default_is_bit_identical[array_api_strict-HS21-breedveld] FAILED tests/unit/test_breedveld.py::test_common_step_default_is_bit_identical[array_api_strict-HS35-breedveld] FAILED tests/unit/test_breedveld.py::test_common_step_default_is_bit_identical[array_api_strict-HS43-breedveld] FAILED tests/unit/test_breedveld.py::test_common_step_default_is_bit_identical[array_api_strict-HS43-filter] FAILED tests/unit/test_breedveld.py::test_common_step_default_is_bit_identical[array_api_strict-HS71-breedveld] FAILED tests/unit/test_breedveld.py::test_common_step_default_is_bit_identical[array_api_strict-HS71-filter] FAILED tests/unit/test_condensed_curvature_gram.py::test_solve_through_the_hook_matches_the_two_pass_solve[array_api_strict] FAILED tests/unit/test_corrections.py::test_breedveld_gondzio_variant_targets_and_acceptance[array_api_strict] FAILED tests/unit/test_corrections.py::test_breedveld_gondzio_capped_corrections[array_api_strict-10.0-10.0--40.0] FAILED tests/unit/test_corrections.py::test_breedveld_gondzio_capped_corrections[array_api_strict-1.0-1.0--1.0524999999999984] FAILED tests/unit/test_corrections.py::test_breedveld_gondzio_capped_corrections[array_api_strict--1.0--1.0-0.0] FAILED tests/unit/test_corrections.py::test_breedveld_gondzio_capped_corrections[array_api_strict--3.5--5.0-0.18125000000000002] FAILED tests/unit/test_corrections.py::test_breedveld_gondzio_corrects_bound_blocks[array_api_strict] FAILED tests/unit/test_corrections.py::test_breedveld_gondzio_variant_rejects_small_growth[array_api_strict] FAILED tests/unit/test_corrections.py::test_mehrotra_second_order_targets_clipped_to_symmetric_box[array_api_strict] FAILED tests/unit/test_corrections.py::test_mehrotra_failed_corrector_matches_affine_zero_target[array_api_strict] FAILED tests/unit/test_corrections.py::test_mehrotra_falls_back_to_centered_when_correction_collapses_the_step[array_api_strict] FAILED tests/unit/test_corrections.py::test_mehrotra_keeps_a_correction_with_a_comparable_step[array_api_strict] FAILED tests/unit/test_corrections.py::test_mehrotra_fallback_returns_affine_when_the_centered_solve_fails[array_api_strict] FAILED tests/unit/test_corrections.py::test_gondzio_accumulates_partial_trial_residual_and_uses_gamma[array_api_strict] FAILED tests/unit/test_expand_indptr.py::test_expand_indptr_matches_searchsorted[array_api_strict-int64-empty_matrix-[]] FAILED tests/unit/test_expand_indptr.py::test_expand_indptr_matches_searchsorted[array_api_strict-int64-rows_all_empty-[0, 0, 0, 0]] FAILED tests/unit/test_expand_indptr.py::test_expand_indptr_matches_searchsorted[array_api_strict-int64-single_row-[7]] FAILED tests/unit/test_expand_indptr.py::test_expand_indptr_matches_searchsorted[array_api_strict-int64-single_empty_row-[0]] FAILED tests/unit/test_expand_indptr.py::test_expand_indptr_matches_searchsorted[array_api_strict-int64-leading_trailing_empty-[0, 0, 3, 1, 0, 0, 2, 0]] FAILED tests/unit/test_expand_indptr.py::test_expand_indptr_matches_searchsorted[array_api_strict-int64-random_0-[3, 0, 0, 3, 1, 2, 2, 5, 0, 0, 1, 1]] FAILED tests/unit/test_expand_indptr.py::test_expand_indptr_matches_searchsorted[array_api_strict-int64-random_1-[0, 5, 1]] FAILED tests/unit/test_expand_indptr.py::test_expand_indptr_matches_searchsorted[array_api_strict-int64-random_2-[0, 4, 0, 0, 0, 2, 2, 0]] FAILED tests/unit/test_expand_indptr.py::test_expand_indptr_matches_searchsorted[array_api_strict-int64-random_3-[3, 4, 0, 0, 0, 5, 4, 2, 3, 1, 5, 0, 0, 4, 1, 0, 0, 3, 2, 5, 0, 1, 0, 1, 2, 0, 0, 0, 5, 0, 2, 1, 0, 0, 0, 5, 3, 2, 3, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 1, 0, 5, 3, 0, 2, 5, 5]] FAILED tests/unit/test_expand_indptr.py::test_expand_indptr_matches_searchsorted[array_api_strict-int32-empty_matrix-[]] FAILED tests/unit/test_expand_indptr.py::test_expand_indptr_matches_searchsorted[array_api_strict-int32-rows_all_empty-[0, 0, 0, 0]] FAILED tests/unit/test_expand_indptr.py::test_expand_indptr_matches_searchsorted[array_api_strict-int32-single_row-[7]] FAILED tests/unit/test_expand_indptr.py::test_expand_indptr_matches_searchsorted[array_api_strict-int32-single_empty_row-[0]] FAILED tests/unit/test_expand_indptr.py::test_expand_indptr_matches_searchsorted[array_api_strict-int32-leading_trailing_empty-[0, 0, 3, 1, 0, 0, 2, 0]] FAILED tests/unit/test_expand_indptr.py::test_expand_indptr_matches_searchsorted[array_api_strict-int32-random_0-[3, 0, 0, 3, 1, 2, 2, 5, 0, 0, 1, 1]] FAILED tests/unit/test_expand_indptr.py::test_expand_indptr_matches_searchsorted[array_api_strict-int32-random_1-[0, 5, 1]] FAILED tests/unit/test_expand_indptr.py::test_expand_indptr_matches_searchsorted[array_api_strict-int32-random_2-[0, 4, 0, 0, 0, 2, 2, 0]] FAILED tests/unit/test_expand_indptr.py::test_expand_indptr_matches_searchsorted[array_api_strict-int32-random_3-[3, 4, 0, 0, 0, 5, 4, 2, 3, 1, 5, 0, 0, 4, 1, 0, 0, 3, 2, 5, 0, 1, 0, 1, 2, 0, 0, 0, 5, 0, 2, 1, 0, 0, 0, 5, 3, 2, 3, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 1, 0, 5, 3, 0, 2, 5, 5]] FAILED tests/unit/test_expand_indptr.py::test_expand_indptr_falls_back_without_array_repeat[array_api_strict-_NoRepeat] FAILED tests/unit/test_expand_indptr.py::test_expand_indptr_falls_back_without_array_repeat[array_api_strict-_RejectingRepeat] FAILED tests/unit/test_expand_indptr.py::test_expand_indptr_rejects_indptr_nnz_mismatch[array_api_strict] FAILED tests/unit/test_expand_indptr.py::test_csr_csc_constructors_use_identical_expansion[array_api_strict] FAILED tests/unit/test_feasible_kkt_acceptance.py::test_driver_passes_certifier_at_feasible_iterates[array_api_strict] FAILED tests/unit/test_feasible_kkt_acceptance.py::test_certifier_disabled_by_default[array_api_strict] FAILED tests/unit/test_feasible_kkt_acceptance.py::test_certifier_computes_a_real_kkt_decrease_verdict[array_api_strict] FAILED tests/unit/test_feasible_kkt_acceptance.py::test_certifier_threshold_is_honoured[array_api_strict] FAILED tests/unit/test_feasible_kkt_acceptance.py::test_certifier_advances_duals_even_for_a_null_primal_step[array_api_strict] FAILED tests/unit/test_feasible_kkt_acceptance.py::test_certifier_absent_at_infeasible_iterates[array_api_strict] FAILED tests/unit/test_filter_reset_on_mu_update.py::test_filter_is_reset_when_mu_decreases[array_api_strict] FAILED tests/unit/test_free_mode_acceptance.py::test_free_oracle_runs_the_weak_acceptance[array_api_strict] FAILED tests/unit/test_free_mode_acceptance.py::test_monitor_trip_reinstates_the_rigorous_search[array_api_strict] FAILED tests/unit/test_free_mode_acceptance.py::test_free_mode_acceptance_defaults_to_rigorous[array_api_strict] FAILED tests/unit/test_free_mode_acceptance.py::test_free_search_failure_switches_to_monotone[array_api_strict] FAILED tests/unit/test_free_mode_acceptance.py::test_weak_acceptance_is_inert_under_the_monotone_default[array_api_strict] FAILED tests/unit/test_hessian_lbfgs.py::test_lbfgs_run_matches_exact_optimum_with_bounded_overhead[array_api_strict] FAILED tests/unit/test_init_bounds.py::test_fixed_bound_pair_is_widened_symmetrically[array_api_strict] FAILED tests/unit/test_init_bounds.py::test_one_sided_and_absent_bounds_are_untouched[array_api_strict] FAILED tests/unit/test_init_recenter.py::test_active_slack_is_refloored_on_mu_and_poisoned_dual_is_clipped[array_api_strict] FAILED tests/unit/test_init_recenter.py::test_inactive_slack_and_consistent_dual_pass_through[array_api_strict] FAILED tests/unit/test_init_recenter.py::test_vanished_dual_is_raised_to_the_band_floor[array_api_strict] FAILED tests/unit/test_init_recenter.py::test_violated_constraint_gets_the_mu_floor[array_api_strict] FAILED tests/unit/test_kkt.py::test_normal_equations_signature_is_none_without_a_stable_pattern[array_api_strict] FAILED tests/unit/test_linear_ineq_lowering.py::test_operator_lowering_matches_reference[array_api_strict-opaque] FAILED tests/unit/test_linear_ineq_lowering.py::test_sparse_lowering_is_triplet_level_and_keeps_the_family[array_api_strict-coo] FAILED tests/unit/test_linear_ineq_lowering.py::test_sparse_lowering_is_triplet_level_and_keeps_the_family[array_api_strict-csr] FAILED tests/unit/test_linear_ineq_lowering.py::test_sparse_lowering_is_triplet_level_and_keeps_the_family[array_api_strict-csc] FAILED tests/unit/test_linear_ineq_lowering.py::test_sparse_lowering_is_triplet_level_and_keeps_the_family[array_api_strict-vstack] FAILED tests/unit/test_linear_ineq_lowering.py::test_vstack_lowering_keeps_per_block_precision_hints[array_api_strict] FAILED tests/unit/test_linear_ineq_lowering.py::test_sparse_lowering_keeps_a_declared_values_hint[array_api_strict] FAILED tests/unit/test_linear_ineq_lowering.py::test_sparse_lowering_derives_a_stable_pattern_key[array_api_strict] FAILED tests/unit/test_linear_ineq_lowering.py::test_operator_lowering_rejects_inverted_ranges[array_api_strict-csr] FAILED tests/unit/test_linear_ineq_lowering.py::test_operator_lowering_rejects_inverted_ranges[array_api_strict-vstack] FAILED tests/unit/test_linear_ineq_lowering.py::test_operator_lowering_rejects_bound_length_mismatch[array_api_strict-csr] FAILED tests/unit/test_linear_ineq_lowering.py::test_operator_lowering_rejects_bound_length_mismatch[array_api_strict-vstack] FAILED tests/unit/test_linear_ineq_lowering.py::test_all_unbounded_operator_block_lowers_to_nothing[array_api_strict-opaque] FAILED tests/unit/test_linear_ineq_lowering.py::test_operator_block_without_nonlinear_inequalities[array_api_strict-opaque] FAILED tests/unit/test_linear_ineq_lowering.py::test_operator_block_multipliers_are_sliced_off[array_api_strict-opaque-1] FAILED tests/unit/test_linear_ineq_lowering.py::test_matrix_free_block_lowers_through_the_wrapper[array_api_strict] FAILED tests/unit/test_linear_ineq_lowering.py::test_wrapper_to_coo_remaps_a_structured_inner_operator[array_api_strict] FAILED tests/unit/test_linear_ineq_lowering.py::test_csr_linear_ineq_no_longer_raises[array_api_strict] FAILED tests/unit/test_linear_ineq_lowering.py::test_dense_subclass_is_wrapped_so_its_overrides_survive[array_api_strict] FAILED tests/unit/test_linear_ineq_lowering.py::test_wrapper_coo_values_reuse_the_cached_selection[array_api_strict] FAILED tests/unit/test_linear_ineq_lowering.py::test_wrapper_without_a_pattern_key_rederives_its_coo[array_api_strict] FAILED tests/unit/test_linear_ineq_lowering.py::test_vstack_multipliers_are_ordered_block_by_block[array_api_strict] FAILED tests/unit/test_linear_ineq_lowering.py::test_vstack_subclass_is_wrapped_so_its_overrides_survive[array_api_strict] FAILED tests/unit/test_linear_ineq_lowering.py::test_vstack_with_one_bounded_block_is_not_restacked[array_api_strict] FAILED tests/unit/test_linear_ineq_lowering.py::test_row_selection_without_rows_adjoint_is_zero[array_api_strict] FAILED tests/unit/test_linear_ineq_lowering.py::test_wrapper_forwards_gram_coo_with_folded_weights[array_api_strict] FAILED tests/unit/test_mixed_precision_dense.py::test_gram_accumulate_dtype_hint_protocol[array_api_strict] FAILED tests/unit/test_mixed_precision_dense.py::test_solve_hs35_with_mixed_gram_matches_reference[array_api_strict] FAILED tests/unit/test_mu_schedule.py::test_complementarity_measures_average_and_min[array_api_strict] FAILED tests/unit/test_mu_schedule.py::test_complementarity_measures_bounds_only[array_api_strict] FAILED tests/unit/test_mu_schedule.py::test_schedule_solves_hs35_and_changes_mu_trace[array_api_strict-adaptive] FAILED tests/unit/test_mu_schedule.py::test_schedule_solves_hs35_and_changes_mu_trace[array_api_strict-breedveld] FAILED tests/unit/test_mu_schedule.py::test_schedule_solves_hs35_and_changes_mu_trace[array_api_strict-quality] FAILED tests/unit/test_mu_schedule.py::test_schedule_solves_bound_qp[array_api_strict-adaptive] FAILED tests/unit/test_mu_schedule.py::test_schedule_solves_bound_qp[array_api_strict-breedveld] FAILED tests/unit/test_mu_schedule.py::test_schedule_solves_bound_qp[array_api_strict-quality] FAILED tests/unit/test_mu_schedule.py::test_breedveld_schedule_keeps_mu_until_first_step[array_api_strict] FAILED tests/unit/test_mu_schedule.py::test_probing_standalone_solves_and_changes_mu_trace[array_api_strict] FAILED tests/unit/test_mu_schedule.py::test_quality_standalone_solves_and_changes_mu_trace[array_api_strict] FAILED tests/unit/test_mu_schedule.py::test_default_schedule_is_monotone[array_api_strict] FAILED tests/unit/test_mu_schedule.py::test_adaptive_oracle_steers_the_corrector[array_api_strict-mehrotra] FAILED tests/unit/test_mu_schedule.py::test_adaptive_oracle_steers_the_corrector[array_api_strict-gondzio] FAILED tests/unit/test_mu_schedule.py::test_breedveld_oracle_with_corrector_solves[array_api_strict] FAILED tests/unit/test_mu_schedule.py::test_probing_sigma_default_never_consults_the_mehrotra_rule[array_api_strict] FAILED tests/unit/test_mu_schedule.py::test_mehrotra_probing_sigma_solves_and_uses_the_breedveld_tau[array_api_strict] FAILED tests/unit/test_mu_schedule.py::test_breedveld_mehrotra_and_gondzio_variant_solve_hs35[array_api_strict] FAILED tests/unit/test_mu_schedule.py::test_centrality_floor_steers_free_mode_mu[array_api_strict] FAILED tests/unit/test_mu_schedule.py::test_forced_fallback_steers_mu_and_still_converges[array_api_strict] FAILED tests/unit/test_mu_schedule.py::test_driver_passes_infeasibility_to_fallback_mu[array_api_strict] FAILED tests/unit/test_public_sparse_operators.py::test_csr_expands_to_correct_coo_structure[array_api_strict] FAILED tests/unit/test_public_sparse_operators.py::test_csc_expands_to_correct_coo_structure[array_api_strict] FAILED tests/unit/test_public_sparse_operators.py::test_coo_values_matches_to_coo_values[array_api_strict] FAILED tests/unit/test_recenter_mu_escalation.py::test_first_feasible_recenter_keeps_mu[array_api_strict] FAILED tests/unit/test_recenter_mu_escalation.py::test_repeat_feasible_recenter_raises_mu[array_api_strict] FAILED tests/unit/test_recenter_mu_escalation.py::test_repeat_recenter_mu_capped_at_mu_init[array_api_strict] FAILED tests/unit/test_restoration.py::test_restoration_reduces_equality_violation[array_api_strict] FAILED tests/unit/test_restoration.py::test_matrix_free_restoration_uses_only_jacobian_products[array_api_strict] FAILED tests/unit/test_restoration.py::test_matrix_free_restoration_uses_the_truncated_krylov_iterate[array_api_strict] FAILED tests/unit/test_restoration.py::test_matrix_free_restoration_tracks_dense_on_an_ill_conditioned_jacobian[array_api_strict] FAILED tests/unit/test_restoration.py::test_matrix_free_restoration_does_not_fall_back_on_krylov_failure[array_api_strict] FAILED tests/unit/test_restoration.py::test_matrix_free_and_dense_restoration_match_with_active_bounds_and_inequality[array_api_strict] FAILED tests/unit/test_restoration.py::test_matrix_free_restoration_requires_an_adjoint[array_api_strict] FAILED tests/unit/test_restoration.py::test_solve_rejects_matrix_free_restoration_without_an_adjoint_up_front[array_api_strict] FAILED tests/unit/test_restoration.py::test_restoration_flags_inconsistent_equalities[array_api_strict] FAILED tests/unit/test_restoration.py::test_restoration_keeps_projected_bound_point_strictly_interior[array_api_strict] FAILED tests/unit/test_restoration.py::test_restoration_survives_singular_gauss_newton_system[array_api_strict] FAILED tests/unit/test_restoration.py::test_dense_gauss_newton_solve_propagates_non_numerical_errors[array_api_strict-TypeError] FAILED tests/unit/test_restoration.py::test_dense_gauss_newton_solve_propagates_non_numerical_errors[array_api_strict-MemoryError] FAILED tests/unit/test_restoration.py::test_rejected_lm_trials_reuse_the_jacobian[array_api_strict] FAILED tests/unit/test_restoration.py::test_bound_blocked_infeasibility_is_box_stationary[array_api_strict] FAILED tests/unit/test_restoration.py::test_restoration_recovers_inequality_slack_without_filter_residual[array_api_strict] FAILED tests/unit/test_restoration.py::test_blocked_bound_solves_the_reduced_system_on_the_free_set[array_api_strict] FAILED tests/unit/test_restoration.py::test_budget_exit_is_not_an_infeasibility_certificate[array_api_strict] FAILED tests/unit/test_restoration.py::test_stall_window_exit_is_not_an_infeasibility_certificate[array_api_strict] FAILED tests/unit/test_restoration.py::test_restoration_escapes_a_symmetric_saddle_before_certifying[array_api_strict-dense] FAILED tests/unit/test_restoration.py::test_restoration_escapes_a_symmetric_saddle_before_certifying[array_api_strict-krylov] FAILED tests/unit/test_restoration.py::test_restoration_still_certifies_a_genuine_local_minimum[array_api_strict] FAILED tests/unit/test_restoration.py::test_dense_route_forms_a_large_gram_capable_block_through_the_operator[array_api_strict] FAILED tests/unit/test_restoration.py::test_dense_route_keeps_small_blocks_byte_identical[array_api_strict] FAILED tests/unit/test_restoration.py::test_dense_route_decides_per_block_by_size[array_api_strict] FAILED tests/unit/test_restoration.py::test_dense_route_densifies_a_block_that_is_not_gram_capable[array_api_strict] FAILED tests/unit/test_restoration.py::test_restore_never_densifies_a_large_gram_capable_block[array_api_strict] FAILED tests/unit/test_restoration.py::test_dense_route_real_sparse_gram_operators_match_the_densified_reference[array_api_strict-signed_selection] FAILED tests/unit/test_restoration_cholesky.py::test_default_restoration_reproduces_the_lu_reference[array_api_strict-mixed] FAILED tests/unit/test_restoration_cholesky.py::test_explicit_lu_is_the_default_bit_for_bit[array_api_strict-hs6] FAILED tests/unit/test_restoration_cholesky.py::test_explicit_lu_is_the_default_bit_for_bit[array_api_strict-mixed] FAILED tests/unit/test_restoration_cholesky.py::test_cholesky_reaches_the_lu_feasible_point[array_api_strict] FAILED tests/unit/test_restoration_cholesky.py::test_cholesky_on_a_rank_deficient_gram_stays_on_the_manifold[array_api_strict] FAILED tests/unit/test_restoration_cholesky.py::test_cholesky_without_a_triangular_solve_uses_lu[array_api_strict] FAILED tests/unit/test_restoration_cholesky.py::test_cholesky_breakdown_falls_back_to_lu[array_api_strict] FAILED tests/unit/test_restoration_cholesky.py::test_non_finite_cholesky_factor_falls_back_to_lu[array_api_strict] FAILED tests/unit/test_restoration_cholesky.py::test_non_finite_cholesky_solution_falls_back_to_lu[array_api_strict] FAILED tests/unit/test_restoration_cholesky.py::test_raising_cholesky_solve_falls_back_to_lu[array_api_strict] FAILED tests/unit/test_restoration_cholesky.py::test_non_numerical_cholesky_errors_propagate[array_api_strict-TypeError] FAILED tests/unit/test_restoration_cholesky.py::test_non_numerical_cholesky_errors_propagate[array_api_strict-MemoryError] FAILED tests/unit/test_restoration_cholesky.py::test_singular_gauss_newton_system_survives_with_cholesky[array_api_strict] FAILED tests/unit/test_restoration_cholesky.py::test_solve_passes_the_dense_factorization_to_restoration[array_api_strict-lu] FAILED tests/unit/test_restoration_cholesky.py::test_solve_passes_the_dense_factorization_to_restoration[array_api_strict-cholesky] FAILED tests/unit/test_scaling.py::test_constraint_row_factors[array_api_strict] FAILED tests/unit/test_scaling.py::test_matrix_free_scaling_accepts_bulk_row_norm_callback[array_api_strict] FAILED tests/unit/test_scaling.py::test_linear_eq_combined_factor_orders_nonlinear_then_linear[array_api_strict] FAILED tests/unit/test_scaling.py::test_scaled_problem_applies_factors[array_api_strict] FAILED tests/unit/test_scipy_interface_backends.py::test_result_stays_in_the_input_namespace[array_api_strict] FAILED tests/unit/test_scipy_interface_backends.py::test_missing_jac_resolves_in_the_input_namespace[array_api_strict] FAILED tests/unit/test_scipy_interface_backends.py::test_nonlinear_constraint_with_exact_hessians[array_api_strict] FAILED tests/unit/test_scipy_interface_backends.py::test_scipy_constraint_objects_are_converted_to_the_input_namespace[array_api_strict] FAILED tests/unit/test_scipy_interface_backends.py::test_dict_constraints_and_callback_see_the_input_namespace[array_api_strict] FAILED tests/unit/test_scipy_interface_backends.py::test_array_like_constraint_hessian_is_converted[array_api_strict] FAILED tests/unit/test_scipy_interface_backends.py::test_objective_hess_may_return_an_ipax_operator[array_api_strict] FAILED tests/unit/test_scipy_interface_backends.py::test_jac_true_and_hessp_on_every_backend[array_api_strict] FAILED tests/unit/test_scipy_interface_backends.py::test_float32_solve_stays_float32_end_to_end[array_api_strict] FAILED tests/unit/test_slack_init_scale.py::test_default_scale_is_the_flat_floor[array_api_strict] FAILED tests/unit/test_slack_init_scale.py::test_large_constraints_scale_the_floor_up[array_api_strict] FAILED tests/unit/test_slack_init_scale.py::test_small_constraints_collapse_to_the_flat_floor[array_api_strict] FAILED tests/unit/test_slack_init_scale.py::test_larger_slack_floor_gives_proportionally_smaller_initial_duals[array_api_strict] FAILED tests/unit/test_trots_tiled_gram.py::test_non_numpy_namespaces_get_the_plain_block FAILED tests/unit/test_trots_tiled_gram.py::test_non_numpy_namespaces_keep_gated_off_groups_plain[array_api_strict] FAILED tests/unit/test_warm_start.py::test_warm_start_floors_slacks_and_bound_duals[array_api_strict] = 400 failed, 2853 passed, 261 skipped, 256 deselected, 33 warnings in 43.89s == error: Bad exit status from /var/tmp/rpm-tmp.eYPUln (%check) Bad exit status from /var/tmp/rpm-tmp.eYPUln (%check) RPM build errors: Finish: rpmbuild python-ipax-0.13.0-1.fc46.src.rpm Finish: build phase for python-ipax-0.13.0-1.fc46.src.rpm INFO: chroot_scan: 1 files copied to /var/lib/copr-rpmbuild/results/chroot_scan INFO: /var/lib/mock/fedora-rawhide-aarch64-1794038830.969969/root/var/log/dnf5.log INFO: chroot_scan: creating tarball /var/lib/copr-rpmbuild/results/chroot_scan.tar.gz /bin/tar: Removing leading `/' from member names ERROR: Exception(/var/lib/copr-rpmbuild/results/python-ipax-0.13.0-1.fc46.src.rpm) Config(fedora-rawhide-aarch64) 1 minutes 25 seconds INFO: Results and/or logs in: /var/lib/copr-rpmbuild/results INFO: Cleaning up build root ('cleanup_on_failure=True') Start: clean chroot INFO: unmounting tmpfs. Finish: clean chroot ERROR: Command failed: # /usr/bin/systemd-nspawn -q -M 60f2ba9bc46642b58433c5b58da04063 -D /var/lib/mock/fedora-rawhide-aarch64-1794038830.969969/root -a -u mockbuild --capability=cap_ipc_lock --capability=cap_ipc_lock --bind=/dev/btrfs-control --bind=/dev/mapper/control --bind=/dev/fuse --bind=/dev/loop-control --bind=/dev/loop0 --bind=/dev/loop1 --bind=/dev/loop2 --bind=/dev/loop3 --bind=/dev/loop4 --bind=/dev/loop5 --bind=/dev/loop6 --bind=/dev/loop7 --bind=/dev/loop8 --bind=/dev/loop9 --bind=/dev/loop10 --bind=/dev/loop11 --resolv-conf=off --resolv-conf=off --console=pipe --setenv=TERM=vt100 --setenv=SHELL=/bin/bash --setenv=HOME=/builddir --setenv=HOSTNAME=mock --setenv=PATH=/usr/bin:/bin:/usr/sbin:/sbin '--setenv=PROMPT_COMMAND=printf "\033]0;\007"' '--setenv=PS1= \s-\v\$ ' --setenv=LANG=C.UTF-8 bash --login -c '/usr/bin/rpmbuild -ba --noprep --noclean --target aarch64 /builddir/build/originals/python-ipax.spec' Copr build error: Build failed