diff --git a/rrompy/parameter/parameter_list.py b/rrompy/parameter/parameter_list.py
index caa2536..c6e6b0b 100644
--- a/rrompy/parameter/parameter_list.py
+++ b/rrompy/parameter/parameter_list.py
@@ -1,227 +1,227 @@
 # Copyright (C) 2018 by the RROMPy authors
 #
 # This file is part of RROMPy.
 #
 # RROMPy is free software: you can redistribute it and/or modify
 # it under the terms of the GNU Lesser General Public License as published by
 # the Free Software Foundation, either version 3 of the License, or
 # (at your option) any later version.
 #
 # RROMPy is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 # GNU Lesser General Public License for more details.
 #
 # You should have received a copy of the GNU Lesser General Public License
 # along with RROMPy. If not, see <http://www.gnu.org/licenses/>.
 #
 
 import numpy as np
 from itertools import product as iterprod
 from copy import deepcopy as copy
 from rrompy.utilities.exception_manager import RROMPyException, RROMPyAssert
 from rrompy.utilities.base.types import Np2D
 
 __all__ = ['parameterList', 'emptyParameterList', 'checkParameterList']
 
 def checkParameterList(mu, npar = None):
     if not isinstance(mu, (parameterList,)):
         mu = parameterList(mu, npar)
     else:
         if npar is not None:
             RROMPyAssert(mu.shape[1], npar, "Number of parameters")
         mu = copy(mu)
     return mu, len(mu) <= 1
 
 def checkParameter(mu, npar = None):
     muL, wasPar = checkParameterList(mu, npar)
     if not wasPar:
         muL, wasPar = checkParameterList([mu], npar)
         if not wasPar:
             raise RROMPyException(("Only single parameter allowed. No "
                                    "parameter lists here."))
     return muL
 
 def emptyParameterList():
     return parameterList([[]])
 
 def addMemberFromNumpyArray(self, fieldName):
     def objFunc(self, other):
         if not isinstance(other, (self.__class__,)):
             other = parameterList(other, self.shape[1])
         return parameterList(getattr(np.ndarray, fieldName)(self.data,
                                                             other.data))
     setattr(self.__class__, fieldName, objFunc)
     def objIFunc(self, other):
         self.data = getattr(self.__class__, fieldName)(self, other).data
     setattr(self.__class__, "__i" + fieldName[2:], objIFunc)
 
 class parameterList:
     """HERE"""
 
     __all__ += [pre + post for pre, post in iterprod(["__", "__i"],
-                                   ["__add__", "__sub__", "__mul__", "__div__",
-                                    "__truediv__", "__floordiv__", "__pow__"])]
+                                         ["add__", "sub__", "mul__", "div__",
+                                          "truediv__", "floordiv__", "pow__"])]
 
     def __init__(self, data:Np2D, lengthCheck : int = None):
         if not hasattr(data, "__len__"): data = [data]
         elif isinstance(data, (self.__class__,)): data = data.data
         elif isinstance(data, (tuple,)): data = list(data)
         if (isinstance(data, (list,)) and len(data) > 0
                                       and isinstance(data[0], (tuple,))):
             data = [list(x) for x in data]
         self.data = np.array(data, ndmin = 1, copy = 1)
         if self.data.ndim == 1:
             self.data = self.data[:, None]
         if np.size(self.data) > 0:
             self.data = self.data.reshape((len(self), -1))
         if self.shape[0] * self.shape[1] == 0:
             lenEff = 0 if lengthCheck is None else lengthCheck
             self.reset((0, lenEff), self.dtype)
         if lengthCheck is not None:
             if lengthCheck != 1 and self.shape == (lengthCheck, 1):
                 self.data = self.data.T
             RROMPyAssert(self.shape[1], lengthCheck, "Number of parameters")
         
         for fieldName in ["__add__", "__sub__", "__mul__", "__div__",
                           "__truediv__", "__floordiv__", "__pow__"]:
             addMemberFromNumpyArray(self, fieldName)
 
     def __len__(self):
         return self.shape[0]
 
     def __str__(self):
         if len(self) == 0:
             selfstr = "[]"
         elif len(self) <= 3:
             selfstr = "[{}]".format(" ".join([str(x) for x in self.data]))
         else:
             selfstr = "[{} ..({}).. {}]".format(self[0], len(self) - 2,
                                                 self[-1])
         return selfstr
 
     def __repr__(self):
         return repr(self.data)
 
     @property
     def shape(self):
         return self.data.shape
 
     @property
     def size(self):
         return self.data.size
 
     @property
     def re(self):
         return parameterList(np.real(self.data))
 
     @property
     def im(self):
         return parameterList(np.imag(self.data))
 
     @property
     def abs(self):
         return parameterList(np.abs(self.data))
 
     @property
     def angle(self):
         return parameterList(np.angle(self.data))
 
     @property
     def conj(self):
         return parameterList(np.conj(self.data))
 
     @property
     def dtype(self):
         return self.data.dtype
 
     def __getitem__(self, key):
         return self.data[key]
 
     def __call__(self, key, idx = None):
         if idx is None:
             return self.data[:, key]
         return self[key, idx]
 
     def __setitem__(self, key, value):
         if isinstance(key, (tuple, list,)):
             RROMPyAssert(len(key), len(value), "Slice length")
             for k, val in zip(key, value):
                 self[k] = val
         else:
             self.data[key] = value
 
     def __eq__(self, other):
         if not hasattr(other, "shape") or self.shape != other.shape:
             return False
         if isinstance(other, self.__class__):
             other = other.data
         return np.allclose(self.data, other)
 
     def __contains__(self, item):
         return next((x for x in self if np.allclose(x[0], item)), -1) != -1
 
     def __iter__(self):
         return iter([parameterList([x]) for x in self.data])
 
     def __copy__(self):
         return parameterList(self.data)
 
     def __deepcopy__(self, memo):
         return parameterList(copy(self.data, memo))
 
     def __neg__(self):
         return parameterList(-self.data)
 
     def __pos__(self):
         return copy(self)
 
     def reset(self, size, dtype = complex):
         self.data = np.empty(size, dtype = dtype)
         self.data[:] = np.nan
 
     def append(self, items):
         if isinstance(items, self.__class__):
             items = items.data
         else:
             items = np.array(items, ndmin = 2)
         if len(self) == 0:
             self.data = parameterList(items).data
         else:
             self.data = np.append(self.data, items, axis = 0)
 
     def pop(self, idx = -1):
         self.data = np.delete(self.data, idx, axis = 0)
 
     def find(self, item):
         if len(self) == 0: return None
         return next((j for j in range(len(self))
                                           if np.allclose(self[j], item)), None)
 
     def findall(self, item):
         if len(self) == 0: return []
         return [j for j in range(len(self)) if np.allclose(self[j], item)]
 
     def sort(self, overwrite = False, *args, **kwargs):
         dataT = np.array([tuple(x[0]) for x in self],
                           dtype = [(str(j), self.dtype)
                                                 for j in range(self.shape[1])])
         sortedP = parameterList([list(x) for x in np.sort(dataT, *args,
                                                           **kwargs)])
         if overwrite: self.data = sortedP.data
         return sortedP
 
     def unique(self, overwrite = False, *args, **kwargs):
         dataT = np.array([tuple(x[0]) for x in self],
                           dtype = [(str(j), self.dtype)
                                                 for j in range(self.shape[1])])
         uniqueT = np.unique(dataT, *args, **kwargs)
         if isinstance(uniqueT, (tuple,)):
             extraT = uniqueT[1:]
             uniqueT = uniqueT[0]
         else: extraT = ()
         uniqueP = parameterList([list(x) for x in uniqueT])
         if overwrite: self.data = uniqueP.data
         uniqueP = (uniqueP,) + extraT
         if len(uniqueP) == 1: return uniqueP[0]
         return uniqueP
diff --git a/rrompy/reduction_methods/greedy/rational_interpolant_greedy.py b/rrompy/reduction_methods/greedy/rational_interpolant_greedy.py
index f3acc23..e8b67ba 100644
--- a/rrompy/reduction_methods/greedy/rational_interpolant_greedy.py
+++ b/rrompy/reduction_methods/greedy/rational_interpolant_greedy.py
@@ -1,518 +1,514 @@
 # Copyright (C) 2018 by the RROMPy authors
 #
 # This file is part of RROMPy.
 #
 # RROMPy is free software: you can redistribute it and/or modify
 # it under the terms of the GNU Lesser General Public License as published by
 # the Free Software Foundation, either version 3 of the License, or
 # (at your option) any later version.
 #
 # RROMPy is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 # GNU Lesser General Public License for more details.
 #
 # You should have received a copy of the GNU Lesser General Public License
 # along with RROMPy. If not, see <http://www.gnu.org/licenses/>.
 #
 
 from copy import deepcopy as copy
 import numpy as np
 from rrompy.hfengines.base.linear_affine_engine import checkIfAffine
 from .generic_greedy_approximant import GenericGreedyApproximant
 from rrompy.utilities.poly_fitting.polynomial import (polybases,
                                                   PolynomialInterpolator as PI,
                                                   polyvanderTotal as pvT)
 from rrompy.utilities.numerical import totalDegreeN, dot
 from rrompy.utilities.expression import expressionEvaluator
 from rrompy.reduction_methods.standard import RationalInterpolant
 from rrompy.utilities.base.types import (Np1D, Tuple, DictAny, HFEng, paramVal,
                                          List)
 from rrompy.utilities.base import verbosityManager as vbMng
 from rrompy.utilities.poly_fitting import customFit
 from rrompy.utilities.exception_manager import (RROMPyWarning, RROMPyException,
                                                 RROMPyAssert, RROMPy_FRAGILE)
 from rrompy.parameter import checkParameterList
 from rrompy.sampling import emptySampleList
 
 __all__ = ['RationalInterpolantGreedy']
 
 class RationalInterpolantGreedy(GenericGreedyApproximant, RationalInterpolant):
     """
     ROM greedy rational interpolant computation for parametric problems.
 
     Args:
         HFEngine: HF problem solver.
         mu0(optional): Default parameter. Defaults to 0.
         approxParameters(optional): Dictionary containing values for main
             parameters of approximant. Recognized keys are:
             - 'POD': whether to compute POD of snapshots; defaults to True;
             - 'S': number of starting training points;
             - 'sampler': sample point generator;
             - 'greedyTol': uniform error tolerance for greedy algorithm;
                 defaults to 1e-2;
             - 'collinearityTol': collinearity tolerance for greedy algorithm;
                 defaults to 0.;
             - 'maxIter': maximum number of greedy steps; defaults to 1e2;
             - 'refinementRatio': ratio of test points to be exhausted before
                 test set refinement; defaults to 0.2;
             - 'nTestPoints': number of test points; defaults to 5e2;
             - 'trainSetGenerator': training sample points generator; defaults
                 to sampler;
             - 'polybasis': type of basis for interpolation; defaults to
                 'MONOMIAL';
             - 'errorEstimatorKind': kind of error estimator; available values
                 include 'AFFINE', 'DISCREPANCY', 'INTERPOLATORY',
                 'LOOK_AHEAD', and 'NONE'; defaults to 'NONE';
             - 'interpRcond': tolerance for interpolation; defaults to None;
             - 'robustTol': tolerance for robust rational denominator
                 management; defaults to 0.
             Defaults to empty dict.
         approx_state(optional): Whether to approximate state. Defaults and must
             be True.
         verbosity(optional): Verbosity level. Defaults to 10.
             
     Attributes:
         HFEngine: HF problem solver.
         mu0: Default parameter.
         mus: Array of snapshot parameters.
         approxParameters: Dictionary containing values for main parameters of
             approximant. Recognized keys are in parameterList.
         parameterListSoft: Recognized keys of soft approximant parameters:
             - 'POD': whether to compute POD of snapshots.
             - 'greedyTol': uniform error tolerance for greedy algorithm;
             - 'collinearityTol': collinearity tolerance for greedy algorithm;
             - 'maxIter': maximum number of greedy steps;
             - 'refinementRatio': ratio of test points to be exhausted before
                 test set refinement;
             - 'nTestPoints': number of test points;
             - 'trainSetGenerator': training sample points generator;
             - 'errorEstimatorKind': kind of error estimator;
             - 'interpRcond': tolerance for interpolation;
             - 'robustTol': tolerance for robust rational denominator
                 management.
         parameterListCritical: Recognized keys of critical approximant
             parameters:
             - 'S': total number of samples current approximant relies upon;
             - 'sampler': sample point generator.
         approx_state: Whether to approximate state.
         verbosity: Verbosity level.
         POD: whether to compute POD of snapshots.
         S: number of test points.
         sampler: Sample point generator.
         greedyTol: uniform error tolerance for greedy algorithm.
         collinearityTol: Collinearity tolerance for greedy algorithm.
         maxIter: maximum number of greedy steps.
         refinementRatio: ratio of training points to be exhausted before
             training set refinement.
         nTestPoints: number of starting training points.
         trainSetGenerator: training sample points generator.
         robustTol: tolerance for robust rational denominator management.
         errorEstimatorKind: kind of error estimator.
         interpRcond: tolerance for interpolation.
         robustTol: tolerance for robust rational denominator management.
         muBounds: list of bounds for parameter values.
         samplingEngine: Sampling engine.
         estimatorNormEngine: Engine for estimator norm computation.
         uHF: High fidelity solution(s) with parameter(s) lastSolvedHF as
             sampleList.
         lastSolvedHF: Parameter(s) corresponding to last computed high fidelity
             solution(s) as parameterList.
         uApproxReduced: Reduced approximate solution(s) with parameter(s)
             lastSolvedApprox as sampleList.
         lastSolvedApproxReduced: Parameter(s) corresponding to last computed
             reduced approximate solution(s) as parameterList.
         uApprox: Approximate solution(s) with parameter(s) lastSolvedApprox as
             sampleList.
         lastSolvedApprox: Parameter(s) corresponding to last computed
             approximate solution(s) as parameterList.
     """
     
     _allowedEstimatorKinds = ["AFFINE", "DISCREPANCY", "INTERPOLATORY",
                               "LOOK_AHEAD", "NONE"]
     
     def __init__(self, HFEngine:HFEng, mu0 : paramVal = None,
                  approxParameters : DictAny = {}, approx_state : bool = True,
                  verbosity : int = 10, timestamp : bool = True):
         if not approx_state: RROMPyWarning("Overriding approx_state to True.")
         self._preInit()
         self._addParametersToList(["errorEstimatorKind"], ["DISCREPANCY"],
                                   toBeExcluded = ["M", "N", "polydegreetype", 
                                                   "radialDirectionalWeights",
                                                   "nNearestNeighbor"])
         super().__init__(HFEngine = HFEngine, mu0 = mu0,
                          approxParameters = approxParameters,
                          approx_state = True, verbosity = verbosity,
                          timestamp = timestamp)
         self._postInit()
 
     @property
     def E(self):
         """Value of E."""
         self._E = self.sampleBatchIdx - 1
         return self._E
     @E.setter
     def E(self, E):
         RROMPyWarning(("E is used just to simplify inheritance, and its value "
                        "cannot be changed from that of sampleBatchIdx - 1."))
         
     @property
     def polydegreetype(self):
         """Value of polydegreetype."""
         return "TOTAL"
     @polydegreetype.setter
     def polydegreetype(self, polydegreetype):
         RROMPyWarning(("polydegreetype is used just to simplify inheritance, "
                        "and its value cannot be changed from 'TOTAL'."))
         
     @property
     def polybasis(self):
         """Value of polybasis."""
         return self._polybasis
     @polybasis.setter
     def polybasis(self, polybasis):
         try:
             polybasis = polybasis.upper().strip().replace(" ","")
             if polybasis not in polybases: 
                 raise RROMPyException("Sample type not recognized.")
             self._polybasis = polybasis
         except:
             RROMPyWarning(("Prescribed polybasis not recognized. Overriding "
                            "to 'MONOMIAL'."))
             self._polybasis = "MONOMIAL"
         self._approxParameters["polybasis"] = self.polybasis
 
     @property
     def errorEstimatorKind(self):
         """Value of errorEstimatorKind."""
         return self._errorEstimatorKind
     @errorEstimatorKind.setter
     def errorEstimatorKind(self, errorEstimatorKind):
         errorEstimatorKind = errorEstimatorKind.upper()
         if errorEstimatorKind not in self._allowedEstimatorKinds:
             RROMPyWarning(("Error estimator kind not recognized. Overriding "
                            "to 'NONE'."))
             errorEstimatorKind = "NONE"
         self._errorEstimatorKind = errorEstimatorKind
         self._approxParameters["errorEstimatorKind"] = self.errorEstimatorKind
 
     def _polyvanderAuxiliary(self, mus, deg, *args):
         return pvT(mus, deg, *args)
 
     def getErrorEstimatorDiscrepancy(self, mus:Np1D) -> Np1D:
         """Discrepancy-based residual estimator."""
         mus = checkParameterList(mus, self.npar)[0]
         muCTest = self.trainedModel.centerNormalize(mus)
         verb = self.trainedModel.verbosity
         self.trainedModel.verbosity = 0
         QTest = self.trainedModel.getQVal(mus)
         checkIfAffine(self.HFEngine, "apply discrepancy-based error estimator")
         self.HFEngine.buildA()
         self.HFEngine.buildb()
         nAs, nbs = self.HFEngine.nAs, self.HFEngine.nbs
         muTrainEff = self.mus ** self.HFEngine.rescalingExp
         muTestEff = mus ** self.HFEngine.rescalingExp
         PTrain = self.trainedModel.getPVal(self.mus).data.T
         QTrain = self.trainedModel.getQVal(self.mus)
         PTest = self.trainedModel.getPVal(mus).data
         radiusAbTrain = np.empty((self.S, nAs * self.S + nbs),
                                  dtype = np.complex)
         radiusA = np.empty((self.S, nAs, len(mus)), dtype = np.complex)
         radiusb = np.empty((nbs, len(mus)), dtype = np.complex)
         for j, thA in enumerate(self.HFEngine.thAs):
             idxs = j * self.S + np.arange(self.S)
             radiusAbTrain[:, idxs] = expressionEvaluator(thA[0], muTrainEff,
                                                          (self.S, 1)) * PTrain
             radiusA[:, j] = PTest * expressionEvaluator(thA[0], muTestEff,
                                                         (len(mus),))
         for j, thb in enumerate(self.HFEngine.thbs):
             idx = nAs * self.S + j
             radiusAbTrain[:, idx] = QTrain * expressionEvaluator(thb[0],
                                                          muTrainEff, (self.S,))
             radiusb[j] = QTest * expressionEvaluator(thb[0], muTestEff,
                                                      (len(mus),))
         QRHSNorm2 = self._affineResidualMatricesContraction(radiusb)
         vanTrain = self._polyvanderAuxiliary(self._musUniqueCN, self.E,
                                              self.polybasis0, self._derIdxs,
                                              self._reorder)
         interpPQ = customFit(vanTrain, radiusAbTrain,
                              rcond = self.interpRcond)
         vanTest = self._polyvanderAuxiliary(muCTest, self.E,
                                             self.polybasis0)
         DradiusAb = vanTest.dot(interpPQ)
         radiusA = (radiusA
                  - DradiusAb[:, : - nbs].reshape(len(mus), -1, self.S).T)
         radiusb = radiusb - DradiusAb[:, - nbs :].T
         ff, Lf, LL = self._affineResidualMatricesContraction(radiusb, radiusA)
         err = np.abs((LL - 2. * np.real(Lf) + ff) / QRHSNorm2) ** .5
         self.trainedModel.verbosity = verb
         return err
     
     def getErrorEstimatorInterpolatory(self, mus:Np1D) -> Np1D:
         """Interpolation-based residual estimator."""
         errTest, QTest, idxMaxEst = self._EIMStep(mus)
         self.initEstimatorNormEngine()
         mu_muTestSample = mus[idxMaxEst]
         app_muTestSample = self.getApproxReduced(mu_muTestSample)
         if self._mode == RROMPy_FRAGILE:
             if not self.HFEngine.isCEye:
                 raise RROMPyException(("Cannot compute INTERPOLATORY residual "
                                        "estimator in fragile mode for "
                                        "non-scalar C."))
             app_muTestSample = dot(self.trainedModel.data.projMat,
                                    app_muTestSample.data)
         else:
             app_muTestSample = dot(self.samplingEngine.samples,
                                    app_muTestSample)
         resmu = self.HFEngine.residual(mu_muTestSample, app_muTestSample,
                                        post_c = False)
         RHSmu = self.HFEngine.residual(mu_muTestSample, None, post_c = False)
         ressamples = (self.estimatorNormEngine.norm(resmu)
                     / self.estimatorNormEngine.norm(RHSmu))
-        # improve the following by explicitly constructing
-        # (tensorised) interpolant as in while loop
         musT = copy(self.mus)
         musT.append(mu_muTestSample)
         musT = self.trainedModel.centerNormalize(musT)
         musC = self.trainedModel.centerNormalize(mus)
         resT = np.zeros(len(musT), dtype = np.complex)
         err = np.zeros(len(mus))
         for l in range(len(mu_muTestSample)):
             resT[len(self.mus) + l] = ressamples[l] * QTest[idxMaxEst[l]]
             p = PI()
             wellCond, msg = p.setupByInterpolation(musT, resT, self.E + 1,
                                          self.polybasis, self.verbosity >= 15,
                                          True, {}, {"rcond": self.interpRcond})
             err += np.abs(p(musC))
             resT[len(self.mus) + l] = 0.
         err /= QTest
         vbMng(self, "MAIN", msg, 15)
         return err
 
     def getErrorEstimatorLookAhead(self, mus:Np1D) -> Tuple[Np1D, List[int]]:
         """Residual estimator based on look-ahead idea."""
         errTest, QTest, idxMaxEst = self._EIMStep(mus)
         self.initEstimatorNormEngine()
         mu_muTestSample = mus[idxMaxEst]
         app_muTestSample = self.getApproxReduced(mu_muTestSample)
         if self._mode == RROMPy_FRAGILE:
             app_muTestSample = dot(self.trainedModel.data.projMat,
                                    app_muTestSample.data)
         else:
             app_muTestSample = dot(self.samplingEngine.samples,
                                    app_muTestSample)
         for j, mu in enumerate(mu_muTestSample):
             self.samplingEngine.nextSample(mu)
             if hasattr(self.samplingEngine, "samples_full"):
                 uEx = self.samplingEngine.samples_full[-1]
             else:
                 uEx = self.samplingEngine.samples[-1]
             if j == 0:
-                RHSmu = emptySampleList()
-                RHSmu.reset((len(uEx), len(mu_muTestSample)),
+                solmu = emptySampleList()
+                solmu.reset((len(uEx), len(mu_muTestSample)),
                             dtype = uEx.dtype)
-            RHSmu[j] = uEx
-        resmu = RHSmu - app_muTestSample
-        ressamples = (self.estimatorNormEngine.norm(resmu)
-                    / self.estimatorNormEngine.norm(RHSmu))
-        # improve the following by explicitly constructing
-        # (tensorised) interpolant as in while loop
+            solmu[j] = uEx
+        errmu = solmu - app_muTestSample
+        errsamples = (self.estimatorNormEngine.norm(errmu)
+                    / self.estimatorNormEngine.norm(solmu))
         musT = copy(self.mus)
         musT.append(mu_muTestSample)
         musT = self.trainedModel.centerNormalize(musT)
         musC = self.trainedModel.centerNormalize(mus)
-        resT = np.zeros(len(musT), dtype = np.complex)
+        errT = np.zeros(len(musT), dtype = np.complex)
         err = np.zeros(len(mus))
         for l in range(len(mu_muTestSample)):
-            resT[len(self.mus) + l] = ressamples[l] * QTest[idxMaxEst[l]]
+            errT[len(self.mus) + l] = errsamples[l] * QTest[idxMaxEst[l]]
             p = PI()
-            wellCond, msg = p.setupByInterpolation(musT, resT, self.E + 1,
+            wellCond, msg = p.setupByInterpolation(musT, errT, self.E + 1,
                                          self.polybasis, self.verbosity >= 15,
                                          True, {}, {"rcond": self.interpRcond})
             err += np.abs(p(musC))
-            resT[len(self.mus) + l] = 0.
+            errT[len(self.mus) + l] = 0.
         err /= QTest
         vbMng(self, "MAIN", msg, 15)
         return err, idxMaxEst
     
     def getErrorEstimatorNone(self, mus:Np1D) -> Np1D:
         """EIM-based residual estimator."""
         err = np.max(self._EIMStep(mus, True), axis = 1)
         err *= self.greedyTol / np.mean(err)
         return err
 
     def _EIMStep(self, mus:Np1D,
                  only_one : bool = False) -> Tuple[Np1D, Np1D, List[int]]:
         """Residual estimator based on look-ahead idea."""
         mus = checkParameterList(mus, self.npar)[0]
         muCTest = self.trainedModel.centerNormalize(mus)
         verb = self.trainedModel.verbosity
         self.trainedModel.verbosity = 0
         QTest = self.trainedModel.getQVal(mus)
         QTest = np.abs(QTest)
         muCTest = self.trainedModel.centerNormalize(mus)
         muCTrain = self.trainedModel.centerNormalize(self.mus)
         vanTest = self._polyvanderAuxiliary(muCTest, self.E, self.polybasis)
         vanTestNext = self._polyvanderAuxiliary(muCTest, self.E + 1,
                                                 self.polybasis)[:,
                                                             vanTest.shape[1] :]
         idxsTest = np.arange(vanTestNext.shape[1])
         basis = np.zeros((len(idxsTest), 0), dtype = float)
         idxMaxEst = []
         while len(idxsTest) > 0:
             vanTrial = self._polyvanderAuxiliary(muCTrain, self.E,
                                                  self.polybasis)
             vanTrialNext = self._polyvanderAuxiliary(muCTrain, self.E + 1,
                                                      self.polybasis)[:,
                                                            vanTrial.shape[1] :]
             vanTrial = np.hstack((vanTrial, vanTrialNext.dot(basis).reshape(
                                            len(vanTrialNext), basis.shape[1])))
             valuesTrial = vanTrialNext[:, idxsTest]
             vanTestEff = np.hstack((vanTest, vanTestNext.dot(basis).reshape(
                                             len(vanTestNext), basis.shape[1])))
             vanTestNextEff = vanTestNext[:, idxsTest]
             coeffTest = np.linalg.solve(vanTrial, valuesTrial)
             errTest = (np.abs(vanTestNextEff - vanTestEff.dot(coeffTest))
                      / np.expand_dims(QTest, 1))
             if only_one: return errTest
             idxMaxErr = np.unravel_index(np.argmax(errTest), errTest.shape)
             idxMaxEst += [idxMaxErr[0]]
             muCTrain.append(muCTest[idxMaxErr[0]])
             basis = np.pad(basis, [(0, 0), (0, 1)], "constant")
             basis[idxsTest[idxMaxErr[1]], -1] = 1.
             idxsTest = np.delete(idxsTest, idxMaxErr[1])
         self.trainedModel.verbosity = verb
         return errTest, QTest, idxMaxEst
     
     def errorEstimator(self, mus:Np1D, return_max : bool = False) -> Np1D:
         """Standard residual-based error estimator."""
         setupOK = self.setupApproxLocal()
         if not setupOK:
             err = np.empty(len(mus))
             err[:] = np.nan
             if not return_max: return err
             return err, 0, np.nan
         mus = checkParameterList(mus, self.npar)[0]
         vbMng(self.trainedModel, "INIT",
               "Evaluating error estimator at mu = {}.".format(mus), 10)
         if self.errorEstimatorKind == "AFFINE":
             err = self.getErrorEstimatorAffine(mus)
         else:
             self._setupInterpolationIndices()
             if self.errorEstimatorKind == "DISCREPANCY":
                 err = self.getErrorEstimatorDiscrepancy(mus)
             elif self.errorEstimatorKind == "INTERPOLATORY":
                 err = self.getErrorEstimatorInterpolatory(mus)
             elif self.errorEstimatorKind == "LOOK_AHEAD":
                 err, idxMaxEst = self.getErrorEstimatorLookAhead(mus)
             else: #if self.errorEstimatorKind == "NONE":
                 err = self.getErrorEstimatorNone(mus)
         vbMng(self.trainedModel, "DEL", "Done evaluating error estimator", 10)
         if not return_max: return err
         if self.errorEstimatorKind != "LOOK_AHEAD":
             idxMaxEst = np.empty(self.sampleBatchSize, dtype = int)
             errCP = copy(err)
             for j in range(self.sampleBatchSize):
                 k = np.argmax(errCP)
                 idxMaxEst[j] = k
                 if j + 1 < self.sampleBatchSize:
                     musZero = self.trainedModel.centerNormalize(mus, mus[k])
                     errCP *= np.linalg.norm(musZero.data, axis = 1)
         return err, idxMaxEst, err[idxMaxEst]
 
     def greedyNextSample(self, muidx:int, plotEst : bool = False)\
                                           -> Tuple[Np1D, int, float, paramVal]:
         """Compute next greedy snapshot of solution map."""
         RROMPyAssert(self._mode, message = "Cannot add greedy sample.")
         self.sampleBatchIdx += 1
         self.sampleBatchSize = totalDegreeN(self.npar - 1, self.sampleBatchIdx)
         err, muidx, maxErr, muNext =  super().greedyNextSample(muidx, plotEst)
         if maxErr is not None and (np.any(np.isnan(maxErr))
                                 or np.any(np.isinf(maxErr))):
             self.sampleBatchIdx -= 1
             self.sampleBatchSize = totalDegreeN(self.npar - 1,
                                                 self.sampleBatchIdx)
         if (self.errorEstimatorKind == "NONE" and not np.isnan(maxErr)
                                               and not np.isinf(maxErr)):
             maxErr = None
         return err, muidx, maxErr, muNext
 
     def _preliminaryTraining(self):
         """Initialize starting snapshots of solution map."""
         RROMPyAssert(self._mode, message = "Cannot start greedy algorithm.")
         if self.samplingEngine.nsamples > 0:
             return
         S = self.S
         self.sampleBatchIdx, self.sampleBatchSize, self._S = -1, 0, 0
         nextBatchSize = 1
         while self._S + nextBatchSize <= S:
             self.sampleBatchIdx += 1
             self.sampleBatchSize = nextBatchSize
             self._S += self.sampleBatchSize
             nextBatchSize = totalDegreeN(self.npar - 1,
                                          self.sampleBatchIdx + 1)
         super()._preliminaryTraining()
 
     def setupApproxLocal(self):
         """
         Compute rational interpolant.
         SVD-based robust eigenvalue management.
         """
         if self.checkComputedApprox():
             return True
         RROMPyAssert(self._mode, message = "Cannot setup approximant.")
         self.verbosity -= 10
         vbMng(self, "INIT", "Setting up local approximant.", 5)
         self._N, self._M = [self.E] * 2
         pMat = self.samplingEngine.samples.data
         pMatEff = dot(self.HFEngine.C, pMat)
         if self.trainedModel is None:
             self.trainedModel = self.tModelType()
             self.trainedModel.verbosity = self.verbosity
             self.trainedModel.timestamp = self.timestamp
             datadict = {"mu0": self.mu0, "projMat": pMatEff,
                         "scaleFactor": self.scaleFactor,
                         "rescalingExp": self.HFEngine.rescalingExp}
             self.trainedModel.data = self.initializeModelData(datadict)[0]
         else:
             self.trainedModel = self.trainedModel
             self.trainedModel.data.projMat = copy(pMatEff)
             self.trainedModel.data.mus = copy(self.mus)
         self.trainedModel.data.mus = copy(self.mus)
         self.catchInstability = True
         if self.N > 0:
             try:
                 Q = self._setupDenominator()[0]
             except RROMPyException as RE:
                 RROMPyWarning(RE._msg)
                 vbMng(self, "DEL", "Done setting up local approximant.", 5)
                 return False
         else:
             Q = PI()
             Q.coeffs = np.ones((1,) * self.npar, dtype = np.complex)
             Q.npar = self.npar
             Q.polybasis = self.polybasis
         self.trainedModel.data.Q = copy(Q)
         try:
             self.trainedModel.data.P = copy(self._setupNumerator())
         except RROMPyException as RE:
             RROMPyWarning(RE._msg)
             vbMng(self, "DEL", "Done setting up local approximant.", 5)
             return False
         self.trainedModel.data.approxParameters = copy(self.approxParameters)
         vbMng(self, "DEL", "Done setting up local approximant.", 5)
         self.verbosity += 10
         return True
         
     def loadTrainedModel(self, filename:str):
         """Load trained reduced model from file."""
         super().loadTrainedModel(filename)
         self.sampleBatchIdx, self.sampleBatchSize, _S = -1, 0, 0
         nextBatchSize = 1
         while _S + nextBatchSize <= self.S + 1:
             self.sampleBatchIdx += 1
             self.sampleBatchSize = nextBatchSize
             _S += self.sampleBatchSize
             nextBatchSize = totalDegreeN(self.npar - 1,
                                          self.sampleBatchIdx + 1)
 
diff --git a/rrompy/reduction_methods/pivoted/rational_interpolant_greedy_pivoted.py b/rrompy/reduction_methods/pivoted/rational_interpolant_greedy_pivoted.py
index 914e0c3..da79089 100644
--- a/rrompy/reduction_methods/pivoted/rational_interpolant_greedy_pivoted.py
+++ b/rrompy/reduction_methods/pivoted/rational_interpolant_greedy_pivoted.py
@@ -1,433 +1,453 @@
 # Copyright (C) 2018 by the RROMPy authors
 #
 # This file is part of RROMPy.
 #
 # RROMPy is free software: you can redistribute it and/or modify
 # it under the terms of the GNU Lesser General Public License as published by
 # the Free Software Foundation, either version 3 of the License, or
 # (at your option) any later version.
 #
 # RROMPy is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 # GNU Lesser General Public License for more details.
 #
 # You should have received a copy of the GNU Lesser General Public License
 # along with RROMPy. If not, see <http://www.gnu.org/licenses/>.
 #
 
 from copy import deepcopy as copy
 import numpy as np
 from .generic_pivoted_approximant import GenericPivotedApproximant
 from rrompy.reduction_methods.greedy.rational_interpolant_greedy import (
                                                      RationalInterpolantGreedy)
 from rrompy.reduction_methods.greedy.generic_greedy_approximant import (
                                                                   pruneSamples)
 from rrompy.utilities.base.types import Np1D, HFEng, DictAny, ListAny, paramVal
 from rrompy.utilities.base import verbosityManager as vbMng
 from rrompy.utilities.numerical import totalDegreeN, dot
 from rrompy.utilities.poly_fitting.polynomial import polyvander as pv
 from rrompy.utilities.exception_manager import RROMPyAssert
-from rrompy.parameter import emptyParameterList, parameterList
+from rrompy.parameter import emptyParameterList, checkParameterList
 
 __all__ = ['RationalInterpolantGreedyPivoted']
 
 class RationalInterpolantGreedyPivoted(GenericPivotedApproximant,
                                        RationalInterpolantGreedy):
     """
     ROM pivoted rational interpolant (with pole matching) computation for
         parametric problems.
 
     Args:
         HFEngine: HF problem solver.
         mu0(optional): Default parameter. Defaults to 0.
         directionPivot(optional): Pivot components. Defaults to [0].
         approxParameters(optional): Dictionary containing values for main
             parameters of approximant. Recognized keys are:
             - 'POD': whether to compute POD of snapshots; defaults to True;
             - 'matchingWeight': weight for pole matching optimization; defaults
                 to 1;
             - 'cutOffTolerance': tolerance for ignoring parasitic poles;
                 defaults to np.inf;
             - 'cutOffType': rule for tolerance computation for parasitic poles;
                 defaults to 'MAGNITUDE';
             - 'S': total number of pivot samples current approximant relies
                 upon;
             - 'samplerPivot': pivot sample point generator;
             - 'SMarginal': total number of marginal samples current approximant
                 relies upon;
             - 'samplerMarginal': marginal sample point generator;
             - 'polybasis': type of polynomial basis for pivot
                 interpolation; defaults to 'MONOMIAL';
             - 'polybasisMarginal': type of polynomial basis for marginal
                 interpolation; allowed values include 'MONOMIAL', 'CHEBYSHEV'
                 and 'LEGENDRE'; defaults to 'MONOMIAL';
             - 'greedyTol': uniform error tolerance for greedy algorithm;
                 defaults to 1e-2;
             - 'collinearityTol': collinearity tolerance for greedy algorithm;
                 defaults to 0.;
             - 'maxIter': maximum number of greedy steps; defaults to 1e2;
             - 'refinementRatio': ratio of test points to be exhausted before
                 test set refinement; defaults to 0.2;
             - 'nTestPoints': number of test points; defaults to 5e2;
             - 'trainSetGenerator': training sample points generator; defaults
                 to sampler;
             - 'errorEstimatorKind': kind of error estimator; available values
                 include 'AFFINE', 'DISCREPANCY', 'INTERPOLATORY',
                 'LOOK_AHEAD', and 'NONE'; defaults to 'NONE';
             - 'MMarginal': degree of marginal interpolant; defaults to 0;
             - 'polydegreetypeMarginal': type of polynomial degree for marginal;
                 defaults to 'TOTAL';
             - 'radialDirectionalWeightsMarginal': radial basis weights for
                 marginal interpolant; defaults to 0, i.e. identity;
             - 'nNearestNeighborMarginal': number of marginal nearest neighbors
                 considered if polybasisMarginal allows; defaults to -1;
             - 'interpRcond': tolerance for pivot interpolation; defaults to
                 None;
             - 'interpRcondMarginal': tolerance for marginal interpolation;
                 defaults to None;
             - 'robustTol': tolerance for robust rational denominator
                 management; defaults to 0.
             Defaults to empty dict.
         approx_state(optional): Whether to approximate state. Defaults to
             False.
         verbosity(optional): Verbosity level. Defaults to 10.
             
     Attributes:
         HFEngine: HF problem solver.
         mu0: Default parameter.
         directionPivot: Pivot components.
         mus: Array of snapshot parameters.
         musPivot: Array of pivot snapshot parameters.
         musMarginal: Array of marginal snapshot parameters.
         approxParameters: Dictionary containing values for main parameters of
             approximant. Recognized keys are in parameterList.
         parameterListSoft: Recognized keys of soft approximant parameters:
             - 'POD': whether to compute POD of snapshots;
             - 'matchingWeight': weight for pole matching optimization;
             - 'cutOffTolerance': tolerance for ignoring parasitic poles;
             - 'cutOffType': rule for tolerance computation for parasitic poles;
             - 'polybasis': type of polynomial basis for pivot
                 interpolation;
             - 'polybasisMarginal': type of polynomial basis for marginal
                 interpolation;
             - 'greedyTol': uniform error tolerance for greedy algorithm;
             - 'collinearityTol': collinearity tolerance for greedy algorithm;
             - 'maxIter': maximum number of greedy steps;
             - 'refinementRatio': ratio of test points to be exhausted before
                 test set refinement;
             - 'nTestPoints': number of test points;
             - 'trainSetGenerator': training sample points generator;
             - 'errorEstimatorKind': kind of error estimator;
             - 'MMarginal': degree of marginal interpolant;
             - 'polydegreetypeMarginal': type of polynomial degree for marginal;
             - 'radialDirectionalWeights': radial basis weights for pivot
                 numerator;
             - 'radialDirectionalWeightsMarginal': radial basis weights for
                 marginal interpolant;
             - 'nNearestNeighbor': number of pivot nearest neighbors considered
                 if polybasis allows;
             - 'nNearestNeighborMarginal': number of marginal nearest neighbors
                 considered if polybasisMarginal allows;
             - 'interpRcond': tolerance for pivot interpolation;
             - 'interpRcondMarginal': tolerance for marginal interpolation;
             - 'robustTol': tolerance for robust rational denominator
                 management;
             - 'correctorForce': whether corrector should forcefully delete bad
                 poles;
             - 'correctorTol': tolerance for corrector step;
             - 'correctorMaxIter': maximum number of corrector iterations.
         parameterListCritical: Recognized keys of critical approximant
             parameters:
             - 'S': total number of pivot samples current approximant relies
                 upon;
             - 'samplerPivot': pivot sample point generator;
             - 'SMarginal': total number of marginal samples current approximant
                 relies upon;
             - 'samplerMarginal': marginal sample point generator.
         approx_state: Whether to approximate state.
         verbosity: Verbosity level.
         POD: Whether to compute POD of snapshots.
         matchingWeight: Weight for pole matching optimization.
         cutOffTolerance: Tolerance for ignoring parasitic poles.
         cutOffType: Rule for tolerance computation for parasitic poles.
         S: Total number of pivot samples current approximant relies upon.
         samplerPivot: Pivot sample point generator.
         SMarginal: Total number of marginal samples current approximant relies
             upon.
         samplerMarginal: Marginal sample point generator.
         polybasis: Type of polynomial basis for pivot interpolation.
         polybasisMarginal: Type of polynomial basis for marginal interpolation.
         greedyTol: uniform error tolerance for greedy algorithm.
         collinearityTol: Collinearity tolerance for greedy algorithm.
         maxIter: maximum number of greedy steps.
         refinementRatio: ratio of training points to be exhausted before
             training set refinement.
         nTestPoints: number of starting training points.
         trainSetGenerator: training sample points generator.
         errorEstimatorKind: kind of error estimator.
         MMarginal: Degree of marginal interpolant.
         polydegreetypeMarginal: Type of polynomial degree for marginal.
         radialDirectionalWeightsMarginal: Radial basis weights for marginal
             interpolant.
         nNearestNeighborMarginal: Number of marginal nearest neighbors
             considered if polybasisMarginal allows.
         interpRcond: Tolerance for pivot interpolation.
         interpRcondMarginal: Tolerance for marginal interpolation.
         robustTol: Tolerance for robust rational denominator management.
         muBoundsPivot: list of bounds for pivot parameter values.
         muBoundsMarginal: list of bounds for marginal parameter values.
         samplingEngine: Sampling engine.
         uHF: High fidelity solution(s) with parameter(s) lastSolvedHF as
             sampleList.
         lastSolvedHF: Parameter(s) corresponding to last computed high fidelity
             solution(s) as parameterList.
         uApproxReduced: Reduced approximate solution(s) with parameter(s)
             lastSolvedApprox as sampleList.
         lastSolvedApproxReduced: Parameter(s) corresponding to last computed
             reduced approximate solution(s) as parameterList.
         uApprox: Approximate solution(s) with parameter(s) lastSolvedApprox as
             sampleList.
         lastSolvedApprox: Parameter(s) corresponding to last computed
             approximate solution(s) as parameterList.
         Q: Numpy 1D vector containing complex coefficients of approximant
             denominator.
         P: Numpy 2D vector whose columns are FE dofs of coefficients of
             approximant numerator.
     """
     
     def __init__(self, HFEngine:HFEng, mu0 : paramVal = None,
                  directionPivot : ListAny = [0],
                  approxParameters : DictAny = {}, approx_state : bool = False,
                  verbosity : int = 10, timestamp : bool = True):
         self._preInit()
         self._addParametersToList(toBeExcluded = ["sampler"])
         super().__init__(HFEngine = HFEngine, mu0 = mu0,
                          directionPivot = directionPivot,
                          approxParameters = approxParameters,
                          approx_state = approx_state, verbosity = verbosity,
                          timestamp = timestamp)
         self._postInit()
 
     @property
     def tModelType(self):
         if hasattr(self, "_temporaryPivot"): return super().tModelType
         from rrompy.reduction_methods.trained_model import \
                                                     TrainedModelPivotedRational
         return TrainedModelPivotedRational
 
     @property
     def polybasis0(self):
         if "_" in self.polybasis:
             return self.polybasis.split("_")[0]
         return self.polybasis
 
     def _polyvanderAuxiliary(self, mus, deg, *args):
         degEff = [0] * self.npar
         degEff[self.directionPivot[0]] = deg
         return pv(mus, degEff, *args)
 
     def _marginalizeMiscellanea(self, forward:bool):
         if forward:
             self._m_mu0 = copy(self.mu0)
             self._m_selfmus = copy(self.mus)
             self._m_HFErescalingExp = copy(self.HFEngine.rescalingExp)
-            self._mu0 = parameterList(self.mu0(self.directionPivot))
-            self._mus = parameterList(self.mus(self.directionPivot))
+            self._mu0 = checkParameterList(self.mu0(self.directionPivot), 1)[0]
+            self._mus = checkParameterList(self.mus(self.directionPivot), 1)[0]
             self.HFEngine.rescalingExp = [self.HFEngine.rescalingExp[
                                                        self.directionPivot[0]]]
         else:
             self._mu0 = self._m_mu0
             self._mus = self._m_selfmus
             self.HFEngine.rescalingExp = self._m_HFErescalingExp
             del self._m_mu0, self._m_selfmus, self._m_HFErescalingExp
 
     def _marginalizeTrainedModel(self, forward:bool):
         if forward:
             del self._temporaryPivot
             self.trainedModel.data.mu0 = self.mu0
             self.trainedModel.data.scaleFactor = [1.] * self.npar
             self.trainedModel.data.scaleFactor[self.directionPivot[0]] = (
                                                            self.scaleFactor[0])
             self.trainedModel.data.rescalingExp = self.HFEngine.rescalingExp
             Qc = np.zeros((len(self.trainedModel.data.Q.coeffs),) * self.npar,
                           dtype = self.trainedModel.data.Q.coeffs.dtype)
             Pc = np.zeros((len(self.trainedModel.data.P.coeffs),) * self.npar
                         + (self.trainedModel.data.P.coeffs.shape[1],),
                           dtype = self.trainedModel.data.P.coeffs.dtype)
             for j in range(len(self.trainedModel.data.Q.coeffs)):
                 Qc[(0,) * self.directionPivot[0] + (j,)
                  + (0,) * (self.npar - self.directionPivot[0] - 1)] = (
                                             self.trainedModel.data.Q.coeffs[j])
             for j in range(len(self.trainedModel.data.P.coeffs)):
                 for k in range(self.trainedModel.data.P.coeffs.shape[1]):
                     Pc[(0,) * self.directionPivot[0] + (j,)
                      + (0,) * (self.npar - self.directionPivot[0] - 1)
                      + (k,)] = self.trainedModel.data.P.coeffs[j, k]
             self.trainedModel.data.Q.coeffs = Qc
             self.trainedModel.data.P.coeffs = Pc
         else:
             self._temporaryPivot = 1
-            self.trainedModel.data.mu0 = parameterList(
-                                                 self.mu0(self.directionPivot))
+            self.trainedModel.data.mu0 = checkParameterList(
+                                           self.mu0(self.directionPivot), 1)[0]
             self.trainedModel.data.scaleFactor = self.scaleFactor
             self.trainedModel.data.rescalingExp = self.HFEngine.rescalingExp[
                                                         self.directionPivot[0]]
             self.trainedModel.data.Q.coeffs = self.trainedModel.data.Q.coeffs[
                                                (0,) * self.directionPivot[0]
                                              + (slice(None),)
                                              + (0,) * (self.HFEngine.npar - 1
                                                      - self.directionPivot[0])]
             self.trainedModel.data.P.coeffs = self.trainedModel.data.P.coeffs[
                                                (0,) * self.directionPivot[0]
                                              + (slice(None),)
                                              + (0,) * (self.HFEngine.npar - 1
                                                      - self.directionPivot[0])]
         self.trainedModel.data.npar = self.npar
         self.trainedModel.data.Q.npar = self.npar
         self.trainedModel.data.P.npar = self.npar
 
     def errorEstimator(self, mus:Np1D, return_max : bool = False) -> Np1D:
         """Standard residual-based error estimator."""
         self._marginalizeMiscellanea(True)
         setupOK = self.setupApproxLocal()
         self._marginalizeMiscellanea(False)
         if not setupOK:
             err = np.empty(len(mus))
             err[:] = np.nan
             if not return_max: return err
             return err, 0, np.nan
         self._marginalizeTrainedModel(True)
         errRes = super().errorEstimator(mus, return_max)
         self._marginalizeTrainedModel(False)
         return errRes
 
     def _preliminaryTraining(self):
         """Initialize starting snapshots of solution map."""
         RROMPyAssert(self._mode, message = "Cannot start greedy algorithm.")
         S = self.S
         self.sampleBatchIdx, self.sampleBatchSize, self._S = -1, 0, 0
         nextBatchSize = 1
         while self._S + nextBatchSize <= S:
             self.sampleBatchIdx += 1
             self.sampleBatchSize = nextBatchSize
             self._S += self.sampleBatchSize
             nextBatchSize = totalDegreeN(self.npar - 1,
                                          self.sampleBatchIdx + 1)
         self.resetSamples()
-        musPivot = parameterList(self.trainSetGenerator.generatePoints(self.S)[
-                                                          list(range(self.S))])
+        musPivot = self.trainSetGenerator.generatePoints(self.S)[
+                                                           list(range(self.S))]
+        musPivot = checkParameterList(musPivot, 1)[0]
         muTestPivot = self.samplerPivot.generatePoints(self.nTestPoints)
         idxPop = pruneSamples(muTestPivot ** self.HFEngine.rescalingExp[
                                                        self.directionPivot[0]],
                               musPivot ** self.HFEngine.rescalingExp[
                                                        self.directionPivot[0]],
                               1e-10 * self.scaleFactor[0])
         self.mus = emptyParameterList()
         self.mus.reset((self.S, self.npar + len(self.musMargLoc)))
         muTestBase = emptyParameterList()
         muTestBase.reset((len(muTestPivot), self.npar + len(self.musMargLoc)))
         for k in range(self.S):
             self.mus.data[k, self.directionPivot] = musPivot[k].data
             self.mus.data[k, self.directionMarginal] = self.musMargLoc.data
         for k in range(len(muTestPivot)):
             muTestBase.data[k, self.directionPivot] = muTestPivot[k].data
             muTestBase.data[k, self.directionMarginal] = self.musMargLoc.data
         muTestBase.pop(idxPop)
         muTestBase = muTestBase.sort()
         muLast = copy(self.mus[-1])
         self.mus.pop()
         if len(self.mus) > 0:
             vbMng(self, "MAIN", 
                   ("Adding first {} sample point{} at {} to training "
                    "set.").format(self.S - 1, "" + "s" * (self.S > 2),
                                   self.mus), 2)
             self.samplingEngine.iterSample(self.mus)
         self._S = len(self.mus)
         self._approxParameters["S"] = self.S
         self.muTest = emptyParameterList()
         self.muTest.reset((len(muTestBase) + 1, self.mus.shape[1]))
         self.muTest.data[: -1] = muTestBase.data
         self.muTest.data[-1] = muLast.data
 
+    def _enrichTestSet(self, nTest:int):
+        """Add extra elements to test set."""
+        RROMPyAssert(self._mode, message = "Cannot enrich test set.")
+        muTestExtra = self.samplerPivot.generatePoints(2 * nTest)
+        muTotal = copy(self.mus)
+        muTotal.append(self.muTest)
+        idxPop = pruneSamples(muTestExtra ** self.HFEngine.rescalingExp[
+                                                       self.directionPivot[0]],
+                              muTotal ** self.HFEngine.rescalingExp[
+                                                       self.directionPivot[0]],
+                              1e-10 * self.scaleFactor[0])
+        muTestExtra.pop(idxPop)
+        muTestNew = np.empty((len(self.muTest) + len(muTestExtra),
+                              self.muTest.shape[1]), dtype = np.complex)
+        muTestNew[: len(self.muTest)] = self.muTest.data
+        muTestNew[len(self.muTest) :] = muTestExtra.data
+        self.muTest = checkParameterList(muTestNew, self.npar)[0].sort()
+        vbMng(self, "MAIN",
+              "Enriching test set by {} elements.".format(len(muTestExtra)), 5)
+
     def setupApprox(self, plotEst : bool = False):
         """Compute rational interpolant."""
         if self.checkComputedApprox():
             return True
         RROMPyAssert(self._mode, message = "Cannot setup approximant.")
         vbMng(self, "INIT", "Setting up {}.". format(self.name()), 5)
         self.musMarginal = self.samplerMarginal.generatePoints(self.SMarginal)
         S0 = copy(self.S)
         Qs, Ps = [], []
         self.computeScaleFactor()
         self._scaleFactorOldPivot = copy(self.scaleFactor)
         self.scaleFactor = self.scaleFactorPivot
         nparEff = self.npar
         self._temporaryPivot = 1
         samplingEngs = []
         for j in range(len(self.musMarginal)):
             self._S = S0
             self.musMargLoc = self.musMarginal[j]
             RationalInterpolantGreedy.setupSampling(self)
             self.trainedModel = None
             self.verbosity -= 5
             super().setupApprox(plotEst)
             self.verbosity += 5
             samplingEngs += [copy(self.samplingEngine)]
             Qs = Qs + [copy(self.trainedModel.data.Q)]
             Ps = Ps + [copy(self.trainedModel.data.P)]
         del self.musMargLoc
         # other finalization instructions
         self.setupSampling()
         self.samplingEngine.resetHistory(len(self.musMarginal))
         for j in range(len(self.musMarginal)):
             self.samplingEngine.setsample(samplingEngs[j].samples, j, False)
             self.samplingEngine.mus[j] = copy(samplingEngs[j].mus)
             self.samplingEngine.nsamples[j] = samplingEngs[j].nsamples
             self.samplingEngine.postprocessuBulk(j)
             if j == 0:
-                self._mus = parameterList(samplingEngs[j].mus, nparEff)
+                self._mus = checkParameterList(samplingEngs[j].mus, nparEff)[0]
             else:
                 self._mus.append(samplingEngs[j].mus)
         if self.POD:
             self.samplingEngine.coalesceSamples(self.interpRcondMarginal)
             postR = self.samplingEngine.RPODCoalesced
         else:
             self.samplingEngine.coalesceSamples()
             postR = np.eye(self.samplingEngine.samplesCoalesced.shape[1])
         # update Ps by post-multiplication with suitable matrix
         idxCurr = 0
         for j in range(len(self.musMarginal)):
             nsj = Ps[j].coeffs.shape[1]
             Ps[j].coeffs = dot(Ps[j].coeffs,
                                postR[:, idxCurr : idxCurr + nsj].T)
             idxCurr = idxCurr + nsj
         self.scaleFactor = self._scaleFactorOldPivot
         del self._scaleFactorOldPivot, self._temporaryPivot
         pMat = self.samplingEngine.samplesCoalesced.data
         pMatEff = dot(self.HFEngine.C, pMat)
         self.trainedModel = self.tModelType()
         self.trainedModel.verbosity = self.verbosity
         self.trainedModel.timestamp = self.timestamp
         datadict = {"mu0": self.mu0, "projMat": pMatEff,
                     "scaleFactor": self.scaleFactor,
                     "rescalingExp": self.HFEngine.rescalingExp,
                     "directionPivot": self.directionPivot}
         self.trainedModel.data = self.initializeModelData(datadict)[0]
         self.trainedModel.data.mus = copy(self.mus)
         self.trainedModel.data.musMarginal = copy(self.musMarginal)
         self.trainedModel.data.marginalInterp = self._setupMarginalInterp()
         self.trainedModel.data.Qs, self.trainedModel.data.Ps = Qs, Ps
         vbMng(self, "INIT", "Matching poles.", 10)
         self.trainedModel.initializeFromRational(self.HFEngine,
                                                  self.matchingWeight, self.POD,
                                                  self.approx_state)
         vbMng(self, "DEL", "Done matching poles.", 10)
-        if not np.isinf(self.cutOffTolerance):
-            vbMng(self, "INIT", "Recompressing by cut-off.", 10)
-            msg = self.trainedModel.recompressByCutOff([-1., 1.],
-                                                       self.cutOffTolerance,
-                                                       self.cutOffType)
-            vbMng(self, "DEL", "Done recompressing." + msg, 10)
+        vbMng(self, "INIT", "Recompressing by cut-off.", 10)
+        msg = self.trainedModel.recompressByCutOff([-1., 1.],
+                                                   self.cutOffTolerance,
+                                                   self.cutOffType)
+        vbMng(self, "DEL", "Done recompressing." + msg, 10)
         self.trainedModel.data.approxParameters = copy(self.approxParameters)
         vbMng(self, "DEL", "Done setting up approximant.", 5)
diff --git a/rrompy/reduction_methods/pivoted/rational_interpolant_pivoted.py b/rrompy/reduction_methods/pivoted/rational_interpolant_pivoted.py
index b52a7a0..99a31ac 100644
--- a/rrompy/reduction_methods/pivoted/rational_interpolant_pivoted.py
+++ b/rrompy/reduction_methods/pivoted/rational_interpolant_pivoted.py
@@ -1,367 +1,366 @@
 # Copyright (C) 2018 by the RROMPy authors
 #
 # This file is part of RROMPy.
 #
 # RROMPy is free software: you can redistribute it and/or modify
 # it under the terms of the GNU Lesser General Public License as published by
 # the Free Software Foundation, either version 3 of the License, or
 # (at your option) any later version.
 #
 # RROMPy is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 # GNU Lesser General Public License for more details.
 #
 # You should have received a copy of the GNU Lesser General Public License
 # along with RROMPy. If not, see <http://www.gnu.org/licenses/>.
 #
 
 from copy import deepcopy as copy
 import numpy as np
 from .generic_pivoted_approximant import GenericPivotedApproximant
 from rrompy.reduction_methods.standard.rational_interpolant import (
                                                            RationalInterpolant)
 from rrompy.utilities.base.types import HFEng, DictAny, ListAny, paramVal
 from rrompy.utilities.base import verbosityManager as vbMng
 from rrompy.utilities.numerical import dot, nextDerivativeIndices
 from rrompy.utilities.exception_manager import RROMPyAssert, RROMPyWarning
 from rrompy.parameter import emptyParameterList
 
 __all__ = ['RationalInterpolantPivoted']
 
 class RationalInterpolantPivoted(GenericPivotedApproximant,
                                  RationalInterpolant):
     """
     ROM pivoted rational interpolant (with pole matching) computation for
         parametric problems.
 
     Args:
         HFEngine: HF problem solver.
         mu0(optional): Default parameter. Defaults to 0.
         directionPivot(optional): Pivot components. Defaults to [0].
         approxParameters(optional): Dictionary containing values for main
             parameters of approximant. Recognized keys are:
             - 'POD': whether to compute POD of snapshots; defaults to True;
             - 'matchingWeight': weight for pole matching optimization; defaults
                 to 1;
             - 'cutOffTolerance': tolerance for ignoring parasitic poles;
                 defaults to np.inf;
             - 'cutOffType': rule for tolerance computation for parasitic poles;
                 defaults to 'MAGNITUDE';
             - 'S': total number of pivot samples current approximant relies
                 upon;
             - 'samplerPivot': pivot sample point generator;
             - 'SMarginal': total number of marginal samples current approximant
                 relies upon;
             - 'samplerMarginal': marginal sample point generator;
             - 'polybasis': type of polynomial basis for pivot
                 interpolation; defaults to 'MONOMIAL';
             - 'polybasisMarginal': type of polynomial basis for marginal
                 interpolation; allowed values include 'MONOMIAL', 'CHEBYSHEV'
                 and 'LEGENDRE'; defaults to 'MONOMIAL';
             - 'M': degree of rational interpolant numerator; defaults to 0;
             - 'N': degree of rational interpolant denominator; defaults to 0;
             - 'MMarginal': degree of marginal interpolant; defaults to 0;
             - 'polydegreetypeMarginal': type of polynomial degree for marginal;
                 defaults to 'TOTAL';
             - 'radialDirectionalWeights': radial basis weights for pivot
                 numerator; defaults to 0, i.e. identity;
             - 'radialDirectionalWeightsMarginal': radial basis weights for
                 marginal interpolant; defaults to 0, i.e. identity;
             - 'nNearestNeighbor': number of pivot nearest neighbors considered
                 if polybasis allows; defaults to -1;
             - 'nNearestNeighborMarginal': number of marginal nearest neighbors
                 considered if polybasisMarginal allows; defaults to -1;
             - 'interpRcond': tolerance for pivot interpolation; defaults to
                 None;
             - 'interpRcondMarginal': tolerance for marginal interpolation;
                 defaults to None;
             - 'robustTol': tolerance for robust rational denominator
                 management; defaults to 0;
             - 'correctorForce': whether corrector should forcefully delete bad
                 poles; defaults to False;
             - 'correctorTol': tolerance for corrector step; defaults to 0.,
                 i.e. no bad poles;
             - 'correctorMaxIter': maximum number of corrector iterations;
                 defaults to 1.
             Defaults to empty dict.
         approx_state(optional): Whether to approximate state. Defaults to
             False.
         verbosity(optional): Verbosity level. Defaults to 10.
             
     Attributes:
         HFEngine: HF problem solver.
         mu0: Default parameter.
         directionPivot: Pivot components.
         mus: Array of snapshot parameters.
         musPivot: Array of pivot snapshot parameters.
         musMarginal: Array of marginal snapshot parameters.
         approxParameters: Dictionary containing values for main parameters of
             approximant. Recognized keys are in parameterList.
         parameterListSoft: Recognized keys of soft approximant parameters:
             - 'POD': whether to compute POD of snapshots;
             - 'matchingWeight': weight for pole matching optimization;
             - 'cutOffTolerance': tolerance for ignoring parasitic poles;
             - 'cutOffType': rule for tolerance computation for parasitic poles;
             - 'polybasis': type of polynomial basis for pivot
                 interpolation;
             - 'polybasisMarginal': type of polynomial basis for marginal
                 interpolation;
             - 'M': degree of rational interpolant numerator;
             - 'N': degree of rational interpolant denominator;
             - 'MMarginal': degree of marginal interpolant;
             - 'polydegreetypeMarginal': type of polynomial degree for marginal;
             - 'radialDirectionalWeights': radial basis weights for pivot
                 numerator;
             - 'radialDirectionalWeightsMarginal': radial basis weights for
                 marginal interpolant;
             - 'nNearestNeighbor': number of pivot nearest neighbors considered
                 if polybasis allows;
             - 'nNearestNeighborMarginal': number of marginal nearest neighbors
                 considered if polybasisMarginal allows;
             - 'interpRcond': tolerance for pivot interpolation;
             - 'interpRcondMarginal': tolerance for marginal interpolation;
             - 'robustTol': tolerance for robust rational denominator
                 management;
             - 'correctorForce': whether corrector should forcefully delete bad
                 poles;
             - 'correctorTol': tolerance for corrector step;
             - 'correctorMaxIter': maximum number of corrector iterations.
         parameterListCritical: Recognized keys of critical approximant
             parameters:
             - 'S': total number of pivot samples current approximant relies
                 upon;
             - 'samplerPivot': pivot sample point generator;
             - 'SMarginal': total number of marginal samples current approximant
                 relies upon;
             - 'samplerMarginal': marginal sample point generator.
         approx_state: Whether to approximate state.
         verbosity: Verbosity level.
         POD: Whether to compute POD of snapshots.
         matchingWeight: Weight for pole matching optimization.
         cutOffTolerance: Tolerance for ignoring parasitic poles.
         cutOffType: Rule for tolerance computation for parasitic poles.
         S: Total number of pivot samples current approximant relies upon.
         samplerPivot: Pivot sample point generator.
         SMarginal: Total number of marginal samples current approximant relies
             upon.
         samplerMarginal: Marginal sample point generator.
         polybasis: Type of polynomial basis for pivot interpolation.
         polybasisMarginal: Type of polynomial basis for marginal interpolation.
         M: Numerator degree of approximant.
         N: Denominator degree of approximant.
         MMarginal: Degree of marginal interpolant.
         polydegreetypeMarginal: Type of polynomial degree for marginal.
         radialDirectionalWeights: Radial basis weights for pivot numerator.
         radialDirectionalWeightsMarginal: Radial basis weights for marginal
             interpolant.
         nNearestNeighbor: Number of pivot nearest neighbors considered if
             polybasis allows.
         nNearestNeighborMarginal: Number of marginal nearest neighbors
             considered if polybasisMarginal allows.
         interpRcond: Tolerance for pivot interpolation.
         interpRcondMarginal: Tolerance for marginal interpolation.
         robustTol: Tolerance for robust rational denominator management.
         correctorForce: Whether corrector should forcefully delete bad poles.
         correctorTol: Tolerance for corrector step.
         correctorMaxIter: Maximum number of corrector iterations.
         muBoundsPivot: list of bounds for pivot parameter values.
         muBoundsMarginal: list of bounds for marginal parameter values.
         samplingEngine: Sampling engine.
         uHF: High fidelity solution(s) with parameter(s) lastSolvedHF as
             sampleList.
         lastSolvedHF: Parameter(s) corresponding to last computed high fidelity
             solution(s) as parameterList.
         uApproxReduced: Reduced approximate solution(s) with parameter(s)
             lastSolvedApprox as sampleList.
         lastSolvedApproxReduced: Parameter(s) corresponding to last computed
             reduced approximate solution(s) as parameterList.
         uApprox: Approximate solution(s) with parameter(s) lastSolvedApprox as
             sampleList.
         lastSolvedApprox: Parameter(s) corresponding to last computed
             approximate solution(s) as parameterList.
         Q: Numpy 1D vector containing complex coefficients of approximant
             denominator.
         P: Numpy 2D vector whose columns are FE dofs of coefficients of
             approximant numerator.
     """
     
     def __init__(self, HFEngine:HFEng, mu0 : paramVal = None,
                  directionPivot : ListAny = [0],
                  approxParameters : DictAny = {}, approx_state : bool = False,
                  verbosity : int = 10, timestamp : bool = True):
         self._preInit()
         self._addParametersToList(toBeExcluded = ["polydegreetype", "sampler"])
         super().__init__(HFEngine = HFEngine, mu0 = mu0,
                          directionPivot = directionPivot,
                          approxParameters = approxParameters,
                          approx_state = approx_state, verbosity = verbosity,
                          timestamp = timestamp)
         self._postInit()
 
     @property
     def tModelType(self):
         from rrompy.reduction_methods.trained_model import \
                                                     TrainedModelPivotedRational
         return TrainedModelPivotedRational
 
     @property
     def polydegreetype(self):
         """Value of polydegreetype."""
         return "TOTAL"
     @polydegreetype.setter
     def polydegreetype(self, polydegreetype):
         RROMPyWarning(("polydegreetype is used just to simplify inheritance, "
                        "and its value cannot be changed from 'TOTAL'."))
         
     @property
     def polybasis0(self):
         if "_" in self.polybasis:
             return self.polybasis.split("_")[0]
         return self.polybasis
 
     @property
     def correctorTol(self):
         """Value of correctorTol."""
         return self._correctorTol
     @correctorTol.setter
     def correctorTol(self, correctorTol):
         if correctorTol < 0. or (correctorTol > 0. and self.nparPivot > 1):
             RROMPyWarning(("Overriding prescribed corrector tolerance "
                            "to 0."))
             correctorTol = 0.
         self._correctorTol = correctorTol
         self._approxParameters["correctorTol"] = self.correctorTol
 
     @property
     def correctorMaxIter(self):
         """Value of correctorMaxIter."""
         return self._correctorMaxIter
     @correctorMaxIter.setter
     def correctorMaxIter(self, correctorMaxIter):
         if correctorMaxIter < 1 or (correctorMaxIter > 1
                                 and self.nparPivot > 1):
             RROMPyWarning(("Overriding prescribed max number of corrector "
                            "iterations to 1."))
             correctorMaxIter = 1
         self._correctorMaxIter = correctorMaxIter
         self._approxParameters["correctorMaxIter"] = self.correctorMaxIter
         
     def _setupInterpolationIndices(self):
         """Setup parameters for polyvander."""
         RROMPyAssert(self._mode,
                      message = "Cannot setup interpolation indices.")
         if (self._musUniqueCN is None 
          or len(self._reorder) != len(self.musPivot)):
             self._musUniqueCN, musIdxsTo, musIdxs, musCount = (
                   self.trainedModel.centerNormalizePivot(self.musPivot).unique(
                                     return_index = True, return_inverse = True,
                                     return_counts = True))
             self._musUnique = self.musPivot[musIdxsTo]
             self._derIdxs = [None] * len(self._musUniqueCN)
             self._reorder = np.empty(len(musIdxs), dtype = int)
             filled = 0
             for j, cnt in enumerate(musCount):
                 self._derIdxs[j] = nextDerivativeIndices([], self.nparPivot,
                                                          cnt)
                 jIdx = np.nonzero(musIdxs == j)[0]
                 self._reorder[jIdx] = np.arange(filled, filled + cnt)
                 filled += cnt
 
     def computeSnapshots(self):
         """Compute snapshots of solution map."""
         RROMPyAssert(self._mode,
                      message = "Cannot start snapshot computation.")
         if self.samplingEngine.nsamplesTot != self.S * self.SMarginal:
             self.computeScaleFactor()
             self.resetSamples()
             vbMng(self, "INIT", "Starting computation of snapshots.", 5)
             self.musPivot = self.samplerPivot.generatePoints(self.S)
             self.musMarginal = self.samplerMarginal.generatePoints(
                                                                 self.SMarginal)
             self.mus = emptyParameterList()
             self.mus.reset((self.S * self.SMarginal, self.HFEngine.npar))
             self.samplingEngine.resetHistory(self.SMarginal)
             for j, muMarg in enumerate(self.musMarginal):
                 for k in range(j * self.S, (j + 1) * self.S):
                     self.mus.data[k, self.directionPivot] = (
                                             self.musPivot[k - j * self.S].data)
                     self.mus.data[k, self.directionMarginal] = muMarg.data
             self.samplingEngine.iterSample(self.musPivot, self.musMarginal)
             if self.POD:
                 self.samplingEngine.coalesceSamples(self.interpRcondMarginal)
             else:
                 self.samplingEngine.coalesceSamples()
             vbMng(self, "DEL", "Done computing snapshots.", 5)
 
     def setupApprox(self):
         """
         Compute rational interpolant.
         SVD-based robust eigenvalue management.
         """
         if self.checkComputedApprox():
             return
         RROMPyAssert(self._mode, message = "Cannot setup approximant.")
         vbMng(self, "INIT", "Setting up {}.". format(self.name()), 5)
         self.computeSnapshots()
         pMat = self.samplingEngine.samplesCoalesced.data
         pMatEff = dot(self.HFEngine.C, pMat) if self.approx_state else pMat
         if self.trainedModel is None:
             self.trainedModel = self.tModelType()
             self.trainedModel.verbosity = self.verbosity
             self.trainedModel.timestamp = self.timestamp
             datadict = {"mu0": self.mu0, "projMat": pMatEff,
                         "scaleFactor": self.scaleFactor,
                         "rescalingExp": self.HFEngine.rescalingExp,
                         "directionPivot": self.directionPivot}
             self.trainedModel.data = self.initializeModelData(datadict)[0]
         else:
             self.trainedModel = self.trainedModel
             self.trainedModel.data.projMat = copy(pMatEff)
         self.trainedModel.data.musPivot = copy(self.musPivot)
         self.trainedModel.data.musMarginal = copy(self.musMarginal)
         self.trainedModel.data.marginalInterp = self._setupMarginalInterp()
         N0 = copy(self.N)
         Qs, Ps = [], []
         self._temporaryPivot = 1
         if self.POD:
             self._RPODOldPivot = copy(self.samplingEngine.RPODCoalesced)
         else:
             self._samplesOldPivot = copy(self.samplingEngine.samples)
         self._scaleFactorOldPivot = copy(self.scaleFactor)
         self.scaleFactor = self.scaleFactorPivot
         for j in range(len(self.musMarginal)):
             self._N = N0
             if self.POD:
                 self.samplingEngine.RPOD = (
                           self._RPODOldPivot[:, j * self.S : (j + 1) * self.S])
             else:
                 self.samplingEngine.samples = self._samplesOldPivot[j]
             self.verbosity -= 5
             self._iterCorrector()
             self.verbosity += 5
             Qs = Qs + [copy(self.trainedModel.data.Q)]
             Ps = Ps + [copy(self.trainedModel.data.P)]
             del self.trainedModel.data.Q, self.trainedModel.data.P
         if self.POD:
             self.samplingEngine.RPODCoalesced = copy(self._RPODOldPivot)
             del self._RPODOldPivot
         else:
             self.samplingEngine.samples = copy(self._samplesOldPivot)
             del self._samplesOldPivot
         self.scaleFactor = self._scaleFactorOldPivot
         del self._temporaryPivot, self._scaleFactorOldPivot
         self.trainedModel.data.Qs, self.trainedModel.data.Ps = Qs, Ps
         vbMng(self, "INIT", "Matching poles.", 10)
         self.trainedModel.initializeFromRational(self.HFEngine,
                                                  self.matchingWeight, self.POD,
                                                  self.approx_state)
         vbMng(self, "DEL", "Done matching poles.", 10)
-        if not np.isinf(self.cutOffTolerance):
-            vbMng(self, "INIT", "Recompressing by cut-off.", 10)
-            msg = self.trainedModel.recompressByCutOff([-1., 1.],
-                                                       self.cutOffTolerance,
-                                                       self.cutOffType)
-            vbMng(self, "DEL", "Done recompressing." + msg, 10)
+        vbMng(self, "INIT", "Recompressing by cut-off.", 10)
+        msg = self.trainedModel.recompressByCutOff([-1., 1.],
+                                                   self.cutOffTolerance,
+                                                   self.cutOffType)
+        vbMng(self, "DEL", "Done recompressing." + msg, 10)
         self.trainedModel.data.approxParameters = copy(self.approxParameters)
         vbMng(self, "DEL", "Done setting up approximant.", 5)
diff --git a/rrompy/utilities/poly_fitting/radial_basis/vander.py b/rrompy/utilities/poly_fitting/radial_basis/vander.py
index a504ac5..858bcd5 100644
--- a/rrompy/utilities/poly_fitting/radial_basis/vander.py
+++ b/rrompy/utilities/poly_fitting/radial_basis/vander.py
@@ -1,107 +1,107 @@
 # Copyright (C) 2018 by the RROMPy authors
 #
 # This file is part of RROMPy.
 #
 # RROMPy is free software: you can redistribute it and/or modify
 # it under the terms of the GNU Lesser General Public License as published by
 # the Free Software Foundation, either version 3 of the License, or
 # (at your option) any later version.
 #
 # RROMPy is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 # GNU Lesser General Public License for more details.
 #
 # You should have received a copy of the GNU Lesser General Public License
 # along with RROMPy. If not, see <http://www.gnu.org/licenses/>.
 #
 
 import numpy as np
 from .kernel import (radialGaussian, thinPlateSpline, multiQuadric,
                      nearestNeighbor)
 from rrompy.utilities.poly_fitting.polynomial.vander import (polyvander as pvP,
                                                        polyvanderTotal as pvTP)
-from rrompy.utilities.base.types import Np1D, Np2D, Tuple, List, paramList
+from rrompy.utilities.base.types import Np1D, Np2D, List, paramList
 from rrompy.parameter import checkParameterList
 from rrompy.utilities.exception_manager import RROMPyException, RROMPyAssert
 
 __all__ = ['rbvander', 'polyvander', 'polyvanderTotal']
 
 def rbvander(x:paramList, basis:str, reorder : List[int] = None,
              directionalWeights : Np1D = None,
              nNearestNeighbor : int = -1) -> Np2D:
     """Compute radial-basis-Vandermonde matrix."""
     x = checkParameterList(x)[0]
     x_un = x.unique()
     nx = len(x)
     if len(x_un) < nx:
         raise RROMPyException("Sample points must be distinct.")
     del x_un
     x = x.data
     if directionalWeights is None:
         directionalWeights = np.ones(x.shape[1])
     elif not hasattr(directionalWeights, "__len__"):
         directionalWeights = directionalWeights * np.ones(x.shape[1])
     RROMPyAssert(len(directionalWeights), x.shape[1],
                  "Number of directional weights")
     try:
         radialkernel = {"GAUSSIAN" : radialGaussian,
                         "THINPLATE" : thinPlateSpline,
                         "MULTIQUADRIC" : multiQuadric,
                         "NEARESTNEIGHBOR" : nearestNeighbor}[basis.upper()]
     except:
         raise RROMPyException("Radial basis not recognized.")
     isnearestneighbor = basis.upper() == "NEARESTNEIGHBOR"
     Van = np.zeros((nx, nx))
     for j in range(nx):
-        muDiff = (x.data - x[j]) * directionalWeights
+        muDiff = (x - x[j]) * directionalWeights
         r2j = np.sum(np.abs(muDiff) ** 2., axis = 1).reshape(1, -1)
         if isnearestneighbor:
             if nNearestNeighbor > 0 and nNearestNeighbor < len(x):
                 cutoffValue = np.partition(r2j, nNearestNeighbor - 1)[0, 
                                                           nNearestNeighbor - 1]
                 r2j /= cutoffValue
             else:
                 r2j[0, :] = 1. * (nNearestNeighbor == 0)
         Van[j] = radialkernel(r2j)
     return Van
     
 def polyvander(x:paramList, degs:List[int], basis:str,
                derIdxs : List[List[List[int]]] = None,
                reorder : List[int] = None, directionalWeights : Np1D = None,
                scl : Np1D = None, nNearestNeighbor : int = -1) -> Np2D:
     """
     Compute full Hermite-Vandermonde matrix with specified derivative
         directions.
     """
     if derIdxs is not None and np.sum(np.sum(derIdxs)) > 0:
         raise RROMPyException(("Cannot take derivatives of radial basis "
                                "function."))
     basisp, basisr = basis.split("_")
     VanR = rbvander(x, basisr, reorder = reorder,
                     directionalWeights = directionalWeights,
                     nNearestNeighbor = nNearestNeighbor)
     VanP = pvP(x, degs, basisp, derIdxs = derIdxs, reorder = reorder,
                scl = scl)
     return np.block([[VanR, VanP],
                      [VanP.T.conj(), np.zeros(tuple([VanP.shape[1]] * 2))]])
 
 def polyvanderTotal(x:paramList, deg:int, basis:str,
                     derIdxs : List[List[List[int]]] = None,
                     reorder : List[int] = None,
                     directionalWeights : Np1D = None, scl : Np1D = None,
                     nNearestNeighbor : int = -1) -> Np2D:
     """
     Compute full total degree Hermite-Vandermonde matrix with specified
         derivative directions.
     """
     if derIdxs is not None and np.sum(np.sum(derIdxs)) > 0:
         raise RROMPyException(("Cannot take derivatives of radial basis "
                                "function."))
     basisp, basisr = basis.split("_")
     VanR = rbvander(x, basisr, reorder = reorder,
                     directionalWeights = directionalWeights,
                     nNearestNeighbor = nNearestNeighbor)
     VanP = pvTP(x, deg, basisp, derIdxs = derIdxs, reorder = reorder, scl = scl)
     return np.block([[VanR, VanP],
                      [VanP.T.conj(), np.zeros(tuple([VanP.shape[1]] * 2))]])