Skip to content

Commit

Permalink
Merge pull request #46 from IntelPython/update-code-base-for-newer-numpy
Browse files Browse the repository at this point in the history
Update code for newer NumPy
  • Loading branch information
oleksandr-pavlyk authored Jul 26, 2024
2 parents 64d9fdd + f0685e0 commit b0c5927
Show file tree
Hide file tree
Showing 7 changed files with 792 additions and 765 deletions.
1,291 changes: 693 additions & 598 deletions mkl_random/mklrand.pyx

Large diffs are not rendered by default.

22 changes: 11 additions & 11 deletions mkl_random/src/mkl_distributions.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
Copyright (c) 2017-2021, Intel Corporation
Copyright (c) 2017-2024, Intel Corporation
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
Expand Down Expand Up @@ -1510,7 +1510,7 @@ void irk_discrete_uniform_long_vec(irk_state *state, npy_intp len, long *res, co
int *buf = (int *)mkl_malloc(len * sizeof(int), 64);
assert(buf != nullptr);

err = viRngUniform(VSL_RNG_METHOD_UNIFORM_STD, state->stream, len, buf, -1, (const int)max);
err = viRngUniform(VSL_RNG_METHOD_UNIFORM_STD, state->stream, len, buf, -1, (int)max);
assert(err == VSL_STATUS_OK);

DIST_PRAGMA_VECTOR
Expand Down Expand Up @@ -1626,7 +1626,7 @@ void irk_rand_bool_vec(irk_state *state, npy_intp len, npy_bool *res, const npy_
buf = (int *)mkl_malloc(len * sizeof(int), 64);
assert(buf != nullptr);

err = viRngUniform(VSL_RNG_METHOD_UNIFORM_STD, state->stream, len, buf, (const int)lo, (const int)hi + 1);
err = viRngUniform(VSL_RNG_METHOD_UNIFORM_STD, state->stream, len, buf, (int)lo, (int)hi + 1);
assert(err == VSL_STATUS_OK);

DIST_PRAGMA_VECTOR
Expand Down Expand Up @@ -1666,7 +1666,7 @@ void irk_rand_uint8_vec(irk_state *state, npy_intp len, npy_uint8 *res, const np
buf = (int *)mkl_malloc(len * sizeof(int), 64);
assert(buf != nullptr);

err = viRngUniform(VSL_RNG_METHOD_UNIFORM_STD, state->stream, len, buf, (const int)lo, (const int)hi + 1);
err = viRngUniform(VSL_RNG_METHOD_UNIFORM_STD, state->stream, len, buf, (int)lo, (int)hi + 1);
assert(err == VSL_STATUS_OK);

DIST_PRAGMA_VECTOR
Expand Down Expand Up @@ -1706,7 +1706,7 @@ void irk_rand_int8_vec(irk_state *state, npy_intp len, npy_int8 *res, const npy_
buf = (int *)mkl_malloc(len * sizeof(int), 64);
assert(buf != nullptr);

err = viRngUniform(VSL_RNG_METHOD_UNIFORM_STD, state->stream, len, buf, (const int)lo, (const int)hi + 1);
err = viRngUniform(VSL_RNG_METHOD_UNIFORM_STD, state->stream, len, buf, (int)lo, (int)hi + 1);
assert(err == VSL_STATUS_OK);

DIST_PRAGMA_VECTOR
Expand Down Expand Up @@ -1746,7 +1746,7 @@ void irk_rand_uint16_vec(irk_state *state, npy_intp len, npy_uint16 *res, const
buf = (int *)mkl_malloc(len * sizeof(int), 64);
assert(buf != nullptr);

err = viRngUniform(VSL_RNG_METHOD_UNIFORM_STD, state->stream, len, buf, (const int)lo, (const int)hi + 1);
err = viRngUniform(VSL_RNG_METHOD_UNIFORM_STD, state->stream, len, buf, (int)lo, (int)hi + 1);
assert(err == VSL_STATUS_OK);

DIST_PRAGMA_VECTOR
Expand Down Expand Up @@ -1786,7 +1786,7 @@ void irk_rand_int16_vec(irk_state *state, npy_intp len, npy_int16 *res, const np
buf = (int *)mkl_malloc(len * sizeof(int), 64);
assert(buf != nullptr);

err = viRngUniform(VSL_RNG_METHOD_UNIFORM_STD, state->stream, len, buf, (const int)lo, (const int)hi + 1);
err = viRngUniform(VSL_RNG_METHOD_UNIFORM_STD, state->stream, len, buf, (int)lo, (int)hi + 1);
assert(err == VSL_STATUS_OK);

DIST_PRAGMA_VECTOR
Expand Down Expand Up @@ -1831,7 +1831,7 @@ void irk_rand_uint32_vec(irk_state *state, npy_intp len, npy_uint32 *res, const
if (lo)
shft++;

err = viRngUniform(VSL_RNG_METHOD_UNIFORM_STD, state->stream, len, (int *)res, (const int)(lo - shft), (const int)(hi - shft + 1U));
err = viRngUniform(VSL_RNG_METHOD_UNIFORM_STD, state->stream, len, (int *)res, (int)(lo - shft), (int)(hi - shft + 1U));
assert(err == VSL_STATUS_OK);

DIST_PRAGMA_VECTOR
Expand All @@ -1840,7 +1840,7 @@ void irk_rand_uint32_vec(irk_state *state, npy_intp len, npy_uint32 *res, const
}
else
{
err = viRngUniform(VSL_RNG_METHOD_UNIFORM_STD, state->stream, len, (int *)res, (const int)lo, (const int)hi + 1);
err = viRngUniform(VSL_RNG_METHOD_UNIFORM_STD, state->stream, len, (int *)res, (int)lo, (int)hi + 1);
assert(err == VSL_STATUS_OK);
}
}
Expand Down Expand Up @@ -1873,7 +1873,7 @@ void irk_rand_int32_vec(irk_state *state, npy_intp len, npy_int32 *res, const np
}
else
{
err = viRngUniform(VSL_RNG_METHOD_UNIFORM_STD, state->stream, len, (int *)res, (const int)lo, (const int)hi + 1);
err = viRngUniform(VSL_RNG_METHOD_UNIFORM_STD, state->stream, len, (int *)res, (int)lo, (int)hi + 1);
assert(err == VSL_STATUS_OK);
}
}
Expand Down Expand Up @@ -1921,7 +1921,7 @@ void irk_rand_uint64_vec(irk_state *state, npy_intp len, npy_uint64 *res, const
int *buf = (int *)mkl_malloc(len * sizeof(int), 64);
assert(buf != nullptr);

err = viRngUniform(VSL_RNG_METHOD_UNIFORM_STD, state->stream, len, buf, 0, (const int)rng);
err = viRngUniform(VSL_RNG_METHOD_UNIFORM_STD, state->stream, len, buf, 0, (int)rng);
assert(err == VSL_STATUS_OK);

DIST_PRAGMA_VECTOR
Expand Down
152 changes: 0 additions & 152 deletions mkl_random/src/numpy.pxd

This file was deleted.

82 changes: 82 additions & 0 deletions mkl_random/src/numpy_multiiter_workaround.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
/*
Copyright (c) 2024-2024, Intel Corporation
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of Intel Corporation nor the names of its contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#include "Python.h"
#include "numpy/arrayobject.h"

/* This header file is a work-around for issue
* https://github.com/numpy/numpy/issues/26990
*
* It is included once in mklrandom.pyx
*
* The work-around is needed to support building with
* NumPy < 2.0.0
*
* Once building transitions to using NumPy 2.0 only
* this file can be removed and corresponding changes
* in mklrand.pyx can be applied to always use
* `PyArray_MultiIter_SIZE`, PyArray_MultiIter_NDIM`,
* and `PyArray_MultiIter_DIMS`.
*/

#define WORKAROUND_NEEDED (defined(NPY_2_0_API_VERSION) && (NPY_API_VERSION >= NPY_2_0_API_VERSION))

#if !WORKAROUND_NEEDED
typedef struct {
PyObject_HEAD
int numiter;
npy_intp size;
npy_intp index;
int nd;
npy_intp dimensions[32];
void **iters;
} multi_iter_proxy_st;
#endif

npy_intp workaround_PyArray_MultiIter_SIZE(PyArrayMultiIterObject *multi) {
#if WORKAROUND_NEEDED
return PyArray_MultiIter_SIZE(multi);
#else
return ((multi_iter_proxy_st *)(multi))->size;
#endif
}

int workaround_PyArray_MultiIter_NDIM(PyArrayMultiIterObject *multi) {
#if WORKAROUND_NEEDED
return PyArray_MultiIter_NDIM(multi);
#else
return ((multi_iter_proxy_st *)(multi))->nd;
#endif
}

npy_intp* workaround_PyArray_MultiIter_DIMS(PyArrayMultiIterObject *multi) {
#if WORKAROUND_NEEDED
return PyArray_MultiIter_DIMS(multi);
#else
return (((multi_iter_proxy_st *)(multi))->dimensions);
#endif
}
2 changes: 1 addition & 1 deletion mkl_random/src/randomkit.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
Copyright (c) 2017-2019, Intel Corporation
Copyright (c) 2017-2024, Intel Corporation
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
Expand Down
6 changes: 4 additions & 2 deletions mkl_random/tests/test_random.py
Original file line number Diff line number Diff line change
Expand Up @@ -804,7 +804,8 @@ def test_randomdist_normal(randomdist):
np.testing.assert_allclose(actual, desired, atol=1e-8, rtol=1e-8)

rnd.seed(randomdist.seed, brng=randomdist.brng)
actual = rnd.normal(loc=.123456789, scale=2.0, size=(3, 2), method="BoxMuller2")
workaround = rnd.normal(loc=.123456789, scale=2.0, size=(4, 2), method="BoxMuller2")
actual = workaround[:3,:]
desired = np.array([[0.16673479781277187, 0.48153966449249175],
[-3.4809986872165952, -0.8101190082826486],
[-0.051937610825354905, 2.4088402362484342]])
Expand Down Expand Up @@ -902,7 +903,8 @@ def test_randomdist_standard_normal(randomdist):
np.testing.assert_allclose(actual, desired, atol=1e-7, rtol=1e-10)

rnd.seed(randomdist.seed, brng=randomdist.brng)
actual = rnd.standard_normal(size=(3, 2), method='BoxMuller2')
workaround = rnd.standard_normal(size=(4, 2), method='BoxMuller2')
actual = workaround[:3, :]
desired = np.array([[0.021639004406385935, 0.17904143774624587],
[-1.8022277381082976, -0.4667878986413243],
[-0.08769719991267745, 1.1426917236242171]])
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ def extensions():
depends = [
os.path.join("mkl_random", "src", "mkl_distributions.hpp"),
os.path.join("mkl_random", "src", "randomkit.h"),
os.path.join("mkl_random", "src", "numpy.pxd")
os.path.join("mkl_random", "src", "numpy_multiiter_workaround.h")
],
include_dirs = [os.path.join("mkl_random", "src"), np.get_include()] + mkl_include_dirs,
libraries = libs,
Expand Down

0 comments on commit b0c5927

Please sign in to comment.