root
root copied to clipboard
[PyROOT] Multiple issues with Numba.Declare
- it's natural for users to add const or reference qualifiers to the signature, but it does not work and results in errors that are hard to interpret for the user
- when using the generated functions from C++, it's not possible to pass temporaries in due to the non-const-ref signature. we could use const references instead, or generate an overload set of functions
import ROOT
import numpy as np
@ROOT.Numba.Declare(["const ROOT::VecOps::RVec<float>"], "RVecF")
def const_messes_up_generated_code(v):
return v*np.array([1.,2.]).astype(np.float32)
@ROOT.Numba.Declare(["RVec<float>&"], "RVecF")
def the_extra_ampersand_turns_ref_into_rvalue_ref(v):
return v*np.array([1.,2.]).astype(np.float32)
@ROOT.Numba.Declare(["RVecF"], "RVecF")
def cannot_pass_temporaries(v):
return v*np.array([1.,2.]).astype(np.float32)
if __name__ == "__main__":
ROOT.RDataFrame(10)\
.Define("v", "ROOT::RVecF{1.f,2.f}")\
.Define("err1", "Numba::const_messes_up_generated_code(v)")\
.Define("err2", "Numba::the_extra_ampersand_turns_ref_into_rvalue_ref(v)")\
.Define("err3", "Numba::cannot_pass_temporaries(v[v > 0])")\
.Sum("sz")\
.GetValue()