Skip to content

Conversation

JaRoSchm
Copy link
Contributor

@JaRoSchm JaRoSchm commented Sep 3, 2025

closes #2

Checklist

  • Used a personal fork of the feedstock to propose changes
  • Bumped the build number (if the version is unchanged)
  • Reset the build number to 0 (if the version changed)
  • Re-rendered with the latest conda-smithy (Use the phrase @conda-forge-admin, please rerender in a comment in this PR for automated rerendering)
  • Ensured the license file is being packaged.

Hi @SwayamInSync, sadly I don't have enough time today and probably this week to try to finish this. This is the best I could come up with right now. Locally, this was only tested on Linux (even there it doesn't work yet), but will definitely not work on other platforms. I am more than happy if someone else is able to help here as I have no experience with meson.

Additionally to the updated version, I took the freedom to bump this to a v1 recipe using rattler-build and pixi as build tools. For working locally on this, the commands pixi run lint, pixi run rerender and pixi run build are very helpful.

@conda-forge-admin
Copy link
Contributor

Hi! This is the friendly automated conda-forge-linting service.

I just wanted to let you know that I linted all conda-recipes in your PR (recipe/recipe.yaml) and found it was in an excellent condition.

@JaRoSchm

This comment was marked as outdated.

1 similar comment
@JaRoSchm

This comment was marked as outdated.

@JaRoSchm
Copy link
Contributor Author

JaRoSchm commented Sep 3, 2025

@SwayamInSync The current problem under Linux seems to be due to QBLAS not being present. I tried to disable it for now, but in meson.build it is always looked for the directory, which is however not present in the sdist from PyPI. I think the best solution would be to also publish QBLAS on conda-forge such that we can depend on it here. Otherwise we have to clone the QBLAS git repo during build time here. What would you suggest?

@SwayamInSync
Copy link
Member

@JaRoSchm thanks a lot for your effort and catching the issue.
QBLAS is a C++ header only template library (which is used as a submodule in numpy-quaddtype) so I am not sure how we can publish that on conda-forge. Maybe cloning can work

I'll also check and try to update the sdist over PyPI to contain the submodule

@JaRoSchm

This comment was marked as outdated.

@JaRoSchm
Copy link
Contributor Author

JaRoSchm commented Sep 4, 2025

Looks like the linux build works now! I noticed that the license file is missing in the sdist. This is probably important to fix.

There are, however, many test failures right now. Can you spot what is going wrong there?

@SwayamInSync
Copy link
Member

I checked and the repo didn't include the MANIFEST.in file so it seems other files including submodules are missing from sdist. I'll see if I can upload a new sdist without disturbing the versioning.

One more thing I noticed that recipe is fetching sleef from conda-forge (3.9) we clone the 3.8 from source and I just checked that it is missing too in sdist
here are the steps we use in our CI to clone and build sleef

git clone --branch 3.8 https://github.com/shibatch/sleef.git
cd sleef
cmake -S . -B build \
    -DSLEEF_BUILD_QUAD:BOOL=ON \
    -DSLEEF_BUILD_SHARED_LIBS:BOOL=ON \
    -DCMAKE_POSITION_INDEPENDENT_CODE=ON
cmake --build build/ --clean-first -j
cmake --install build --prefix /usr/local

CFLAGS="-I/usr/local/include -I{project}/numpy_quaddtype/QBLAS/include $CFLAGS"
CXXFLAGS="-I/usr/local/include -I{project}/numpy_quaddtype/QBLAS/include -fext-numeric-literals $CXXFLAGS"
LDFLAGS="-L/usr/local/lib64 -L/usr/local/lib -Wl,-rpath,/usr/local/lib64 -Wl,-rpath,/usr/local/lib -fopenmp $LDFLAGS"
LD_LIBRARY_PATH="/usr/local/lib64:/usr/local/lib:$LD_LIBRARY_PATH"

I think this might be too much manual tweaking, I will try to update the sdist to contain everything and that might can ease the workflow here

@SwayamInSync
Copy link
Member

or we might try pulling the 3.8 sleef from conda-forge

@JaRoSchm
Copy link
Contributor Author

JaRoSchm commented Sep 4, 2025

Yeah, I tried pinning sleef to 3.8 locally already, but this did not help (I pushed it a moment ago). I think in principle using sleef from conda-forge should be the preferred option here. And some tests are passing, so it does not seem to go completely wrong.

@JaRoSchm
Copy link
Contributor Author

JaRoSchm commented Sep 4, 2025

Actually, it seems to be that test_array_comparisons is the only one which fails.

@SwayamInSync
Copy link
Member

Yes, that's why I thought maybe in 3.9 something is breaking there. Since on our CI building from 3.8 source works on all platforms.
I'll investigate further on this

@JaRoSchm
Copy link
Contributor Author

JaRoSchm commented Sep 5, 2025

Another interesting observation is that the number of failed test_array_comparisons tests differs for repeated local builds. In the CI runs it also differs between python 3.10/11, 3.12 and 3.13.

@SwayamInSync
Copy link
Member

This is very weird, I am not exactly sure the root cause.
Here is how this sdist was generated https://github.com/numpy/numpy-user-dtypes/blob/b4a9429dc6c449cf533a81352f71511e420ff50e/.github/workflows/build_wheels.yml#L256C2-L310C42

other than LISCENCE and QBLAS, it seem to have the correct updated code files. I am not very well known about this but can you please take a look at the mentioned file and see if there is any issue that causing this conflict?

@SwayamInSync
Copy link
Member

I manually tried building sdist then installing and testing on top it. Everything seems to work

As my wild guess, can we try building sleef from source just as a test? since logically those failed tests rely on Sleef APIs maybe this can give us better insight.
But first please take a look at sdist generation and confirm this is we intend

I'm so sorry for this hassle.

@JaRoSchm
Copy link
Contributor Author

JaRoSchm commented Sep 5, 2025

I compared the files from the numpy-user-dtypes git repo and from the sdist and they are exactly the same. Your sdist publishing seems to work correctly!

Concerning building sleef from source here: This sounds like a good attempt but I didn't have enough time to get this working locally.

Here is what is used by conda-forge to build sleef (see https://github.com/conda-forge/sleef-feedstock/blob/main/recipe/build.sh):

mkdir build
cd build

if [[ "$target_platform" == linux-* ]]; then
    LDFLAGS="-lrt ${LDFLAGS}"
fi

cmake ${CMAKE_ARGS} \
    -GNinja \
    -DCMAKE_BUILD_TYPE=Release \
    -DSLEEF_BUILD_TESTS=OFF \
    -DSLEEF_BUILD_SHARED_LIBS=ON \
    -DSLEEF_BUILD_SCALAR_LIB=ON \
    -DSLEEF_BUILD_QUAD=ON \
    -DSLEEF_BUILD_GNUABI_LIBS=ON \
    -DSLEEF_ENABLE_TLFLOAT=OFF \
    -DCMAKE_INSTALL_PREFIX=$PREFIX \
    -DCMAKE_PREFIX_PATH=$PREFIX \
    -DCMAKE_INSTALL_LIBDIR=lib \
    ..

ninja -j${CPU_COUNT} install

Does something look to you like it could cause problems?

@JaRoSchm
Copy link
Contributor Author

JaRoSchm commented Sep 5, 2025

And please don't worry, I am really thankful for your work on quaddtype and look forward to start using it!

@SwayamInSync
Copy link
Member

Thanks @JaRoSchm I'm right putting everything to sdist (including sleef) testing it over our repo and as all goes well.
We probably won't be requiring any manual hustle here. It would be done this weekend so probably we can again give a shot on upcoming Monday

@SwayamInSync
Copy link
Member

Hey @JaRoSchm we are ready to do another release, and I was just thinking that will it be possible for you to test on sdist from our repo to confirm things look good (lisence, readme, sleef and other requirements) and once confirm we can push the release to PyPI and we can synchronize it here?

@JaRoSchm
Copy link
Contributor Author

I will have a look.

@SwayamInSync
Copy link
Member

@JaRoSchm I think we can unpin sleef from conda-forge and maybe we can also skip the meson build command, it should be as simple as just doing

python -m pip install . -v

@JaRoSchm
Copy link
Contributor Author

rattler-build is not able to pull the sdist directly from the CI of numpy-user-dtypes directly, therefore I temporarily added the content of the latest sdist from the main branch here for testing. Locally, this builds fine (with tests still failing). However, here in the conda-forge CI already the build is failing. Maybe the conda-forge environment flags like CMAKE_ARGS aren't correctly propagated through meson?

@SwayamInSync
Copy link
Member

Locally, this builds fine (with tests still failing).

Are these the same tests?

@JaRoSchm
Copy link
Contributor Author

Yes and additionally test_suppported_astype:

 │ =========================== short test summary info ============================
 │ FAILED tests/test_quaddtype.py::test_supported_astype[bool] - AssertionError:...
 │ FAILED tests/test_quaddtype.py::test_supported_astype[byte] - AssertionError:...
 │ FAILED tests/test_quaddtype.py::test_supported_astype[int8] - AssertionError:...
 │ FAILED tests/test_quaddtype.py::test_supported_astype[ubyte] - AssertionError...
 │ FAILED tests/test_quaddtype.py::test_supported_astype[uint8] - AssertionError...
 │ FAILED tests/test_quaddtype.py::test_supported_astype[short] - AssertionError...
 │ FAILED tests/test_quaddtype.py::test_supported_astype[int16] - AssertionError...
 │ FAILED tests/test_quaddtype.py::test_supported_astype[ushort] - AssertionErro...
 │ FAILED tests/test_quaddtype.py::test_supported_astype[uint16] - AssertionErro...
 │ FAILED tests/test_quaddtype.py::test_supported_astype[int] - AssertionError: ...
 │ FAILED tests/test_quaddtype.py::test_supported_astype[int32] - AssertionError...
 │ FAILED tests/test_quaddtype.py::test_supported_astype[uint] - AssertionError:...
 │ FAILED tests/test_quaddtype.py::test_supported_astype[uint32] - AssertionErro...
 │ FAILED tests/test_quaddtype.py::test_supported_astype[long] - AssertionError:...
 │ FAILED tests/test_quaddtype.py::test_supported_astype[ulong] - AssertionError...
 │ FAILED tests/test_quaddtype.py::test_supported_astype[longlong] - AssertionEr...
 │ FAILED tests/test_quaddtype.py::test_supported_astype[int64] - AssertionError...
 │ FAILED tests/test_quaddtype.py::test_supported_astype[ulonglong] - AssertionE...
 │ FAILED tests/test_quaddtype.py::test_supported_astype[uint64] - AssertionErro...
 │ FAILED tests/test_quaddtype.py::test_supported_astype[half] - AssertionError:...
 │ FAILED tests/test_quaddtype.py::test_supported_astype[float16] - AssertionErr...
 │ FAILED tests/test_quaddtype.py::test_supported_astype[float] - AssertionError...
 │ FAILED tests/test_quaddtype.py::test_supported_astype[float32] - AssertionErr...
 │ FAILED tests/test_quaddtype.py::test_supported_astype[double] - AssertionErro...
 │ FAILED tests/test_quaddtype.py::test_supported_astype[float64] - AssertionErr...
 │ FAILED tests/test_quaddtype.py::test_supported_astype[longdouble] - Assertion...
 │ FAILED tests/test_quaddtype.py::test_supported_astype[float128] - AssertionEr...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[3.0-3.0-eq] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[3.0-3.0-lt] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[3.0-3.0-ge] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[3.0-12.5-ne] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[3.0-12.5-le] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[3.0-12.5-lt] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[3.0-12.5-ge] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[3.0-12.5-gt] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[3.0-100.0-ne] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[3.0-100.0-le] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[3.0-100.0-lt] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[3.0-100.0-ge] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[3.0-100.0-gt] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[3.0-0.0-ne] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[3.0--0.0-ne] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[3.0-inf-ne] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[3.0-inf-le] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[3.0-inf-lt] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[3.0-inf-ge] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[3.0-inf-gt] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[3.0--inf-ne] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[3.0-nan-le] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[3.0-nan-lt] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[3.0--nan-le] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[3.0--nan-lt] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[12.5-3.0-ne] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[12.5-12.5-eq] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[12.5-12.5-lt] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[12.5-12.5-ge] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[12.5-100.0-ne] - Asser...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[12.5-100.0-le] - Asser...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[12.5-100.0-lt] - Asser...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[12.5-100.0-ge] - Asser...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[12.5-100.0-gt] - Asser...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[12.5-0.0-ne] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[12.5--0.0-ne] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[12.5-inf-ne] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[12.5-inf-le] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[12.5-inf-lt] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[12.5-inf-ge] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[12.5-inf-gt] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[12.5--inf-ne] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[12.5-nan-le] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[12.5-nan-lt] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[12.5--nan-le] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[12.5--nan-lt] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[100.0-3.0-ne] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[100.0-12.5-ne] - Asser...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[100.0-100.0-eq] - Asse...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[100.0-100.0-lt] - Asse...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[100.0-100.0-ge] - Asse...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[100.0-0.0-ne] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[100.0--0.0-ne] - Asser...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[100.0-inf-ne] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[100.0-inf-le] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[100.0-inf-lt] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[100.0-inf-ge] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[100.0-inf-gt] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[100.0--inf-ne] - Asser...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[100.0-nan-le] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[100.0-nan-lt] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[100.0--nan-le] - Asser...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[100.0--nan-lt] - Asser...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[0.0-3.0-ne] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[0.0-3.0-le] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[0.0-3.0-lt] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[0.0-3.0-ge] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[0.0-3.0-gt] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[0.0-12.5-ne] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[0.0-12.5-le] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[0.0-12.5-lt] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[0.0-12.5-ge] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[0.0-12.5-gt] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[0.0-100.0-ne] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[0.0-100.0-le] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[0.0-100.0-lt] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[0.0-100.0-ge] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[0.0-100.0-gt] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[0.0-0.0-eq] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[0.0-0.0-lt] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[0.0-0.0-ge] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[0.0--0.0-eq] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[0.0--0.0-lt] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[0.0--0.0-ge] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[0.0-inf-ne] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[0.0-inf-le] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[0.0-inf-lt] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[0.0-inf-ge] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[0.0-inf-gt] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[0.0--inf-ne] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[0.0-nan-le] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[0.0-nan-lt] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[0.0--nan-le] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[0.0--nan-lt] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-0.0-3.0-ne] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-0.0-3.0-le] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-0.0-3.0-lt] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-0.0-3.0-ge] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-0.0-3.0-gt] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-0.0-12.5-ne] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-0.0-12.5-le] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-0.0-12.5-lt] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-0.0-12.5-ge] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-0.0-12.5-gt] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-0.0-100.0-ne] - Asser...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-0.0-100.0-le] - Asser...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-0.0-100.0-lt] - Asser...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-0.0-100.0-ge] - Asser...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-0.0-100.0-gt] - Asser...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-0.0-0.0-eq] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-0.0-0.0-lt] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-0.0-0.0-ge] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-0.0--0.0-eq] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-0.0--0.0-lt] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-0.0--0.0-ge] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-0.0-inf-ne] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-0.0-inf-le] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-0.0-inf-lt] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-0.0-inf-ge] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-0.0-inf-gt] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-0.0--inf-ne] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-0.0-nan-le] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-0.0-nan-lt] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-0.0--nan-le] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-0.0--nan-lt] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[inf-3.0-ne] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[inf-12.5-ne] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[inf-100.0-ne] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[inf-0.0-ne] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[inf--0.0-ne] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[inf-inf-eq] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[inf-inf-lt] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[inf-inf-ge] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[inf--inf-ne] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[inf-nan-le] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[inf-nan-lt] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[inf--nan-le] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[inf--nan-lt] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-inf-3.0-ne] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-inf-3.0-le] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-inf-3.0-ge] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-inf-12.5-ne] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-inf-12.5-le] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-inf-12.5-lt] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-inf-12.5-ge] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-inf-100.0-ne] - Asser...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-inf-100.0-le] - Asser...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-inf-100.0-lt] - Asser...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-inf-100.0-ge] - Asser...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-inf-100.0-gt] - Asser...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-inf-0.0-ne] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-inf-0.0-le] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-inf-0.0-lt] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-inf-0.0-ge] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-inf-0.0-gt] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-inf--0.0-ne] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-inf--0.0-le] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-inf--0.0-lt] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-inf--0.0-ge] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-inf--0.0-gt] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-inf-inf-ne] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-inf-inf-le] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-inf-inf-lt] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-inf-inf-ge] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-inf-inf-gt] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-inf--inf-eq] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-inf--inf-lt] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-inf--inf-ge] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-inf-nan-le] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-inf-nan-lt] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-inf--nan-le] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-inf--nan-lt] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[nan-3.0-le] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[nan-3.0-lt] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[nan-12.5-le] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[nan-12.5-lt] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[nan-100.0-le] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[nan-100.0-lt] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[nan-0.0-le] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[nan-0.0-lt] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[nan--0.0-le] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[nan--0.0-lt] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[nan-inf-le] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[nan-inf-lt] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[nan--inf-le] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[nan--inf-lt] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[nan-nan-ne] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[nan-nan-le] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[nan-nan-lt] - Assertio...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[nan--nan-ne] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[nan--nan-le] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[nan--nan-lt] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-nan-3.0-le] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-nan-3.0-lt] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-nan-12.5-le] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-nan-12.5-lt] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-nan-100.0-le] - Asser...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-nan-100.0-lt] - Asser...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-nan-0.0-le] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-nan-0.0-lt] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-nan--0.0-le] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-nan--0.0-lt] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-nan-inf-le] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-nan-inf-lt] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-nan--inf-le] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-nan--inf-lt] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-nan-nan-ne] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-nan-nan-le] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-nan-nan-lt] - Asserti...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-nan--nan-ne] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-nan--nan-le] - Assert...
 │ FAILED tests/test_quaddtype.py::test_array_comparisons[-nan--nan-lt] - Assert...
 │ ==== 239 failed, 2862 passed, 1 skipped, 18 xfailed, 356 warnings in 4.53s =====

@SwayamInSync
Copy link
Member

However, here in the conda-forge CI already the build is failing. Maybe the conda-forge environment flags like CMAKE_ARGS aren't correctly propagated through meson?

I see so ninja and cmake is found but our meson is configured for "unix make" which is not available on conda-forge. I can change the script to use ninja if detected

@SwayamInSync
Copy link
Member

SwayamInSync commented Sep 10, 2025

Yes and additionally test_suppported_astype:

You sure, this is not getting linked to some locally installed sleef in your system?

Okay I am updating the meson and till then see if you can just clone our repo and do the following in a completely new temporary environment

pip install numpy meson-python pytest
#!/bin/bash
cd quaddtype

set -x
if [ -d "build/" ]; then
    rm -r build
    rm -rf dist/
    rm -rf subprojects/qblas
    rm -rf subprojects/sleef
fi

export CFLAGS="-g -O0"
export CXXFLAGS="-g -O0"
python -m pip uninstall -y numpy_quaddtype
python -m pip install . -v

Test failing does not make sense as on CI same tests are passing for 3 different OS, 7 different python versions incl. free-threading

@JaRoSchm
Copy link
Contributor Author

After adding make as a build dependency, the same tests are now failing in CI here.

@JaRoSchm
Copy link
Contributor Author

Sure, first you need to have pixi installed: https://pixi.sh/latest/installation/
As I am on a Linux machine anyways, I don't use a docker container at all. If this is the same for you, one simply has to run pixi run build-linux_64_python3.13.____cp313 and that's it (at least on this branch here, were pixi and rattler-build are used). This will create a local pixi environment in this folder. The full docker container should be used by pixi run build-locally, but I never tried this. Other helpful commands are pixi run lint and pixi run rerender.

I the build fails, you will get some output on the console which allows you to go to the work directory and run the build step-by-step manually for debugging.

@SwayamInSync
Copy link
Member

Oh man, found the found the culprit, there is a data corruption happening which somehow didn't got triggered in github CI.
I'll fix this in our repo and and re-test.
BTW do you have any idea what makes conda-forge system so different or strict maybe?

@JaRoSchm
Copy link
Contributor Author

That's great!

BTW do you have any idea what makes conda-forge system so different or strict maybe?

Honestly, I have no idea. I will try to think about it more after seeing the actual fix.

So in principle this means, that be could use the sleef already contained in conda-forge like in the original proposal, right? This way sleef wouldn't have to be built multiple times in conda-forge CI. What would be preferable from your point of view? I think the approach we are currently using here is similar to what scipy does. So both approaches are fine with me.

@SwayamInSync
Copy link
Member

so I was mistakenly casting the byte memory (char *) to entire union, expecting it'll be filling the right candidate of that union's elements violating the strict aliasing rule

here is the PR numpy/numpy-user-dtypes#148

@SwayamInSync
Copy link
Member

So in principle this means, that be could use the sleef already contained in conda-forge like in the original proposal, right? This way sleef wouldn't have to be built multiple times in conda-forge CI. What would be preferable from your point of view?

Yes, it should now also worked with conda-packaged sleef. For users installing from soruce code, SLEEF is a big bottleneck to handle its installation and then managing to provide correct shared library path.
I think we can keep the current setup, it is easier even in the recipe I am only using one command to build

build:
  number: 0
  script:
    - ${{ PYTHON }} -m pip install . -v
  skip:
    - win
    - osx

I will be checking later to utilize the ccache for improving build times

@SwayamInSync
Copy link
Member

@JaRoSchm the SDIST got generated on that PR, can you fetch that and test it one more time here

@SwayamInSync
Copy link
Member

I was getting the same error when building locally inside the docker. Does it require anything from package side?

@JaRoSchm
Copy link
Contributor Author

The problem is that I used numpy-quaddtype while you used numpy_quaddtype as a package name before. We have two options here:

  • Stay with numpy_quaddtype.
  • Ask the admin team to rename the package which would have the advantage that it is the same as on PyPI.

Anyways, I think you can move forward with the release, the build looks fine!

@SwayamInSync
Copy link
Member

I agree, let's keep the name with sync with PyPI.
So should I have to email this to admin? Or what's the procedure?

@JaRoSchm
Copy link
Contributor Author

JaRoSchm commented Sep 11, 2025

After reading https://github.com/conda-forge/admin-requests?tab=readme-ov-file#add-a-package-output-to-a-feedstock more carefully, I think renaming isn‘t an option, just adding an output. So I think we will have to stay with what we have.

@SwayamInSync
Copy link
Member

I think renaming isn‘t an option, just adding an output. So I think we will have to stay with what we have.

I see, and is it possible to completely upload the new and future sdist under the numpy-quaddtype? Let me also add @ngoldbaum for the opinion

# - ${{ PYTHON }} -m pip install --find-links dist numpy-quaddtype
- ${{ PYTHON }} -m pip install . -v
skip:
- win
Copy link
Member

Choose a reason for hiding this comment

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

And can we also test on these?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I will just try to add it. If it doesn’t work, I will try to fix it tomorrow (it’s getting late here). ;)

@ngoldbaum
Copy link

Let me also add @ngoldbaum for the opinion

Everything seems to be working now. I think it's ok for the package on pypi to use an underscore. Let's not change it. I'm also not sure if pypi's package name similarity detection would trigger and prevent an upload with the new name.

I also personally don't like it when packages have dashes in the name. It means the name of the package doesn't match the name of the "main" module exported by the package, which is a bad user experience IMO.

@JaRoSchm
Copy link
Contributor Author

I see, and is it possible to completely upload the new and future sdist under the numpy-quaddtype?

Yes, this shouldn’t be a problem, we just can’t use the name variable in the pypi url in recipe.yaml. I looked through the pull requests in https://github.com/conda-forge/admin-requests and the only option for renaming seems to be to archive this feedstock and create a new one. In my opinion this doesn’t sound like it’s worth it.

@SwayamInSync
Copy link
Member

Sure, so
PyPI: numpy-quaddtype
conda-forge: numpy_quaddtype

Anyways within the python interface it'll be use like numpy_quaddtype

@ngoldbaum pypi has the dash basically 🥲

@SwayamInSync
Copy link
Member

Sure, @JaRoSchm let me know when we can move to the release after testing windows and mac, you can plug the path back to PyPI source to fetch sdist from.
I'll make the release there

@ngoldbaum
Copy link

pypi has the dash basically 🥲

Ah, well, too bad. We're not the only ones. Looking at you scikit-learn...

@SwayamInSync
Copy link
Member

SwayamInSync commented Sep 11, 2025

@JaRoSchm from the errors it seems windows is compilng with QBLAS (which we keep disable because of incompatibility with MSVC, I can do it in the meson but for now this has to be explictly passed as flag) as follows (ONLY for Windows build):

export CFLAGS="/DDISABLE_QUADBLAS $CFLAGS"
export CXXFLAGS="/DDISABLE_QUADBLAS $CXXFLAGS"

@SwayamInSync
Copy link
Member

Cool, everything seems to work. Is it ready to merge @JaRoSchm ?
Also so after making release 0.2 pypi release, I just need to bump the version here?

@JaRoSchm
Copy link
Contributor Author

JaRoSchm commented Sep 12, 2025

No, this still contains the source code. As 0.1.0 was not able to be built on conda-forge, I will update this PR to 0.2.0 after you made the release and then you can go ahead and merge.

After that I will restart the migration in #3.

@JaRoSchm
Copy link
Contributor Author

@conda-forge-admin, please rerender

@JaRoSchm
Copy link
Contributor Author

@SwayamInSync If CI runs through, this is finally ready to be merged!

@ngoldbaum
Copy link

@JaRoSchm thanks for all your help and advice over here!

@SwayamInSync
Copy link
Member

Awesome, merging it

Thanks a lot @JaRoSchm for helping us out

@SwayamInSync SwayamInSync merged commit 7286569 into conda-forge:main Sep 12, 2025
15 checks passed
@JaRoSchm
Copy link
Contributor Author

It was a pleasure!

@JaRoSchm JaRoSchm deleted the update_version branch September 12, 2025 12:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Update version and get source from PyPI

4 participants