Repository navigation
Incomplete tests: default arguments #439
Description
Activity
A slightly longer run (with
--max-examples=3_000):Functions with
default onlyparameters-
Function names are shown without the
recording_backend.prefix. -
This report includes only functions with at least one parameter whose status is
default only. -
Status legend:
required= no default,non-default used= optional and used with a non-default value,default only= optional and only observed at default,default passed explicitly= optional and explicitly passed at its default. -
Functions listed: 21
-
Parameters covered: 75
Summary
Function Params Required Non-default used Default only Explicit default Parameters Array.__array_namespace__2 1 0 1 0 api_version(default only);self(required)arange5 1 3 1 0 device(default only);dtype(non-default used);start(required);step(non-default used);stop(non-default used)asarray4 1 2 1 0 copy(non-default used);device(default only);dtype(non-default used);obj(required)astype4 2 1 1 0 copy(non-default used);device(default only);dtype(required);x(required)empty_like3 1 1 1 0 device(default only);dtype(non-default used);x(required)eye5 1 3 1 0 device(default only);dtype(non-default used);k(non-default used);n_cols(non-default used);n_rows(required)fft.fftfreq4 1 2 1 0 d(non-default used);device(default only);dtype(non-default used);n(required)fft.rfftfreq4 1 2 1 0 d(non-default used);device(default only);dtype(non-default used);n(required)full4 2 1 1 0 device(default only);dtype(non-default used);fill_value(required);shape(required)full_like4 2 1 1 0 device(default only);dtype(non-default used);fill_value(required);x(required)linalg.trace3 1 1 1 0 dtype(default only);offset(non-default used);x(required)linspace6 3 2 1 0 device(default only);dtype(non-default used);endpoint(non-default used);num(required);start(required);stop(required)ones3 1 1 1 0 device(default only);dtype(non-default used);shape(required)ones_like3 1 1 1 0 device(default only);dtype(non-default used);x(required)reshape3 2 0 1 0 copy(default only);shape(required);x(required)std4 1 0 2 1 axis(default only);correction(default passed explicitly);keepdims(default only);x(required)sum4 1 1 2 0 axis(default only);dtype(non-default used);keepdims(default only);x(required)tril2 1 0 1 0 k(default only);x(required)triu2 1 0 1 0 k(default only);x(required)zeros3 1 1 1 0 device(default only);dtype(non-default used);shape(required)zeros_like3 1 1 1 0 device(default only);dtype(non-default used);x(required)Details
Array.__array_namespace__Parameter Status api_versiondefault only selfrequired arangeParameter Status devicedefault only dtypenon-default used startrequired stepnon-default used stopnon-default used asarrayParameter Status copynon-default used devicedefault only dtypenon-default used objrequired astypeParameter Status copynon-default used devicedefault only dtyperequired xrequired empty_likeParameter Status devicedefault only dtypenon-default used xrequired eyeParameter Status devicedefault only dtypenon-default used knon-default used n_colsnon-default used n_rowsrequired fft.fftfreqParameter Status dnon-default used devicedefault only dtypenon-default used nrequired fft.rfftfreqParameter Status dnon-default used devicedefault only dtypenon-default used nrequired fullParameter Status devicedefault only dtypenon-default used fill_valuerequired shaperequired full_likeParameter Status devicedefault only dtypenon-default used fill_valuerequired xrequired linalg.traceParameter Status dtypedefault only offsetnon-default used xrequired linspaceParameter Status devicedefault only dtypenon-default used endpointnon-default used numrequired startrequired stoprequired onesParameter Status devicedefault only dtypenon-default used shaperequired ones_likeParameter Status devicedefault only dtypenon-default used xrequired reshapeParameter Status copydefault only shaperequired xrequired stdParameter Status axisdefault only correctiondefault passed explicitly keepdimsdefault only xrequired sumParameter Status axisdefault only dtypenon-default used keepdimsdefault only xrequired trilParameter Status kdefault only xrequired triuParameter Status kdefault only xrequired zerosParameter Status devicedefault only dtypenon-default used shaperequired zeros_likeParameter Status devicedefault only dtypenon-default used xrequired -
So, to summarise, apart from the
deviceparameter, these are the functions (and their parameter) with missing coverage?Function Missing coverage sumaxis,keepdimsstdaxis,keepdims, non-defaultcorrectionreshapecopytrilktriuklinalg.tracedtypeArray.__array_namespace__api_versionI tried to print the generated argument inputs for
sumby addingprint(f"kw = {kw}")herearray_api_tests/test_statistical_functions.py::test_sum kw = {} kw = {} kw = {} kw = {'axis': (), 'dtype': None} kw = {} kw = {} kw = {'axis': 0, 'keepdims': False} kw = {} kw = {'axis': None, 'keepdims': False} kw = {} kw = {} kw = {} kw = {'axis': None, 'keepdims': False} kw = {'axis': None, 'keepdims': False} kw = {'axis': None, 'keepdims': False} kw = {'dtype': None, 'keepdims': False} kw = {'dtype': None, 'keepdims': False} kw = {'axis': -2, 'dtype': array_api_strict.float32, 'keepdims': True} kw = {'axis': -2, 'dtype': array_api_strict.float32, 'keepdims': True} kw = {'axis': 0, 'dtype': array_api_strict.float32, 'keepdims': True} kw = {'axis': 0, 'dtype': array_api_strict.float32, 'keepdims': False} kw = {'axis': 0, 'dtype': array_api_strict.float32, 'keepdims': False} kw = {'axis': 0, 'dtype': array_api_strict.float32, 'keepdims': False} kw = {'axis': 0, 'dtype': array_api_strict.float32, 'keepdims': False} kw = {'keepdims': False} kw = {'keepdims': False} kw = {'keepdims': False} kw = {'keepdims': False} kw = {'keepdims': False} kw = {} kw = {'axis': None, 'keepdims': False} kw = {'axis': None, 'keepdims': False} kw = {'dtype': None} kw = {'dtype': None} kw = {'axis': None, 'dtype': array_api_strict.complex128, 'keepdims': False} kw = {'axis': None, 'dtype': array_api_strict.complex128, 'keepdims': False} kw = {'axis': None, 'dtype': array_api_strict.complex128, 'keepdims': False} kw = {'axis': None, 'dtype': array_api_strict.complex128, 'keepdims': False} kw = {'axis': None, 'dtype': array_api_strict.complex128, 'keepdims': False} kw = {'axis': None, 'dtype': None} kw = {'axis': None, 'dtype': None} kw = {'axis': -2, 'dtype': None} kw = {'keepdims': False} kw = {'axis': None} kw = {'axis': None} kw = {} kw = {} kw = {} kw = {'dtype': None, 'keepdims': False} kw = {'axis': None, 'keepdims': False} kw = {'dtype': array_api_strict.float64, 'keepdims': False} kw = {'dtype': array_api_strict.float64, 'keepdims': False} kw = {'dtype': array_api_strict.float64, 'keepdims': False} kw = {'axis': None} kw = {'dtype': array_api_strict.float64, 'keepdims': False} kw = {'dtype': array_api_strict.int64} kw = {'dtype': array_api_strict.int64} kw = {'dtype': array_api_strict.int8} kw = {'dtype': array_api_strict.int8} kw = {} kw = {'axis': (1, -2), 'dtype': array_api_strict.complex64, 'keepdims': True} kw = {'axis': (1, -2), 'dtype': array_api_strict.complex64, 'keepdims': True} kw = {'axis': (-2,), 'keepdims': True} kw = {'axis': (-2,), 'keepdims': True} kw = {'axis': (-2,), 'keepdims': True} kw = {'axis': (-2,), 'keepdims': True} kw = {} kw = {'axis': None} kw = {'axis': None, 'dtype': None} kw = {'axis': (-1,), 'dtype': array_api_strict.uint8, 'keepdims': False} kw = {'axis': None} kw = {'axis': None} kw = {'keepdims': False} kw = {} kw = {} kw = {'dtype': array_api_strict.uint8} kw = {'dtype': array_api_strict.uint8} kw = {} kw = {'dtype': None, 'keepdims': True} kw = {'dtype': None, 'keepdims': False} kw = {'dtype': None, 'keepdims': False} kw = {'dtype': None, 'keepdims': False} kw = {'dtype': None, 'keepdims': False} kw = {'dtype': None} kw = {'dtype': None} kw = {'axis': None} kw = {'axis': None} kw = {'dtype': None} kw = {} kw = {} kw = {'dtype': None} kw = {'keepdims': False} kw = {'axis': (-1,), 'dtype': array_api_strict.int16} kw = {'keepdims': True} kw = {} kw = {'axis': None, 'dtype': None} kw = {'axis': None, 'dtype': None} kw = {'dtype': None} kw = {'dtype': None} kw = {'dtype': None, 'keepdims': False} kw = {} kw = {} kw = {} kw = {} kw = {'axis': None}IIUC, non-default inputs are generated here.
The checker is entirely vibe-coded, so yeah, let's treat what it emits as a hint and check manually other function, too.
Here's an analysis on the rest of the functions:
- Trimming down the output,
stddoes generate non-default inputs:
kw = {'axis': (), 'correction': 5.694276234840636, 'keepdims': True} kw = {'axis': (), 'correction': 5.694276234840636, 'keepdims': True} kw = {'correction': 0.0, 'keepdims': True} kw = {'correction': 0.0, 'keepdims': True} kw = {'correction': 0.0, 'keepdims': True} kw = {'axis': -2, 'correction': 0.14222324635672703} kw = {'axis': None, 'correction': 0.0} kw = {'axis': None, 'correction': 0.0} kw = {'correction': 0.0} kw = {'correction': 0.0, 'keepdims': True} kw = {'correction': 0.0, 'keepdims': False}test_reshapedoes not account forcopy, indeed:
def test_reshape(x, shape): - Apart from the signature test, I can't find dedicated tests for
trilandtriu
matrixy_names += ["__matmul__", "triu", "tril"] - In
linalg.trace, there is no dtype strategy. See:
def test_trace(x, kw): If I try to print generated inputs:
array_api_tests/test_linalg.py::test_trace kw={} kw={} kw={'offset': -272} kw={'offset': 211} kw={'offset': -138} kw={'offset': -292} kw={} kw={} kw={'offset': 563} kw={}
Which means that functions that are missing coverage are:
reshape: missing copy
tril: missing test
triu: missing test
linalg.trace: missing dtype- Trimming down the output,
Thanks!
reshape is #432
The other three would be great to have PRs for indeed.Reacted by Pradyot RanjanSince
deviceis already being tracked separately, I'll be happy to open another tracking issue fortriu,trilandlinalg.traceand close this one. Or maybe you can rename this PR title to something more accurate.No need for a separate issue, I'd think. Either a single PR or a sequence, whichever works.
Reacted by Pradyot RanjanTo summarize:
- ENH: Adding tests for
trilandtriu#442 addedtest_trilandtest_triu. - ENH: Adding
dtypeparameter to the test forlinalg.trace#441 addsdtypetotest_trace. reshape'scopy=is blocked at ENH: reshape: test copy= kwarg #432- The rest are false positives.
Let's close this.
Reacted by Pradyot Ranjan- ENH: Adding tests for
A kind of related to gh-301: I asked GPT5.4 to write a wrapper on top of
array-api-strictwhich, for each function call, looks at the arguments the function is called with, and compares the actual argument with the default value for the corresponding formal parameter. The goal is to find functions where the test suite never generates non-default parameter values.Then, running the test suite produces the output below.
devicearguments are Test device support #302 (and we cannot easily fix it in the test suite without sacrificing CuPy coverage, cf ENH: Adddevice=arguments to array creation functions cupy/cupy#9848)