# ----------------------
self.setParameters(Parameters)
#
+ if self._parameters.has_key("Bounds") and (type(self._parameters["Bounds"]) is type([]) or type(self._parameters["Bounds"]) is type(())) and (len(self._parameters["Bounds"]) > 0):
+ Bounds = self._parameters["Bounds"]
+ logging.debug("%s Prise en compte des bornes effectuee"%(self._name,))
+ else:
+ Bounds = None
+ #
# Opérateur d'observation
# -----------------------
Hm = HO["Direct"].appliedTo
func = CostFunction,
x0 = Xini,
fprime = GradientOfCostFunction,
+ bounds = Bounds,
quantile = self._parameters["Quantile"],
maxfun = self._parameters["MaximumNumberOfSteps"],
toler = self._parameters["CostDecrementTolerance"],
hypothèse par pas. Pour éviter les confusions, ne pas utiliser la classe
"OneVector" pour des données hétérogènes, mais bien "OneList".
"""
- def __init__(self, name="", unit="", basetype = list):
+ def __init__(self, name="", unit="", basetype = numpy.ravel):
Persistence.__init__(self, name, unit, basetype)
class OneMatrix(Persistence):
Classe définissant le stockage d'un objet sans modification (cast) de type.
Attention, selon le véritable type de l'objet stocké à chaque pas, les
opérations arithmétiques à base de numpy peuvent être invalides ou donner
- des résultats inatendus. Cette classe n'est donc à utiliser qu'à bon escient
+ des résultats inattendus. Cette classe n'est donc à utiliser qu'à bon escient
volontairement, et pas du tout par défaut.
"""
def __init__(self, name="", unit="", basetype = NoType):
__author__ = "Jean-Philippe ARGAUD"
import sys, math
-from numpy import sum, array, matrix, dot, linalg, asarray, asmatrix, ravel
+from numpy import array, matrix, asarray, asmatrix
+from numpy import sum, dot, linalg, ravel, max, min, hstack, argmin, argmax
# ==============================================================================
def mmqr(
func = None,
x0 = None,
fprime = None,
+ bounds = None,
quantile = 0.5,
maxfun = 15000,
toler = 1.e-06,
#
# Calculs d'initialisation
# ------------------------
- residus = asmatrix( mesures - func( variables ) ).A1
+ residus = ravel( mesures - func( variables ) )
poids = asarray( 1./(epsilon+abs(residus)) )
veps = 1. - 2. * quantile - residus * poids
lastsurrogate = -sum(residus*veps) - (1.-2.*quantile)*sum(residus)
Derivees = array(fprime(variables))
Derivees = Derivees.reshape(n,p) # Necessaire pour remettre en place la matrice si elle passe par des tuyaux YACS
DeriveesT = array(matrix(Derivees).T)
- M = - dot( DeriveesT , (array(matrix(p*[poids,]).T)*Derivees) )
+ M = dot( DeriveesT , (array(matrix(p*[poids,]).T)*Derivees) )
SM = dot( DeriveesT , veps ).T
- step = linalg.lstsq( M, SM )[0]
+ step = - linalg.lstsq( M, SM )[0]
#
variables = variables + step
- residus = asmatrix( mesures - func(variables) ).A1
+ if bounds is not None:
+ while( (variables < ravel(asmatrix(bounds)[:,0])).any() or (variables > ravel(asmatrix(bounds)[:,1])).any() ):
+ step = step/2.
+ variables = variables - step
+ residus = ravel( mesures - func(variables) )
surrogate = sum(residus**2 * poids) + (4.*quantile-2.) * sum(residus)
#
while ( (surrogate > lastsurrogate) and ( max(list(abs(step))) > 1.e-16 ) ) :
step = step/2.
variables = variables - step
- residus = ( mesures-func(variables) ).A1
+ residus = ravel( mesures-func(variables) )
surrogate = sum(residus**2 * poids) + (4.*quantile-2.) * sum(residus)
#
increment = lastsurrogate-surrogate