root icon indicating copy to clipboard operation
root copied to clipboard

[PyROOT] Multiple issues with Numba.Declare

Open eguiraud opened this issue 3 years ago • 0 comments

  1. 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
  2. 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()

eguiraud avatar Aug 31 '22 10:08 eguiraud