Resolved Issues for the naginterfaces Python Package¶
This page lists resolved issues that affected the performance of naginterfaces before version 30.2.0.0. It consists of issues previously from the Known Issues document that are fixed in naginterfaces 30.2.0.0 and for which the description has been rotated over into this document, for reference.
Incorrect licensing codes used in utilities in the Kusari module
Requested workspace size has no effect in sparse symmetric systems setup
Incorrect results when discontiguous rank-1 NumPy arrays are used
MKL crashes when some vacuous problems are passed to LAPACK routines
Unable to solve some vacuous problems in certain eigenvalue routines
Possible unexpected error from multi-integrand vectorized quadrature
Cubic spline fitter can’t be used for continued sorted vectorization
Monitoring the solution may fail in rectangular second-order PDE solver
Crash in integer-constrained NLP solver when no linear constraints
Crash calculating lower-tail probabilities from mv normal distribution
Communication objects from LMM routines unusable with option getter
Exceptions raised on internal access to complex communication arrays
Licence-check utility crashes if non-ASCII characters in name of licence file
Lagrange multipliers may be inaccessible in the LP IPM solver
Workspace problems when using sparse matrix algebra in DAE solvers
Row-major input not accepted by first-order stiff ODE interpolators
Unhelpful monitoring output from some optimizers during query mode
Internal communication arrays mistakenly exposed in ODE interpolator
Unusable initializer for general nonlinear boundary-value ODEs
Rank-1 NumPy arrays can be wrongly accepted when rank > 1 is expected
Incorrect labels returned by the submodel utility for model fitting
Inoperable NAG-supplied default monitoring in a shooting BVP solver
Reverse-communication best subset function unusable in a certain edge case
Inaccessible suggested values in the factorial ANOVA function
Usability barriers in the NAG optimization suite handle reader/writer
Missing callbacks not diagnosed by the interior point optimizer
Internal error from setup routine for implicit ODE/DAE solver in Python 3
Column-ordered arrays not supported by sum of squares optimizer
Incorrect licensing codes used in utilities in the Kusari module¶
Problem Since
28.3.0.0
Affected entities
Symptom
Licence keys for the
28X
line issued by NAG are rejected by the utilities in the Kusari module (for example, Licence not found is reported bynaginterfaces.kusari.lcheck()
).
Diagnosis
A format change in the 28.3 release has not been applied in these utilities.
Workaround
A
28X
key should still be recognized by the underlying algorithmic library, so it is merely a case of ignoring reports from the Kusari module or thequick_check
function that something is wrong.
Solution
Use the new format for the licence code in the Kusari module.
The module can be patched as follows
@@ -131,13 +131,14 @@ from .base.info import impl_details as b_impl_details from . import _THE_SYSTEM _PRODUCT_CODE = b_impl_details()['product_code'] +_KPRODUCT_CODE = _PRODUCT_CODE[:7] + 'X' + _PRODUCT_CODE[8:] def _has_lic(): """ Return a Boolean for when klcheck reports that a licence is available. """ return b_utils._capture_lcheck( # pylint: disable=protected-access - _PRODUCT_CODE, quiet=True, + _KPRODUCT_CODE, quiet=True, ).startswith('Licence available') def hostid(): @@ -151,18 +152,18 @@ def hostid(): >>> from naginterfaces.kusari import hostid >>> hostid() KUSARI ID = ... - NAG Library product code = ... + NAG Library product licensing code = ... Host name = ... """ # pylint: disable=superfluous-parens - if _PRODUCT_CODE.endswith('L'): + if _KPRODUCT_CODE.endswith('L'): print(b_utils._capture_hostid()) # pylint: disable=protected-access else: print( 'KUSARI ID = not required, ' 'because this product is not licence managed.' ) - print('NAG Library product code = ' + _PRODUCT_CODE) + print('NAG Library product licensing code = ' + _KPRODUCT_CODE) print('Host name = ' + _socket.gethostname()) def key_gui(): # pragma: no cover @@ -176,10 +177,10 @@ def key_gui(): # pragma: no cover if _THE_SYSTEM != 'Windows' and not _THE_SYSTEM.startswith('CYGWIN'): # pylint: disable=protected-access return - if not _PRODUCT_CODE.endswith('L'): + if not _KPRODUCT_CODE.endswith('L'): return - no_l_pcode = _PRODUCT_CODE[:9] + no_l_pcode = _KPRODUCT_CODE[:9] print( 'For a new licence request, the request form will be prefilled with' ) @@ -210,7 +211,7 @@ def lcheck(quiet=False): >>> lcheck(quiet=True) Licence available; ... """ - print('\n'.join(b_utils._lcheck_lines(_PRODUCT_CODE, quiet=quiet))) # pylint: disable=protected-access,superfluous-parens + print('\n'.join(b_utils._lcheck_lines(_KPRODUCT_CODE, quiet=quiet))) # pylint: disable=protected-access,superfluous-parens def _main(): """
Fixed in Release
28.3.0.1
Requested workspace size has no effect in sparse symmetric systems setup¶
Problem Since
26.2.0.0
Affected Entities
Symptom
The returned communication structure always has length 120, which may be too small and can result in an ‘Unexpected error‘
NagException
being raised by subsequent calls to the associated solver.
Diagnosis
The input or default
lwork
was mistakenly not being used when allocating the communication structure.
Workaround
None
Solution
Allocate the workspace array using the supplied
lwork
: innaginterfaces/base/sparse.py
@@ -12976,7 +12976,12 @@ _lwork = utils._EngineIntScalarType( lwork, {'fun_name': fun_name, 'entity': 'lwork'}, ).to_ctypes() - _work = utils._EngineFloat64ArrayType.empty_ctypes(120) + _lwork_py = utils._EngineIntScalarType.to_py(_lwork) + _lwork_py = max(120, _lwork_py) + _work = utils._EngineFloat64ArrayType.empty_ctypes(_lwork_py) + _lwork = utils._EngineIntScalarType( + _lwork_py, {'fun_name': fun_name, 'entity': 'lwork'}, + ).to_ctypes() _comm_py = {} _comm_py['work'] = _work _errbuf = utils._EngineErrbuf() @@ -14396,7 +14401,12 @@ _lwork = utils._EngineIntScalarType( lwork, {'fun_name': fun_name, 'entity': 'lwork'}, ).to_ctypes() - _work = utils._EngineComplex128ArrayType.empty_ctypes(120) + _lwork_py = utils._EngineIntScalarType.to_py(_lwork) + _lwork_py = max(120, _lwork_py) + _work = utils._EngineComplex128ArrayType.empty_ctypes(_lwork_py) + _lwork = utils._EngineIntScalarType( + _lwork_py, {'fun_name': fun_name, 'entity': 'lwork'}, + ).to_ctypes() _comm_py = {} _comm_py['work'] = _work _errbuf = utils._EngineErrbuf()
Fixed in Release
27.0.2.0
Note that the major release 27.1 completely removes this
lwork
functionality altogether and sets up the optimal workspace internally once and for all.
Crash in Hermitian eigenvalues routine¶
Problem Since
26.2.0.0
Affected Entities
Symptom
Possible crash when eigenvalues-only computation mode is selected.
Diagnosis
A bug in NAG metadata means that output array
isuppz
is not declared big enough whenjobz = 'N'
.
Workaround
Use mode
jobz = 'V'
instead.
Solution
Array
isuppz
should be size2*max(1, estimated_m)
in all cases, whereestimated_m = if erange in ('I', 'i') then iu - il +1 else n
.The patch is omitted because of its size. Please contact NAG if you would like more information.
Fixed in Release
27.0.1.1
Incorrect results when discontiguous rank-1 NumPy arrays are used¶
Problem Since
26.2.0.0
Affected Entities
Any NAG routine that takes one-dimensional array input.
Symptom
Incorrect results when a NAG routine is passed a rank-1 array which is not contiguous in either the C or the Fortran sense; for example,
y
inz = np.array([[42, 43], [44, 45]]); y = z[:, 0]
.
Diagnosis
The NAG Engine requires contiguous memory blocks but in this case the discontiguous descriptor is passed through unmodified. The NAG Engine therefore may access unanticipated parts of memory.
Workaround
Ensure all array input is contiguous. For NumPy
ndarray
structures this information is recorded in an instance’sflags
attribute, and casting to a contiguous array can be achieved using, for example,numpy.ascontiguousarray
.
Solution
Make discontiguous rank-1 arrays be contiguous before passing them to the NAG Engine: in
naginterfaces/library/_utils.py
@@ -195,6 +207,14 @@ if array is not None and not nd_cast.shape: nd_cast = to_ndarray_only([array]) + if ( + not copy and + len(nd_cast.shape) == 1 and + not nd_cast.flags.f_contiguous and + not nd_cast.flags.c_contiguous + ): + nd_cast = _np.ascontiguousarray(nd_cast) + _check_valid_ndarray(locus, nd_cast, exp_rank, exp_shape, exp_class) if (
Fixed in Release
27.0.1.1
MKL crashes when some vacuous problems are passed to LAPACK routines¶
Problem Since
26.2.0.0
Affected Entities
Symptom
When using the MKL-enabled NAG package, attempting to solve a zero-sized problem results in an MKL error message and an ‘Unexpected error‘
NagException
raised by the NAG wrapper.
Diagnosis
The implementation used by MKL for these routines contains a faulty workspace query for these vacuous problems.
Workaround
Consider avoiding calling the affected routine(s) altogether in such vacuous cases, because usally no work is actually done then anyway.
Alternatively, use the MKL-free variant of the NAG package.
Solution
Let the NAG wrapper control the workspace set up in these cases.
The patch is omitted because of its size. Please contact NAG if you would like more information.
Fixed in Release
27.0.1.1
Unable to solve some vacuous problems in certain eigenvalue routines¶
Problem Since
26.2.0.0
Affected Entities
Many routines in the
naginterfaces.library.lapackeig
submodule, for examplenaginterfaces.library.lapackeig.dsytrd()
.Please contact NAG if you would like more information.
Symptom
Attempting to solve a zero-sized problem results in a
NagShapeError
exception being raised.
Diagnosis
In the example
naginterfaces.library.lapackeig.dsytrd()
case, whenn
is zero the NAG routine detects an attempt to set up the output arraye
with length-1
.
Workaround
Consider avoiding calling the affected routine(s) altogether in such vacuous cases, because usally no work is actually done then anyway.
Solution
Set up the affected arrays to have minimum length
1
.For
naginterfaces.library.lapackeig.dsytrd()
, innaginterfaces/library/lapackeig.py
@@ -12128,13 +12128,13 @@ _d = _d_cls.to_ctypes(can_reference_contents=False) _e_cls = utils._EngineFloat64ArrayType( e, {'fun_name': fun_name, 'entity': 'e'}, - exp_shape=(_n_py-1,), + exp_shape=(max(1, _n_py-1),), check_contents=False,The full patch is omitted because of its size. Please contact NAG if you would like more information.
Fixed in Release
27.0.1.1
Possible unexpected error from multi-integrand vectorized quadrature¶
Problem Since
26.2.0.0
Affected Entities
Symptom
An ‘Unexpected error‘
NagException
, code-99:171,1003
or-99:191,1004
when a large amount of subdivision is required.
Diagnosis
The internal metadata used by the NAG wrapper for encoding the required lengths with which to set up the routine’s communication structure are suboptimal when subdivision is needed.
Workaround
The communication components for the integrator can be preallocated following options setting using sizes computed by
naginterfaces.library.quad.dim1_gen_vec_multi_dimreq()
ni = ??? ... comm = {} opt_set('Initialize = dim1_gen_vec_multi_rcomm', comm) opt_set(...) dims = dim1_gen_vec_multi_dimreq(ni, comm['iopts'], comm['opts']) comm['icom'] = base.utils._EngineIntArrayType.empty_ctypes(dims.licmax) comm['com'] = base.utils._EngineFloat64ArrayType.empty_ctypes(dims.lcmax) ...
Solution
Extract the maximum required array sizes internally by calling the size-query routine.
The patch is omitted because of its size. Please contact NAG if you would like more information.
Fixed in Release
27.0.1.1
Cubic spline fitter can’t be used for continued sorted vectorization¶
Problem Since
27.0.0.0
Affected Entities
Symptom
iwrk
is returned asNone
under first-phase sorted vectorization (start = 0
or1
) and so cannot be propagated to a subsequent continuation call (start = 2
).
Diagnosis
A bug in code generation has an incorrect condition for when
iwrk
contains useful information.
Workaround
Consider using
start = 0
(full sorted vectorization) or10
(unsorted vectorization). Otherwise, a patch is required.
Solution
Return
None
foriwrk
only under unsorted vectorization:naginterfaces/library/fit.py
@@ -2112,7 +2112,7 @@ _the_exc = _exc _reraise = True _ixloc_py = _ixloc - if _start_py == 2: + if _start_py not in (10, 11): _iwrk_py = _iwrk else: _iwrk_py = None
Fixed in Release
27.0.1.0
Monitoring the solution may fail in rectangular second-order PDE solver¶
Problem Since
26.2.0.0
Affected Entities
Symptom
The structure of
sol
inmonitr
is not correct.
Diagnosis
The internal expression used for computing the size of
sol
based on entries inlsol
is not correct.
Workaround
Perform no monitoring.
Solution
Set the size expression correctly: in
naginterfaces/base/pde.py
@@ -29327,7 +29327,7 @@ ) _sol_monitrh = utils._EngineFloat64ArrayType.from_pointer( sol, - (utils._EngineIntArrayType.get_element(lsol, {'fun_name': cb_monitr_name, 'entity': 'lsol'}, (_nlev_monitrh-1,), validate=False)+_npde_monitrh*utils._EngineIntArrayType.get_element(ngpts, {'fun_name': cb_monitr_name, 'entity': 'ngpts'}, (_nlev_monitrh-1,), validate=False),), + (utils._EngineIntArrayType.get_element(lsol, {'fun_name': cb_monitr_name, 'entity': 'lsol'}, (0,), validate=False)+_npde_monitrh*utils._EngineIntArrayType.get_element(ngpts, {'fun_name': cb_monitr_name, 'entity': 'ngpts'}, (0,), validate=False),), ) _ierr_monitrh = utils._EngineIntScalarType.to_py(ierr.contents) if data is not None:
Fixed in Release
27.0.1.0
Univariate summary combinator fails for row-ordered input¶
Problem Since
26.2.0.0
Affected Entities
Symptom
When called with a valid but row-ordered
mrcomm
the routine raisesNagValueError
that the structure is not in the expected format.
Diagnosis
A bug in code generation sets the lead dimension for this array incorrectly when it is row ordered.
Workaround
Supply
mrcomm
as a column-ordered array.
Solution
Set
ldmrcomm
using theget_nd
utility: innaginterfaces/base/stat.py
@@ -2735,7 +2738,7 @@ _b = utils._EngineIntScalarType( b, {'fun_name': fun_name, 'entity': 'b'}, ).to_ctypes() - _ldmrcomm_py = utils._EngineFloat64ArrayType.get_shape(mrcomm, {'fun_name': fun_name, 'entity': 'mrcomm'}, exp_rank=2)[0] + _ldmrcomm_py = utils._EngineFloat64ArrayType.get_nd(mrcomm, {'fun_name': fun_name, 'entity': 'mrcomm'}, exp_rank=2, sorder=_m_sorder, dim_type='l') _ldmrcomm = utils._EngineIntScalarType( _ldmrcomm_py, {'fun_name': fun_name, 'entity': '_ldmrcomm'}, ).to_ctypes()
Fixed in Release
27.0.1.0
Cannot set up reference vector for pseudorandom integers¶
Problem Since
26.2.0.0
Affected Entities
Symptom
When running with Python 2 the first three raise
TypeError
: ‘can’t multiply sequence by non-int of type ‘float’’.With Python 2 or 3,
naginterfaces.library.rand.int_negbin()
also raisesTypeError
but with message ‘’float’ object is not callable‘.
Diagnosis
The expression to set up the length of the reference vector
r
involvesceil
, which for the first three routines is missing a subsequent cast toint
.In
naginterfaces.library.rand.int_negbin()
a typo in code generation omits a/
operator.
Workaround
For the first three, use Python 3, where
ceil
returns integer values.Or, use
mode = 3
to generate variates without using the reference vector.
Solution
Add the missing cast to
int
and/
operator: innaginterfaces/base/rand.py
@@ -12790,7 +12790,7 @@ allow_none=True, ) if _mode_py != 3: - _r_dim1 = 22 + 20*ceil(sqrt(_m_py*_p_py*(1.-_p_py))) + _r_dim1 = 22 + 20*int(ceil(sqrt(_m_py*_p_py*(1.-_p_py)))) else: _r_dim1 = 1 _r = utils._EngineFloat64ArrayType.empty_ctypes(_r_dim1) @@ -14054,7 +14054,7 @@ allow_none=True, ) if _mode_py != 3: - _r_dim1 = 28 + 20*ceil(sqrt((_ns_py*_m_py*(_np_py-_m_py)*(_np_py-_ns_py))/_np_py**3)) + _r_dim1 = 28 + 20*int(ceil(sqrt((_ns_py*_m_py*(_np_py-_m_py)*(_np_py-_ns_py))/_np_py**3))) else: _r_dim1 = 1 _r = utils._EngineFloat64ArrayType.empty_ctypes(_r_dim1) @@ -14725,7 +14725,7 @@ allow_none=True, ) if _mode_py != 3: - _r_dim1 = 30 + 20*ceil(sqrt(_m_py*_p_cls.get_max(0, _k_py-1)*(1.-_p_cls.get_max(0, _k_py-1)))) + _r_dim1 = 30 + 20*int(ceil(sqrt(_m_py*_p_cls.get_max(0, _k_py-1)*(1.-_p_cls.get_max(0, _k_py-1))))) else: _r_dim1 = 1 _r = utils._EngineFloat64ArrayType.empty_ctypes(_r_dim1) @@ -15106,7 +15106,7 @@ allow_none=True, ) if _mode_py != 3: - _r_dim1 = 28 + int(ceil((20*sqrt(_m_py*_p_py)+30*_p_py)(1.-_p_py))) + _r_dim1 = 28 + int(ceil((20*sqrt(_m_py*_p_py)+30*_p_py)/(1.-_p_py))) else: _r_dim1 = 1 _r = utils._EngineFloat64ArrayType.empty_ctypes(_r_dim1)
Fixed in Release
27.0.1.0
Crash in integer-constrained NLP solver when no linear constraints¶
Problem Since
26.2.0.0
Affected Entities
Symptom
Spurious
NagShapeError
raised for some valid arrays when there are no linear constraints (anda
is not supplied).
Diagnosis
The number of variables,
n
, is inferred froma
and hence is considered to be zero whena
is omitted.
Workaround
None. A patch is required.
Solution
Infer
n
from the mandatoryx
: innaginterfaces/library/mip.py
@@ -4202,11 +4202,17 @@ ((_a, 'a'),), spiked_sorder=spiked_sorder, ) + _x = _utils._to_ndarray( + {'fun_name': fun_name, 'entity': 'x'}, + x, + copy=True, + ) + _n_py = _b_utils._EngineFloat64ArrayType.get_shape(_x, {'fun_name': fun_name, 'entity': 'x'}, exp_rank=1)[0] + _n = _b_utils._EngineIntScalarType( + _n_py, {'fun_name': fun_name, 'entity': '_n'}, + ).to_ctypes() if a is None: _a = None - _n = _b_utils._EngineIntScalarType( - 0 if a is None else _b_utils._EngineFloat64ArrayType.get_shape(_a, {'fun_name': fun_name, 'entity': 'a'}, exp_rank=2, allow_none=True)[1], {'fun_name': fun_name, 'entity': '_n'}, - ).to_ctypes() _nclin = _b_utils._EngineIntScalarType( 0 if a is None else _b_utils._EngineFloat64ArrayType.get_shape(_a, {'fun_name': fun_name, 'entity': 'a'}, exp_rank=2, allow_none=True)[0], {'fun_name': fun_name, 'entity': '_nclin'}, ).to_ctypes() @@ -4235,11 +4241,6 @@ varcon, copy=False, ) - _x = _utils._to_ndarray( - {'fun_name': fun_name, 'entity': 'x'}, - x, - copy=True, - ) _b_utils._check_callable(confun, {'fun_name': fun_name, 'entity': 'confun'}, allow_none=True) _confun = None if confun is None else cb_confun _ncnln = _b_utils._EngineIntScalarType( @@ -4249,7 +4250,6 @@ _c = _b_utils._EngineFloat64ArrayType.empty_ndarray( (_ncnln_py,), ) - _n_py = _b_utils._EngineIntScalarType.to_py(_n) _cjac = _b_utils._EngineFloat64ArrayType.empty_ndarray( (_ncnln_py, _n_py), sorder=_m_sorder,
Fixed in Release
27.0.0.1
Crash calculating lower-tail probabilities from mv normal distribution¶
Problem Since
26.2.0.0
Affected Entities
Symptom
NagShapeError
raised forb
whena
is not supplied (lower-tail probabilities).
Diagnosis
The dimension measure,
n
, is inferred froma
and hence is considered to be zero whena
is omitted.
Workaround
None. A patch is required.
Solution
Infer
n
from the mandatoryxmu
: innaginterfaces/library/stat.py
@@ -4385,6 +4385,15 @@ fun_name = 'naginterfaces.library.stat.prob_multi_normal' + _xmu = _utils._to_ndarray( + {'fun_name': fun_name, 'entity': 'xmu'}, + xmu, + copy=False, + ) + _n_py = _b_utils._EngineFloat64ArrayType.get_shape(_xmu, {'fun_name': fun_name, 'entity': 'xmu'}, exp_rank=1)[0] + _n = _b_utils._EngineIntScalarType( + _n_py, {'fun_name': fun_name, 'entity': '_n'}, + ).to_ctypes() _a = _utils._to_ndarray( {'fun_name': fun_name, 'entity': 'a'}, a, @@ -4391,9 +4400,6 @@ copy=False, allow_none=True, ) - _n = _b_utils._EngineIntScalarType( - 0 if a is None else _b_utils._EngineFloat64ArrayType.get_shape(_a, {'fun_name': fun_name, 'entity': 'a'}, exp_rank=1, allow_none=True)[0], {'fun_name': fun_name, 'entity': '_n'}, - ).to_ctypes() _b = _utils._to_ndarray( {'fun_name': fun_name, 'entity': 'b'}, b, @@ -4400,11 +4406,6 @@ copy=False, allow_none=True, ) - _xmu = _utils._to_ndarray( - {'fun_name': fun_name, 'entity': 'xmu'}, - xmu, - copy=False, - ) _sig = _utils._to_ndarray( {'fun_name': fun_name, 'entity': 'sig'}, sig,
Fixed in Release
27.0.0.1
Continuation mode crashes in VARMA mv time series realizer¶
Problem Since
26.2.0.0
Affected Entities
Symptom
If run with
mode = 3
and the communication structurecomm
correctly set up by a previous call thenNagValueError
, code11:11,11
, is raised claiming that the communication structure is incompatible.
Diagnosis
The NAG wrapper mistakenly treats
mode = 3
as a setup call, contrary to the expectations of the underlying algorithmic library.
Workaround
Use one of the other (non-continuation) modes.
Solution
Treat
mode = 3
the same asmode = 1
: innaginterfaces/base/rand.py
@@ -3968,7 +3968,7 @@ mutual_sorder=_m_sorder, ).to_ctypes() _mode_py = utils._EngineIntScalarType.to_py(_mode) - if _mode_py == 1: + if _mode_py in (1, 3): utils._check_comm( comm, {'fun_name': fun_name, 'entity': 'comm'}, req_keys=('r',),
Fixed in Release
27.0.0.1
Output matrices always returned by LMM fit routine¶
Problem Since
27.0.0.0
Affected Entities
Symptom
Arrays
cxx
,cxz
andczz
are always returned, and of full shape, even whenwantc = False
.
Diagnosis
A bug in code generation means that these arrays are always declared internally and then returned.
Workaround
None.
Solution
Don’t allocate or return these arrays when
wantc = False
.The patch is omitted because of its size. Please contact NAG if you would like more information.
Fixed in Release
27.0.0.1
Communication objects from LMM routines unusable with option getter¶
Problem Since
27.0.0.0
Affected Entities
Symptom
NagKeyError
raised when using the communication structure from these routines withnaginterfaces.library.correg.optget()
, for accessing metadata such as the number of fixed effects for the dataset.
Diagnosis
A bug in NAG routine internal annotations means that the communication structures used by these routines are not recognized by the option getter.
Workaround
The values for
nff
andnrf
can be obtained from the shapes of the returnedcxx
andczz
, respectively, fromnaginterfaces.library.correg.lmm_fit()
whenwantc = True
. For other parameters, a patch is required.
Solution
Use internal keys
'opts'
and'iopts'
for the communication data in these routines.The patch is omitted because of its size. Please contact NAG if you would like more information.
Fixed in Release
27.0.0.1
UnboundLocalError
raised by cubic spline fitter¶
Problem Since
27.0.0.0
Affected Entities
Symptom
Under first-phase sorted vectorization (
start = 0
or1
), the routine raisesUnboundLocalError
for local variable_liwrk_py
.
Diagnosis
A bug in code generation mistakenly omits type normalization for this internal artifact.
Workaround
Consider using
start = 10
or11
(unsorted vectorization). Otherwise, a patch is required.
Solution
Normalize the internal
_liwrk
to Python data: innaginterfaces/library/fit.py
@@ -2076,6 +2076,7 @@ _liwrk = _b_utils._EngineIntScalarType( 3+3*_nx_py, {'fun_name': fun_name, 'entity': '_liwrk'}, ).to_ctypes() + _liwrk_py = _b_utils._EngineIntScalarType.to_py(_liwrk) else: _liwrk_py = _b_utils._EngineIntArrayType.get_shape(_iwrk, {'fun_name': fun_name, 'entity': 'iwrk'}, exp_rank=1, allow_none=True)[0] _liwrk = _b_utils._EngineIntScalarType(
Fixed in Release
27.0.0.1
Unexpected error -6 from sparse complex equations solver¶
Problem Since
26.2.0.0
Affected Entities
Symptom
The solver exits with an ‘Unexpected error‘
NagException
, code-99:-6,99999
, when insufficiently-sized workspace had been created bynaginterfaces.library.sparse.complex_gen_basic_setup()
.
Diagnosis
The error exit in the solver for trapping this insufficient size is mistakenly omitted from the NAG wrapper.
Workaround
Ensure that the setup routine is called with
lwork
at least as big as the setup routine itself requests via itslwreq
return argument.
Solution
Reinstate the error exit: in
naginterfaces/base/sparse.py
@@ -2143,10 +2149,21 @@ _err_class = utils._EngineNoErrorExit() else: _ifmt, _eb_data = utils._EngineState._handle_global_errors(fun_name, _errbuf, _ierr_py) - if _ierr_py == -1 and _ifmt == 99909: + if _ierr_py == -6 and _ifmt == 99999: _err_class = utils._EngineErrorExit( fun_name=fun_name, msg_lines=[ + 'On entry, lwork = {:s}.'.format( + utils._STR_FMT_INT.format(_lwork_py), + ), + 'Constraint: lwork >= lwreq, where lwreq is returned by complex_gen_basic_setup.', + ], + errcodes=(_ierr_py, _ierr_py, _ifmt), + ) + elif _ierr_py == -1 and _ifmt == 99909: + _err_class = utils._EngineErrorExit( + fun_name=fun_name, + msg_lines=[ 'On intermediate re-entry, irevcm = {:s}.'.format( utils._STR_FMT_INT_AS_STR.format(_eb_data[1]), ),
Fixed in Release
27.0.0.1
Note also that the 27.1.0.0 release enhances the usability of this group of routines in such a way as to set up the optimal workspace internally once and for all. After that, this error exit becomes legitimately redundant.
Spurious exception from sparse complex equations diagnostic¶
Problem Since
26.2.0.0
Affected Entities
Symptom
NagTypeError
raised when querying the shape of the complex-valued communication array.
Diagnosis
These routines are mistakenly attempting to validate these arrays as user data.
Workaround
None. A patch is required.
Solution
These arrays don’t need validation because they have been set up and populated entirely by the NAG wrappers: in
naginterfaces/base/sparse.py
@@ -2376,7 +2376,7 @@ req_keys=('work',), ) _work = comm['work'] - _lwork_py = utils._EngineComplex128ArrayType.get_shape(comm['work'], {'fun_name': fun_name, 'entity': 'comm[\'work\']'}, exp_rank=1)[0] + _lwork_py = utils._EngineComplex128ArrayType.get_shape(comm['work'], {'fun_name': fun_name, 'entity': 'comm[\'work\']'}, exp_rank=1, validate=False)[0] _lwork = utils._EngineIntScalarType( _lwork_py, {'fun_name': fun_name, 'entity': '_lwork'}, ).to_ctypes() @@ -14397,7 +14397,7 @@ comm, {'fun_name': fun_name, 'entity': 'comm'}, req_keys=('work',), ) - _lwork_py = utils._EngineComplex128ArrayType.get_shape(comm['work'], {'fun_name': fun_name, 'entity': 'comm[\'work\']'}, exp_rank=1)[0] + _lwork_py = utils._EngineComplex128ArrayType.get_shape(comm['work'], {'fun_name': fun_name, 'entity': 'comm[\'work\']'}, exp_rank=1, validate=False)[0] _lwork = utils._EngineIntScalarType( _lwork_py, {'fun_name': fun_name, 'entity': '_lwork'}, ).to_ctypes()
Fixed in Release
27.0.0.1
Exceptions raised on internal access to complex communication arrays¶
Problem Since
26.2.0.0
Affected Entities
naginterfaces.library.sparse.complex_gen_basic_solver()
,naginterfaces.library.sparse.complex_herm_basic_solver()
,naginterfaces.library.sparseig.complex_band_solve()
,naginterfaces.library.sparseig.complex_iter()
,naginterfaces.library.sparseig.complex_monit()
,naginterfaces.library.sparseig.complex_option()
andnaginterfaces.library.sparseig.complex_proc()
Symptom
AttributeError
raised when a wrapper attempts to retrieve an element of a complex-valued communication array.
Diagnosis
Type resolution for these complex arrays is not taking into account the underlying compound data type correctly.
Workaround
None. A patch is required.
Solution
Don’t try to use the
value
attribute of the underlying scalar: innaginterfaces/base/utils.py
@@ -2969,10 +2969,17 @@ data_el = data_el.decode(encoding='ascii') return ( - data_el.value if isinstance( - data_el, ( - cls._underlying_scalar.c_type, - _ctypes.c_int, _ctypes.c_long, _ctypes.c_longlong, + data_el.value if ( + isinstance( + data_el, ( + cls._underlying_scalar.c_type, + _ctypes.c_int, _ctypes.c_long, _ctypes.c_longlong, + ) + ) and + not isinstance( + data_el, ( + _EngineComplex64Structure, _EngineComplex128Structure, + ) ) ) else data_el
Fixed in Release
27.0.0.1
Licence-check utility crashes if non-ASCII characters in name of licence file¶
Problem Since
26.2.0.0
Affected Entities
Symptom
UnicodeEncodeError
when this function is called under Python 3 if the environment variableNAG_KUSARI_FILE
is set to a file path that contains non-ASCII characters.Note that the operation of licensing within the compiled Library itself is unaffected.
Diagnosis
Internal processing of the captured output is trying to decode to ASCII.
Workaround
Store the licence file in a location that has only ASCII characters in its name.
Solution
Decode using the default
'utf-8'
encoding: innaginterfaces/base/utils.py
@@ -858,10 +858,12 @@ cmd_list.append('-quiet') cmd_list.append(pcode) + cmd_output = _subprocess.check_output(cmd_list) - lcheck_txt = _EngineCharScalarType.to_py( - _subprocess.check_output(cmd_list) - ).splitlines() + lcheck_txt = ( + cmd_output.decode() if _sys.version_info >= (3,) + else cmd_output + ).rstrip().splitlines() for lcheck_i, lcheck_line in enumerate(lcheck_txt):
Fixed in Release
27.0.0.1
Contradictory output from licence-check utility¶
Problem Since
26.2.1.1
Affected Entities
Symptom
When called with
quiet=False
and a licence is available, the output first claims that a licence could not be found before giving further text that says one was located.Note that the operation of licensing within the compiled Library itself is unaffected.
Diagnosis
Some internal processing of the captured output is not looking in the correct place for hook text saying
'Licence available'
.
Workaround
Call
lcheck
withquiet=True
, where the abbreviated output is accurate.
Solution
Look for
'Licence available'
anywhere in the captured output, innaginterfaces/base/utils.py
@@ -886,7 +886,7 @@ Return a list of lines forming a licensing message. """ l_line = _capture_lcheck(pcode, quiet=quiet) - if l_line.startswith('Licence available'): + if 'Licence available' in l_line: return [l_line] lc_lines = [ 'The NAG Library for Python on this platform uses',
Fixed in Release
27.0.0.1
Lagrange multipliers may be inaccessible in the LP IPM solver¶
Affected Entities
Symptom
The returned
u
isNone
when the inputu
isNone
.
Diagnosis
Attributes on
u
for code generation mistakenly mean that it beingNone
on input causes the outputu
to be suppressed.
Workaround
Supply an empty array of the correct size (
nnzu
) foru
on input to retrieve the populated outputu
.
Solution
Make
u
a keyword argument with defaultNone
. Query the problem handle to extract the correct value fornnzu
whenu
isNone
on input.This requires an API extension in the compiled NAG Engine, so there is no solution that can be applied only to the Python code in the package.
Fixed in Release
27.0.0.0
Problems with default callbacks when storage is row-major¶
Affected Entities
Symptom
Possible incorrect results when input data uses row-major storage and
None
is supplied for
start
innaginterfaces.library.glopt.nlp_multistart_sqp()
ornaginterfaces.library.glopt.nlp_multistart_sqp_lsq()
or
Diagnosis
The default callbacks used internally in these situations operate only in column-major order.
Workaround
Supply input in column-major order.
Alternatively, for
naginterfaces.library.mip.iqp_dense()
andnaginterfaces.library.opt.qp_dense_solve()
supply the input quadratic termh
as a full symmetric matrix.
Solution
Make the callbacks operate correctly in row-major order.
This is a bug in the compiled NAG Engine, so there is no solution that can be applied only to the Python code in the package.
Fixed in Release
27.0.0.0
Workspace problems when using sparse matrix algebra in DAE solvers¶
Affected Entities
naginterfaces.library.pde.dim1_parab_dae_fd()
,naginterfaces.library.pde.dim1_parab_dae_coll()
,naginterfaces.library.pde.dim1_parab_dae_keller()
,naginterfaces.library.pde.dim1_parab_convdiff_dae()
,naginterfaces.library.pde.dim1_parab_convdiff_remesh()
,naginterfaces.library.pde.dim1_parab_remesh_fd()
andnaginterfaces.library.pde.dim1_parab_remesh_keller()
Symptom
The solver raises an ‘Unexpected error’
NagException
and displays output saying that supplied integer or real workspace is too small, when sparse matrix methods are selected (laopt = 'S'
).
Diagnosis
The workspaces in questions are set up in the routine’s
comm
argument in its first call, but the sizes used may not be sufficient in advance.
Workaround
Once the sufficient sizes are known for the problem in question, from the displayed message output, set up
comm
explicitly. You may wish to use some of the internal utilities to make this slightly easierlrsave = big_enough_value_r lisave = big_enough_value_i # Instead of comm = {} for the first call: comm = { 'rsave': base.utils._EngineFloat64ArrayType.empty_ctypes(lrsave), 'isave': base.utils._EngineIntArrayType.empty_ctypes(lisave), 'cwsav': base.utils._EngineCharArrayType.empty_ctypes(10, chrlen=80), 'lwsav': base.utils._EngineLogicalArrayType.empty_ctypes(100), 'iwsav': base.utils._EngineIntArrayType.empty_ctypes(505), 'rwsav': base.utils._EngineFloat64ArrayType.empty_ctypes(1100), } ... dae_solver(..., comm, ...)
Solution
Allow
lisave
andlrsave
to be supplied in the call, as keyword arguments, in case the computed defaults are too small.Programmatic access to the sufficent sizes requires a change in the compiled NAG Engine.
Fixed in Release
27.0.0.0
Row-major input not accepted by first-order stiff ODE interpolators¶
Affected Entities
Symptom
Spurious exceptions raised if an array supplied for argument
ysav
is stored in row-major (C contiguous) order (which is the NumPy default).
Diagnosis
A bug in the Mark 26.2 NAG Library Engine treats row-ordered
ysav
incorrectly.
Workaround
Supply
ysav
in column-major (Fortran contiguous) order. The utilitynumpy.asfortranarray
may be of use.Note that if these interpolators are called from the
monitr
callback in one of the associated ODE solvers, the arrayysav
supplied by the callback will be in row-major order. It must thus be converted to column-major order for communication to the interpolator.
Solution
The array
ysav
is for the purposes of NAG communication only, so should be entered into acomm
structure. The array will then be treated uniformly as column ordered without any interaction required by the caller.
Fixed in Release
27.0.0.0
Unhelpful monitoring output from some optimizers during query mode¶
Affected Entities
naginterfaces.library.mip.iqp_sparse()
,naginterfaces.library.opt.lp_solve()
,naginterfaces.library.opt.lsq_gencon_deriv()
,naginterfaces.library.opt.lsq_lincon_solve()
,naginterfaces.library.opt.nlp1_rcomm()
,naginterfaces.library.opt.nlp1_solve()
,naginterfaces.library.opt.nlp1_sparse_solve()
,naginterfaces.library.opt.qpconvex1_sparse_solve()
andnaginterfaces.library.opt.qp_dense_solve()
Symptom
Superfluous monitoring output about invalid input parameters when monitoring/printing has been enabled. For
naginterfaces.library.mip.iqp_sparse()
,naginterfaces.library.opt.qpconvex1_sparse_solve()
andnaginterfaces.library.opt.nlp1_sparse_solve()
this is during a user-requested ‘workspace size query’ call. For the other functions in the list it is any time that monitoring is on.
Diagnosis
When monitoring is on and supplied workspace lengths are too short the underlying optimizers in the NAG Library Engine always print a monitoring header and a message that input is invalid. For the routines in the list that do not have a user-controllable query mode the query is still requested and managed internally by the routine.
Workaround
Monitoring output of this nature can safely be ignored.
Solution
This is a bug in the compiled NAG Engine, so there is no solution that can be applied only to the Python code in the package. In the fix, monitoring is disabled if a workspace query is underway.
Fixed in Release
27.0.0.0
Type-check failures in some circumstances now alleviated¶
Affected Entities
Potentially any.
Symptom
The package incorrectly raises
NagTypeError
claiming an incorrectly-typednumpy.ndarray
was supplied.
Diagnosis
Certain data types constructed on the fly by NumPy appear invalid to the package’s type checker.
Workaround
Explicitly converting to a valid type can help; i.e., instead of
nag_call(x, ...)try
nag_call(x.astype(int), ...)for integer input.
Solution
Consider numeric types to be invalid by direct comparison rather than by using
numpy.issubdtype
.The patch is omitted. Please contact NAG if you would like more information.
Fixed in Release
27.0.0.0
Unintuitive handling of spiked arrays in further situations¶
Affected Entities
Any function that does not take multidimensional array input but which has callback arguments that return multidimensional arrays, such as
naginterfaces.library.glopt.bnd_pso()
(monmod:x
).
Symptom
When all multidimensional arrays returned from a callback are ‘spiked’ (that is, with unit extent in all but one dimension, or with total size 1) and these are viewed as dually Fortran and C contiguous by NumPy (which is the case for NumPy from version 1.12 onward), an exception is raised, claiming that storage orders mismatch.
Diagnosis
The NAG function uses a default storage order of C contiguous because it has no multidimensional array input, but infers a storage order of Fortran contiguous (for performance) for the spiked arrays returned by the callback.
Workaround
None.
Solution
Make the affected routines accept the
spiked_sorder
argument.The patch is omitted because of its size. Please contact NAG if you would like more information.
Fixed in Release
26.2.2.4
Internal communication arrays mistakenly exposed in ODE interpolator¶
Affected Entities
Symptom
Usability problems in supplying correct values for arrays
ysav
andrwork
.
Diagnosis
These arrays should be unpacked internally from the
comm
stucture without it being the caller’s responsibility to do so.
Workaround
The two-dimensional array
ysav
can be extracted fromcomm
viaysav = np.array(comm['ysav'][:]).reshape((neq, sdysav))It must be created to use C-contiguous storage order, as above.
The one-dimensional
rwork
can be extracted merely ascomm['rwork']
.Having done this, the internal computations of
_ldysav
and_sdysav
must also be corrected throughout the suite.Please contact NAG if you would like more information.
Solution
By classifying
ysav
andrwork
correctly during code generation these arguments will be suppressed for the caller.The problematic form
ivp_stiff_interp(tsol, m, neq, ysav, rwork, comm)becomes
ivp_stiff_interp(tsol, m, neq, comm)The patch is omitted because of its size. Please contact NAG if you would like more information.
Fixed in Release
26.2.2.4
Missing product code for use with licence GUI on Windows¶
Affected Entities
Symptom
The New Licence Request form has a required Product Code field, but how to choose the value to enter is not described anywhere.
Diagnosis
Display of the required product code used by the underlying compiled library is mistakenly omitted on Windows.
Workaround
The licence-managed 26.2 release line on Windows uses CLW6I262EL as its product code.
Solution
Display the output of
naginterfaces.kusari.lcheck()
before launching the key GUI: innaginterfaces/kusari.py
@@ -199,10 +206,10 @@ if lcheck_str.startswith('Licence available'): lcheck(quiet=True) return + lcheck() if _THE_SYSTEM == 'Windows' or _THE_SYSTEM.startswith('CYGWIN'): # pylint: disable=protected-access key_gui() # pragma: no cover else: - lcheck() print(b_utils._capture_hostid()) # pylint: disable=protected-access,superfluous-parens if __name__ == '__main__':
Fixed in Release
26.2.2.3
Unintuitive handling of spiked arrays in callback functions¶
Affected Entities
Any function that takes multidimensional array input and which has callback arguments that return multidimensional arrays, such as
naginterfaces.library.glopt.nlp_multistart_sqp()
(a
andconfun:cjsl
, respectively).
Symptom
When all multidimensional arrays are ‘spiked’ (that is, with unit extent in all but one dimension, or with total size 1), and when these are viewed as dually Fortran and C contiguous by NumPy (which is the case for NumPy from version 1.12 onward), and when
spiked_sorder='F'
is requested, the NAG wrapper incorrectly raisesNagTypeError
claiming a storage mismatch has occurred.
Diagnosis
Checking of storage order after calling user-supplied functions does not take into account the setting of
spiked_sorder
.
Workaround
Use
spiked_sorder='C'
(the default).
Solution
Take into account the setting of
spiked_sorder
.The patch is omitted because of its size. Please contact NAG if you would like more information.
Fixed in Release
26.2.2.3
Unusable initializer for general nonlinear boundary-value ODEs¶
Affected Entities
Symptom
The routine raises an ‘Unexpected error’
NagException
, code(-99:1,99988)
.
Diagnosis
Sizes used internally for setting up the
comm
data are incorrect.
Workaround
None.
Solution
The underlying routine in the NAG Engine has a ‘size query’ facility, which should be used instead.
The patch is omitted because of its size. Please contact NAG if you would like more information.
Fixed in Release
26.2.2.2
Unintuitive handling of spiked arrays in some situations¶
Affected Entities
Any function that takes multidimensional array input and which has callback arguments that return multidimensional arrays, such as
naginterfaces.library.glopt.nlp_multistart_sqp()
(a
andconfun:cjsl
, respectively).
Symptom
When all multidimensional input arrays are ‘spiked’ (that is, with unit extent in all but one dimension, or with total size 1) and these are viewed as dually Fortran and C contiguous by NumPy (which is the case for NumPy from version 1.12 onward), returning default-ordered multidimensional arrays from callback functions passed to the NAG routine causes an exception to be raised, claiming that storage orders mismatch.
Diagnosis
The NAG function infers a storage order of Fortran contiguous when all multidimensional input arrays are spiked, which is for performance reasons. The same storage order is then required for multidimensional arrays returned by callbacks because of the compatibility enforced by the NAG interfaces.
Workaround
Declare the multidimensional arrays returned by the callbacks to use Fortran storage order.
Solution
In the fixed version, for better usability the affected routines now take an additional optional argument
spiked_sorder
to control the storage order that you wish the NAG Engine to infer from the spiked arrays. The default for the new argument is C-contiguous storage as with NumPy. For performance reasons supplyingspiked_sorder='F'
may be preferable, after which you must ensure that the arrays in the associated callbacks are initialized to use Fortran-contiguous storage.The patch is omitted because of its size. Please contact NAG if you would like more information.
Fixed in Release
26.2.2.2
Rank-1 NumPy arrays can be wrongly accepted when rank > 1 is expected¶
Affected Entities
Any function that takes multidimensional array input, such as
naginterfaces.library.correg.quantile_linreg()
.
Symptom
Possible undesirable runtime behaviour or crashes.
Diagnosis
The logic in a shape-checking utility is faulty for rank-1 NumPy arrays.
Workaround
Take care to supply multidimensional array data as having the correct rank. Note in particular that the design of this package requires that ‘spiked’ arrays be supplied with full rank; i.e., an argument requiring shape
(n, 1)
must not be supplied a rank-1 argument of lengthn
.
Solution
Require full equality between the shape of a NumPy array and its associated expected-shape tuple: in
naginterfaces/base/utils.py
@@ -3426,21 +3426,18 @@ return if isinstance(self.data, _np.ndarray): - actual_shape_or_len = self.data.shape - if self.data.ndim == 1: - actual_shape_or_len = actual_shape_or_len[0] - bad_shape = actual_shape_or_len != self.exp_shape[0] - else: + if ( + self.data.size == 0 and + any(extent == 0 for extent in self.exp_shape) + ): + return - if ( - self.data.size == 0 and - any(extent == 0 for extent in self.exp_shape) - ): - return - - bad_shape = actual_shape_or_len != self.exp_shape - + bad_shape = self.data.shape != self.exp_shape + actual_shape_or_len = ( + self.data.shape[0] if self.data.ndim == 1 else + self.data.shape + ) elif len(self.exp_shape) == 1: actual_shape_or_len = len(self.data) bad_shape = actual_shape_or_len != self.exp_shape[0]
Fixed in Release
26.2.2.0
Incorrect labels returned by the submodel utility for model fitting¶
Affected Entities
Symptom
When labels are requested, the routine issues a
NagAlgorithmicWarning
that elements in the returnedplab
array are too short, and the labels returned are essentially all empty.
Diagnosis
The output array
plab
is not initialized by the NAG wrapper correctly. Some of the metadata for this array stored to be used in NAG code generation is incorrect.
Workaround
None, although the function is still usable if labels are not required.
Solution
The array
plab
must be allocated with the correct character length. This length is not known in advance, so a new optional argumentlenlab
is provided with a reasonable default value. The routine will continue to issue an errno 81NagAlgorithmicWarning
if any of your labels are longer than this default,The patch is omitted because of its size. Please contact NAG if you would like more information.
Fixed in Release
26.2.1.2
Malfunctioning dendrogram routine¶
Affected Entities
Symptom
The routine raises
NagValueError
when used, claiming that elements inc
are too short.
Diagnosis
The output array
c
is not initialized by the NAG wrapper correctly. Some of the metadata for this array and forlenc
stored to be used in NAG code generation is incorrect.
Workaround
None.
Solution
The array
c
must be allocated with the correct character length. In the fixed version, argumentlenc
is also removed because the size required byc
is known on input based on the values of other parameters.The patch is omitted because of its size. Please contact NAG if you would like more information.
Fixed in Release
26.2.1.2
Inoperable NAG-supplied default monitoring in a shooting BVP solver¶
Affected Entities
Symptom
When
monlev
is1
andmonit
isNone
(i.e., monitoring is enabled and is to use the NAG-supplied default facility),TypeError
is raised, reporting'NoneType' object is not callable
.
Diagnosis
The NAG wrapper is missing special handling of
monit
beingNone
and incorrectly attempts to invokeNone
as a user-supplied procedure for the monitoring function.
Workaround
Disable monitoring or supply an explicit monitoring function.
Solution
Add special handling for
monit
beingNone
to the internal helper function formonit
.The patch is omitted because of its size. Please contact NAG if you would like more information.
Fixed in Release
26.2.1.2
Logging incompatible with pytest
in some situations¶
Affected Entities
Any functions that capture printing from the underlying NAG Engine (e.g. for monitoring) which is being sent to the default advisory or error units, when run through the
pytest
framework under Python 3.
Symptom
An internal
NagException
is raised saying ‘could not initialize record to write’.
Diagnosis
The
pytest
module captures output by swapping out the OS-level standard output and error streams with a specialEncodedFile
class. The cases covered by the naginterfaces output handler do not anticipate being supplied one of these entities.
Workaround
Use one of the
pytest
mechanisms to disable its output capturing (e.g. by running usingpytest -s
).Or, configure the I/O manager in the NAG call to send advisory and error output to non-default streams of your choosing. (See also
naginterfaces.base.utils.FileObjManager
.)
Solution
Relax part of the recognition of the input I/O file object in
naginterfaces/base/utils.py
@@ -5295,7 +5295,7 @@ rec_to_write = rec_to_write.rstrip() + b'\n' elif ( logger is not None or - isinstance(this_fo, _io.TextIOBase) + not isinstance(this_fo, (_io.BufferedIOBase, _io.RawIOBase)) ): rec_to_write = _EngineCharScalarType.to_py(rec)
Fixed in Release
26.2.1.2
Reverse-communication best subset function unusable in a certain edge case¶
Affected Entities
Symptom
In the pathological case where
m
(the number of features in the full feature set) equalsip
(the number of features in the subset of interest) on input, the routine terminates with a warning message about insufficiently-sized communication arrays.
Diagnosis
The communication arrays are set up internally by the NAG wrapper. The expressions for their sizes are missing a
max
term to ensure that part of the expression is at least1
whenm
andip
are equal.
Workaround
None.
Solution
Add missing
max
occurrences innaginterfaces/base/mip.py
@@ -8890,9 +8890,9 @@ _mincnt_py = utils._EngineIntScalarType.to_py(_mincnt) if _comm_needs_init: if _mincnt_py == 0: - _icomm_dim1 = 2*max(_nbest_py, _m_py)+_m_py*(_m_py+2)+(_m_py+1)*(_m_py-_ip_py)+27 + _icomm_dim1 = 2*max(_nbest_py, _m_py)+_m_py*(_m_py+2)+(_m_py+1)*max(_m_py-_ip_py, 1)+27 else: - _icomm_dim1 = 2*max(_nbest_py, _m_py)+_m_py*(_m_py+3)+(2*_m_py+1)*(_m_py-_ip_py)+25 + _icomm_dim1 = 2*max(_nbest_py, _m_py)+_m_py*(_m_py+3)+(2*_m_py+1)*max(_m_py-_ip_py, 1)+25 _icomm = utils._EngineIntArrayType.empty_ctypes(_icomm_dim1) comm['icomm'] = _icomm else: @@ -8903,9 +8903,9 @@ ).to_ctypes() if _comm_needs_init: if _mincnt_py == 0: - _rcomm_dim1 = 9+_nbest_py+_m_py*(_m_py-_ip_py) + _rcomm_dim1 = 9+_nbest_py+_m_py*max(_m_py-_ip_py, 1) else: - _rcomm_dim1 = 8+_m_py+_nbest_py+_m_py*(_m_py-_ip_py) + _rcomm_dim1 = 8+_m_py+_nbest_py+_m_py*max(_m_py-_ip_py, 1) _rcomm = utils._EngineFloat64ArrayType.empty_ctypes(_rcomm_dim1) comm['rcomm'] = _rcomm else:
Fixed in Release
26.2.1.2
Inaccessible suggested values in the factorial ANOVA function¶
Affected Entities
Symptom
If
mterm
(the maximum number of terms in the ANOVA table) ormaxt
(the maximum number of treatment means to be computed) are too small the suggested values computed by the routine cannot be retrieved, because a full exception is raised.
Diagnosis
The exit cases for these input errors are incorrectly categorized as serious errors requiring an exception.
Workaround
The required values can still be computed manually using the advice at
https://www.nag.com/numeric/nl/nagdoc_latest/flhtml/g04/g04caf.html#fcomments
Solution
Downgrade the relevant exit cases to warnings in
naginterfaces/base/anova.py
@@ -1959,7 +1959,7 @@ errcodes=(_ierr_py, _ierr_py, _ifmt), ) elif _ierr_py == 2 and _ifmt == 99992: - _err_class = utils._EngineErrorExit( + _err_class = utils._EngineWarningExit( fun_name=fun_name, msg_lines=[ 'On entry, mterm = {:s}'.format( @@ -1972,7 +1972,7 @@ errcodes=(_ierr_py, _ierr_py, _ifmt), ) elif _ierr_py == 2 and _ifmt == 99993: - _err_class = utils._EngineErrorExit( + _err_class = utils._EngineWarningExit( fun_name=fun_name, msg_lines=[ 'On entry, maxt = {:s}'.format(
Fixed in Release
26.2.1.2
Usability barriers in the NAG optimization suite handle reader/writer¶
Affected Entities
Symptom
The routine is difficult to use and in particular a read-mode call unnecessarily requires the caller to have knowledge of the expected size of the output, read, array.
Diagnosis
The Python API specification for this function as initially devised is defective.
Workaround
The routine can be used in read mode by studying any raised exceptions for information on how long the read array should be.
Solution
The interface has been improved.
From the defective call sequence
rarr_read = naginterfaces.library.opt.handle_set_get_real( handle, cmdstr, ioflag, rarr=rarr_write, )argument
ioflag
has been removed, its value now being inferred from the inputrarr_write
beingNone
or not.The fixed call for write mode is now
lrarr, _ = naginterfaces.library.opt.handle_set_get_real( handle, cmdstr, rarr=rarr_write, )in which the returned
lrarr
acts as a ‘size query’ facility in case the suppliedrarr_write
was too short.The fixed call for read mode is now
_, rarr_read = naginterfaces.library.opt.handle_set_get_real( handle, cmdstr, )The patch is omitted because of its size. Please contact NAG if you would like more information.
Fixed in Release
26.2.1.1
Missing callbacks not diagnosed by the interior point optimizer¶
Affected Entities
Symptom
The routine runs to completion but produces unhelpful results in some cases when one of its procedure arguments is supplied as
None
instead of as a defined function.
Diagnosis
There are various situations in which one of the routine’s procedure arguments must not be
None
- for example,objgrd
must be supplied as a user function when there is a nonlinear objective. An error in the classification of these callbacks during NAG’s code generation process means that code for identifying when dummy (None
) callbacks were being supplied is wrongly omitted.
Workaround
Use the documentation of the solver to check carefully that your procedure arguments are only
None
when absolutely permitted.
Solution
The patch is omitted because of its size. Please contact NAG if you would like more information.
Fixed in Release
26.2.1.1
Internal error from setup routine for implicit ODE/DAE solver in Python 3¶
Affected Entities
Symptom
When running using Python 3,
NagTypeError
is raised during an internal calculation for a communication array’s length (_lcom
).
Diagnosis
The calculation of the array’s length mistakenly uses single-slash division between integer quantities. In Python 3 the result of such an operation is a floating-point value.
Workaround
Use Python 2.
Solution
Use double-slash integer division in function
dae_dassl_setup
innaginterfaces/base/ode.py
@@ -12706,9 +12706,9 @@ _comm_py['icom'] = _icom _maxord_py = utils._EngineIntScalarType.to_py(_maxord) _lcom = utils._EngineIntScalarType( - 40+(_maxord_py+4)*_neq_py+(2*(_neq_py-1)+(_neq_py-1)+1)*_neq_py+2*(_neq_py/((_neq_py-1)+(_neq_py-1)+1)+1), {'fun_name': fun_name, 'entity': '_lcom'}, + 40+(_maxord_py+4)*_neq_py+(2*(_neq_py-1)+(_neq_py-1)+1)*_neq_py+2*(_neq_py//((_neq_py-1)+(_neq_py-1)+1)+1), {'fun_name': fun_name, 'entity': '_lcom'}, ).to_ctypes() - _com = utils._EngineFloat64ArrayType.empty_ctypes(40+(_maxord_py+4)*_neq_py+(2*(_neq_py-1)+(_neq_py-1)+1)*_neq_py+2*(_neq_py/((_neq_py-1)+(_neq_py-1)+1)+1)) + _com = utils._EngineFloat64ArrayType.empty_ctypes(40+(_maxord_py+4)*_neq_py+(2*(_neq_py-1)+(_neq_py-1)+1)*_neq_py+2*(_neq_py//((_neq_py-1)+(_neq_py-1)+1)+1)) _comm_py['com'] = _com _errbuf = utils._EngineErrbuf() _ierr = utils._EngineIntScalarType.empty_ctypes()
Fixed in Release
26.2.0.2
Missing constraint checks in LAPACK wrappers¶
Affected Entities
Numerous. Please contact NAG for the full list.
Two affected routines, for example, are
naginterfaces.library.lapacklin.dgesvx()
(wherer
must be positive in certain circumstances) andnaginterfaces.library.lapackeig.dstein()
(whereiblock
must be in ascending order).
Symptom
When using the MKL-enabled naginterfaces package an error message is issued by MKL about an invalid LAPACK argument, followed by the package raising a generic ‘Unexpected error’
NagException
.When using the variant of the package that is based on NAG-supplied LAPACK, an error message is issued by the NAG Engine about an invalid LAPACK argument, followed by a hard stop of the Python process.
Diagnosis
The code generation for these functions is mistakenly omitting conditional and loop-based constraint checks from the code and from the Raises sections of the documentation. These constraints must be checked by the Python wrappers to avoid them being processed un-Pythonically by the underlying compiled libraries.
Workaround
Ensure that valid input is always supplied, and if in doubt about what is valid please check against the main Library Manual at
https://www.nag.com/numeric/nl/nagdoc_latest/flhtml/frontmatter/manconts.html
or contact NAG.
Solution
The patch is omitted because of its size. Please contact NAG if you would like more information.
Fixed in Release
26.2.0.2
Reallocation mode impractical in stream quantiles routines¶
Affected Entities
Symptom
As an intended convenience for the programmer, both of these routines have communication arrays packed into a single communication dict (argument
comm
).Function
naginterfaces.library.stat.quantiles_stream_arbitrary()
may request (by returningind = 2
) that you need to extend the arrays in size.Function
naginterfaces.library.stat.quantiles_stream_fixed()
similarly has a ‘query’ mode (ind = 0
on entry) where the required sizes for the communication arrays are returned to you, after which you can make adequate declarations for the arrays.These operations are impractical in their current form because of the arrays being packed away in
comm
(asctypes
arrays).
Diagnosis
Since you may need to interact directly with the communication arrays they need to remain as unpacked separate arguments in the argument list rather than being packed into a dict.
Workaround
None. A patch is required.
Solution.
The patch is omitted because of its size. Please contact NAG if you would like more information.
Fixed in Release
26.2.0.1
Column-ordered arrays not supported by sum of squares optimizer¶
Affected Entities
Symptom
NagTypeError
raised when arraya
is stored in column order.
Diagnosis
Two-dimensional output arrays are declared by the wrapper to always use row ordering, and this mismatch triggers the exception.
Workaround
Only use row-major (C contiguous) input arrays (which is the NumPy default).
Solution
The patch is omitted because of its size. Please contact NAG if you would like more information.
Fixed in Release
26.2.0.1
Incorrect shape expression for bicubic spline coefficients¶
Affected Entities
Symptom
TypeError
raised when the routine is called.
Diagnosis
The shape expression used in the function for the returned arrays
dl
andc
is incorrectly a scalar instead of a tuple.
Workaround
None. A patch is required, or
naginterfaces.library.fit.dim2_spline_sctr()
could be used for the fit instead.
Solution
A patch for function
dim2_spline_panel
innaginterfaces/library/fit.py
is@@ -2833,10 +2833,10 @@ _npoint_py, {'fun_name': fun_name, 'entity': '_npoint'}, ).to_ctypes() _dl = _b_utils._EngineFloat64ArrayType.empty_ndarray( - (_px_py-4)*(_py_py-4), + ((_px_py-4)*(_py_py-4),), ) _c = _b_utils._EngineFloat64ArrayType.empty_ndarray( - (_px_py-4)*(_py_py-4), + ((_px_py-4)*(_py_py-4),), ) _return_scalars = b_dim2_spline_panel( _m,
Fixed in Release
26.2.0.1