In [1]:
import gstlearn as gl
In [2]:
db = gl.DbGrid.create([50, 50], [2, 2])
mesh = gl.MeshETurbo([100, 100])
proj = gl.ProjMatrix.create(db, mesh)
In [3]:
A = gl.TestInheritance()
A.setIproj(proj)
In [4]:
class SpecializedProj(gl.IProj):
    def __init__(self, n):
        super(SpecializedProj, self).__init__()
        self.n = n

    def mesh2point(self, inv, outv):
        for i in range(inv.size):
            outv[i] = inv[i]

    def point2mesh(self, outv, inv):
        for i in range(inv.size):
            outv[i] = inv[i]

    def getNApex(self):
        return self.n

    def getNPoint(self):
        return self.n
In [5]:
newproj = SpecializedProj(12)
In [6]:
A.setIproj(newproj)
In [7]:
A.display()
Number of Apices: 12
Number of Points: 12

Inheritance of an ICloneable class.¶

Add a clone method as follows:

In [8]:
import numpy as np


class MyCov(gl.ACov):
    def __init__(self, range):
        super(MyCov, self).__init__()
        self.range = np.copy(range)
        # space is needed to compute the distance in _eval
        self.space = gl.getDefaultSpace()

    # Specify the number of variables
    def getNVar(self):
        return 1

    # clone method
    def clone(self):
        return MyCov(self.range).__disown__()

    # _eval method (which is pure virtual in ACov)
    def _eval(self, p1, p2, ivar, jvar, mode):
        dist = self.space.getDistance(p1, p2)
        return np.exp(-dist / self.range)
In [9]:
cov = MyCov(0.2)
p1 = gl.SpacePoint([1.0, 1.0])
p2 = gl.SpacePoint([0.95, 0.95])

print(cov.isNoStat())
cov.evalCov(p1, p2)
False
Out[9]:
0.7021885013265594
In [10]:
db = gl.Db.createFillRandom(5, 2, 1)
grid = gl.DbGrid.create([100, 100], [0.01, 0.01])

model = gl.ModelGeneric()
model.setCov(cov)

modelgst = gl.Model.createFromParam(
    gl.ECov.EXPONENTIAL, range=cov.range, flagRange=False
)

neigh = gl.NeighUnique()
In [11]:
gl.OptCustom.define(
    "NotOptimSimpleCase", 1
)  # Multithread version doesn't seem possible yet from custom covariances from outside.
gl.kriging(db, grid, model, neigh)
gl.OptCustom.define("NotOptimSimpleCase", 0)
gl.kriging(db, grid, modelgst, neigh)
Out[11]:
0

Comparison of kriging with custom class and gstlearn class

In [12]:
print(np.round(np.max(np.abs(grid["*estim"] - grid["*estim.1"])), 5))
0.0