Known limitations¶
pygeostats 0.1.0a2 is an alpha release. These are the limitations known at the time
of release. Unfinished features are covered by strict xfail tests, so the test
suite fails if one is completed without the tests being updated. The
roadmap assigns each limitation to a milestone.
Directional to anisotropic kriging is not implemented¶
DirectionalVariogram.estimate_initial_parameters() and
create_anisotropic_variogram_from_directional() raise NotImplementedError. They
depend on a helper that was never written.
InitializationEnsemble and RangeInitializer from
pygeostats.variogram.initialization provide starting values in the meantime, and
AnisotropicKriging works when its variogram's five parameters are set directly and
the variogram is marked as fitted. See
Directional variograms and anisotropy.
Kriging can hang in a forked process¶
The Rust core runs predictions on a pool of threads, and that pool does not survive
fork. A process forked after pygeostats has used it, such as a multiprocessing
worker started with the fork method, the default on Linux before Python 3.14, can
wait on the pool forever. Start such workers with the spawn or forkserver method
instead. ParallelKrigingExecutor always spawns its process workers.
AnisotropicKriging measures its angle clockwise¶
AnisotropicKriging rotates each separation counter-clockwise by the variogram's
fifth parameter, rotation_angle, before scaling it, so the major axis lies at
-rotation_angle: clockwise from the x-axis. DirectionalVariogram and
detect_anisotropy() measure directions counter-clockwise. Negate a direction taken
from them: rotation_angle = -np.radians(major_direction).
get_anisotropy_info() reports the parameter as given.
Matérn models cannot be fitted¶
Variogram accepts model="matern", but fit() raises ValueError: the Rust core
fits exponential, spherical and Gaussian models only. Where a Matérn model is
evaluated, it is treated as exponential, which is the Matérn model with smoothness
0.5.
The anisotropy ratio runs low¶
DirectionalVariogram.detect_anisotropy() estimates the anisotropy axis by fitting
an ellipse through the directional ranges. Its ratio runs low: about 1.4 for a 2.9:1
field, against about 1.06 for an isotropic one. Treat it as a detection statistic,
not an estimate of the true ratio. At the default ratio_threshold of 1.2, some
isotropic fields are flagged as anisotropic.
Starting values are not model ranges¶
RangeInitializer returns starting values for a fit, not estimates of a model's
range parameter. Each direction's range is the first lag at which its variogram
reaches 90% of its own largest value.
The ensemble angle mixes in the sampling layout¶
InitializationEnsemble blends the principal axis of the sampling locations into
its angle. That axis describes where samples were taken, not the field, so it can
pull the angle away from the field's axis: in one test it reported 74 degrees for an
axis at 60.
Fits that cannot be trusted are reported, not hidden¶
This is behaviour rather than a defect, but it surprises people: when the empirical
variogram does not constrain the chosen model, typically because it is still rising
at the largest observed lag, Variogram.fit sets converged_ to False and adds a
warning, instead of returning a range as though it were reliable.
Type annotations are incomplete¶
mypy reports findings in first-party code. It runs as an advisory step in CI rather than a gate.