Nombre variable de paramètres
Bonjour à toutes et à tous :)
Je suis en train de coder un framework bayésien.
Le principe c'est ça : on a des modèles mathématiques qui sont des fonction paramétrées :
- Linéaire : y = a.x+b, => deux paramètres a et b
- Foo : y = m.x^d + c => trois paramètres m, d, c
- etc... pour une collection de fonctions.
On veut faire des simulations basées sur ces fonctions, en faisant varier les paramètres de chaque fonction à chaque simulation. Pour faire varier chaque paramètre, il faut faire un tirage dans un "prior", c'est à dire une distribution de probabilité bien précise, elle-même paramétrée. Par exemple une uniforme.
J'ai fait un arbre d'héritage qui me semblait cool (donc évidemment qui pose problème :lol: ) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| class IMathematicalParametrizedFunction
{
public:
...
virtual double operator()() const = 0; // On peut rien dire sur quoi appliquer la fonction
virtual void SetParameters() = 0; // On peut rien dire sur le nombre de paramètres
protected:
std::string _name;
std::string _expression;
std::map<std::string, double> _parameters;
} |
Code:
1 2 3 4 5 6 7
| class Linear : public IMathematicalParametrizedFunction
{
public:
...
double operator()(const double &x) const; // On applique la linéaire sur un réel
void SetParameters(const double & a, const double & b); // Il y a deux paramètres à modifier
} |
Code:
1 2 3 4 5 6 7
| class IPriorDistribution : public IMathematicalParametrizedFunction
{
public:
...
virtual double operator()(void) const = 0; // On sait ici qu'il n'y aura pas besoin d'argument, faut juste faire un tirage aléatoire.
void SetParameters(); // On peut toujours rien dire sur le nombre de paramètres à prendre
} |
Code:
1 2 3 4 5 6 7
| class Uniform : public IPriorDistribution
{
public:
...
double operator()(void) const;
void SetParameters(const double & a, const double & b); // Signature différente.
} |
Et bon vous vous en douterez il y a pas mal de soucis avec les signatures, et donc des fonction virtuelles pure non implémentées dans les classes dérivées. Comment faudrait-il que je m'y prenne ? J'ai lu ce fil là : http://www.developpez.net/forums/d13...ture-variable/
Il y a bien l'idée de faire un vector, mais (je crois que ?) je perds la transparence sur les paramètres. En effet, les paramètres ont une signification bien précise selon la place qu'ils ont dans l'expression de la fonction, ils ont également un nom "consacré" par la littérature (genre a et b pour la linéaire, ou lower/upper ou a/b pour l'uniforme, ou lambda pour la Poisson.).
Je m'étonne de pas pouvoir dire dans la classe ancestrale : "Mes filles ont besoin de ce comportement là pour fonctionner, mais je ne peux rien dire sur leur signature".
Des idées/contestations/suggestions ?
Merci d'avance !!!
Cordialement,
[Edit] : ici http://stackoverflow.com/questions/2...tual-functions ils proposent de stocker les paramètres au moment de la construction, ce que je fais déjà. Mais je n'avais pas envie de reconstruire l'objet de 0 à chaque ré-actualisation de ses valeurs de paramètres :/