IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Configuration, cycle de vie et release d'un petit programme


Sujet :

C++

  1. #1
    Membre averti Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Points : 341
    Points
    341
    Par défaut Configuration, cycle de vie et release d'un petit programme
    Salut a toutes et a tous!

    J'ai termine une petite version de démonstration d'un programme de simulation open-source que nous voulons publier rapidement dans un journal de recherche. Le but c'est plutot cool c'est pour explorer comment la structure d'un échantillonnage peut affecter les estimations en écologie évolutive. Je jetais un coup d'oeil au Software release life cycle (désolé je ne connais pas la traduction).

    Le stade ou j'en suis c'est (imo) quelque part entre le stade de développement pre-alpha et l'alpha. Ca signifie qu'en gros les fonctionnalités sont complètes cote logic et data, mais que j'ai rien écrit concernant l'interface utilisateur, et que la liste des bugs potentiels suite a un cas d'utilisation "malencontreux" et sans doute loin d’être vide !

    Concernant l'interface, j'ai quelques interrogations concernant les degrés de liberté que je veux/peux/dois laisser a l'utilisateur potentiel.

    En fait pour l'instant c'est assez direct de modifier certaines valeurs de paramètres du programme (passer des arguments par ligne de commande et tadaaa c'est fait), mais je ne vois toujours pas bien comment modifier le comportement du programme depuis l’extérieur pour changer certains sous modèles de simulation sans faire exploser la complexité du code que je dois encore écrire (ouais j'ai vraiment besoin de publier )

    Pour l'instant mes efforts ont surtout consisté a pondre une lib pour me permettre (a moi seul petit dev) de modifier le comportement du programme en bidouillant le script du fichier principal ( oui oui j'ai bien conscience que mon main est encore trop gros et qu'il devrait faire 5 lignes ). Bon le code est évidemment loin d’être parfait mais en vrai c'est plutôt cool a utiliser et perso moi ça me suffit dans mes projets.

    Mais l'utilisateur attendu a a la fois:
    • toutes les chances d’être insatisfait par le comportement par défaut du simulateur (ou même ma configuration a moi)
    • toutes les chances de pas être assez a l'aise en prog pour modifier le comportement par défaut du simulateur


    D'un autre cote, si l'utilisateur souhaite modifier potentiellement chaque ligne de code du main (ce qui en y pensant deux minutes risque fort d’être le cas), alors je me demande si au final la bonne granularité dont il aurait besoin ne serait pas une bibliothèque plutôt qu'un programme. Problème: d'ici l'horizon 2030-2040 il n'y a que peu de chances d'attirer le poisson écologue qui se pose les questions vers les eaux troubles du C++ qui fournit les réponses.

    Y'a des moyen de wrapper une bibliothèque template C++ dans un langage plus user-friendly et qui n'implique pas des semaines de taff supplémentaires et sans ruiner les perfs ? Certains utilisent des scripts python qui lisent des fichiers de configuration et écrivent des includes C++, mais j'ai été horrifié du travail requis, de la rigidité de la solution et du chaos ajouté au nom de cette "facilité d'utilisation", alors qu'il suffirait tout simplement de modifier une ligne dans le main pour changer le design. D'un autre cote j'ai bien conscience que cette dernière remarque fleure justement bon la remarque de pur dev peu enclin a faire un pas vers l'utilisateur. Mais quand même ...

    Qu'en pensez-vous (a part que je veux a la fois le beurre, l'argent du beurre, la laiterie, le laitier, la laitière et le laiteron)?

    le (trop gros) main a toute fin utile:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
     
    #include "quetzal/quetzal.h"
    #include <boost/math/special_functions/binomial.hpp> // binomial coefficient
    #include <random>
     
    #include <algorithm>
    #include <cassert>
    #include <vector>
     
    int main()
    {
     
      /******************************
       * Geospatial dataset
       *****************************/
      using time_type = unsigned int;
      using landscape_type = quetzal::geography::DiscreteLandscape<std::string,time_type>;
      using coord_type = landscape_type::coord_type;
      landscape_type env( {{"rain", "europe_precipitation.tif"}},   {time_type(0)} );
     
      /******************************
       * Simulator configuration
       *****************************/
      using strategy_type = quetzal::demography::strategy::mass_based;
      using simulator_type = quetzal::simulators::SpatiallyExplicitCoalescenceSimulator<coord_type, time_type, strategy_type>;
     
      coord_type x_0(40.0, -3.0);
      x_0 = env.reproject_to_centroid(x_0);
      time_type t_0 = 2000;
      strategy_type::value_type N_0 = 100;
     
      simulator_type simulator(x_0, t_0, N_0);
     
      /******************************
       * Niche and growth functions
       *****************************/
      using quetzal::expressive::literal_factory;
      using quetzal::expressive::use;
      literal_factory<coord_type, time_type> lit;
     
      auto rain = env["rain"];
      auto s = [rain](coord_type x, time_type){return rain(x, 0);};
    	unsigned int factor = 5;
     
      auto K = use(s)*lit(factor);
      auto r = lit(5);
     
      auto pop_sizes = simulator.pop_size_history();
      auto N = use( [pop_sizes](coord_type x, time_type t){ return pop_sizes(x,t);} );
     
      auto g = N * ( lit(1) + r ) / ( lit(1) + ( (r * N)/K ));
      auto sim_children = [g](auto& gen, coord_type const&x, time_type t){
        std::poisson_distribution<unsigned int> poisson(g(x,t));
        return poisson(gen);
      };
     
      std::random_device rd;
      std::mt19937 gen(rd());
     
      /******************
       * Dispersal
       ******************/
      auto const& space = env.geographic_definition_space();
      coord_type::km radius = 60.0;
      using quetzal::geography::memoized_great_circle_distance;
      auto distance = [](coord_type const& a, coord_type const& b) -> double {return memoized_great_circle_distance(a,b);};
      auto weight = [radius](coord_type::km d) -> double { if(d < radius){return 1.0;} else {return 0.0;} ;};
    	auto f = [weight, distance](coord_type const& a, coord_type const& b){
        if(a == b){
          return 500.0;
        }else{
          return weight(distance(a,b));
        }
      };
      auto dispersal = strategy_type::make_sparse_distance_based_dispersal(space, f);
     
      /**************************
      * Demographic expansion
      **************************/
      unsigned int t_sampling = 4000;
      simulator.expand_demography(t_sampling, sim_children, dispersal, gen);
     
      /**********************
      *  Sampling schemes
      **********************/
      std::vector<coord_type> distribution_area = pop_sizes.get().definition_space(t_sampling);
      unsigned int n = 200;
      auto last_N = [N, t_sampling](coord_type const& x){return N(x, t_sampling);};
     
      // Uniform sampling
      auto unif_sampler = quetzal::sampling_scheme::make_unif_constrained_sampler(distribution_area, last_N, n);
      auto global_sample = unif_sampler(gen);
     
      // Clustered sampling
     
      // Radius sampling in Spain
      coord_type::km radius_1 = 200.0;
      auto weight_1 = [radius_1](coord_type::km d) -> double { if(d < radius_1){return 1.0;} else {return 0.0;} ;};
      auto f1 = [weight_1, distance, x_0](coord_type const& x){return weight_1(distance(x_0, x));};
      auto spain_sampler = quetzal::sampling_scheme::make_constrained_sampler(distribution_area, f1, last_N, n/2);
      auto spain_sample = spain_sampler(gen);
     
      // Radius sampling around Sicilia
      coord_type sicilia = env.reproject_to_centroid(coord_type(37.3, 15.0));
      coord_type::km radius_2 = 200.0;
      auto weight_2 = [radius_2](coord_type::km d) -> double { if(d < radius_2){return 1.0;} else {return 0.0;} ;};
      auto f2 = [weight_2, distance, sicilia](coord_type const& x){return weight_2(distance(sicilia, x));};
      auto sicilia_sampler = quetzal::sampling_scheme::make_constrained_sampler(distribution_area, f2, last_N, n/2);
      auto sicilia_sample = sicilia_sampler(gen);
     
      auto merged_sample = spain_sample;
      for(auto const& it: sicilia_sample){
        merged_sample[it.first] += it.second;
      }
     
      /**********************
       *  Data visualization
       **********************/
      std::string N_filename = "/home/me/dev/sampling_project/output/N.tif";
      env.export_to_geotiff(N, t_0, t_sampling, [&pop_sizes](time_type const& t){return pop_sizes.get().definition_space(t);}, N_filename);
     
      env.export_to_shapefile(global_sample, "output/uniform.shp");
      env.export_to_shapefile(spain_sample, "output/spain.shp" );
      env.export_to_shapefile(sicilia_sample, "output/sicilia.shp");
     
      /**********************
       *  Coalescence
       **********************/
     
      unsigned int WF_N = 30;
     
      //std::cout << simulate_newick(simulator, global_sample, t_sampling, t_0, WF_N, gen) << std::endl;
      //std::cout << simulate_newick(simulator, spain_sample, t_sampling, t_0, WF_N, gen) << std::endl;
      //std::cout << simulate_newick(simulator, sicilia_sample, t_sampling, t_0, WF_N, gen) << std::endl;
      auto get_name = [&sicilia_sample, &spain_sample](coord_type const&x, time_type){
        if ( sicilia_sample.find(x) == sicilia_sample.end() ) {
          return "Spain";
        } else {
          return "Sicilia";
        }
      };
      std::cout << simulate_newick_leaf_name(simulator, merged_sample, t_sampling, t_0, WF_N, get_name, gen) << std::endl;
     
      return 0;
     
    }
    Le débutant, lui, ignore qu'il ignore à ce point, il est fier de ses premiers succès, bien plus qu'il n'est conscient de l'étendue de ce qu'il ne sait pas, dès qu'il progresse en revanche, dès que s'accroît ce qu'il sait, il commence à saisir tout ce qui manque encore à son savoir. Qui sait peu ignore aussi très peu. [Roger Pol-Droit]
    Github
    Mon tout premier projet: une bibliothèque de simulation de génétique des populations

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut
    En fait c'est un problème classique et une solution classique (très classique même) est de faire une interface python à ton code c++. D'ailleurs dans les domaines scientifiques python est très répandu. Question outils, pybind11 est vraiment bien (https://github.com/pybind/pybind11) mais il y a aussi boost python et swig. Il y a effectivement un peu de mise en place mais avec un peu d'expérience ça se fait vraiment bien et le résultat en vaut vraiment le coup.

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 068
    Points : 12 111
    Points
    12 111
    Par défaut
    @SimonDecoline, ta justification tient plus du "marteau de Maslow" que de l'axiomatique.
    Je ne critique pas la conclusion, si Python est la lingua franca du domaine scientifique de @Seabirds, mais de mon temps , c'était le Fortran ou Matlab, et "R" semble bien mieux implanté dans des domaines comme la statistique.

    @Seabirds, ta référence date un peu, c'est assez rare maintenant de suivre une démarche aussi lourde que le "waterfall" dont le cycle illustré est une incarnation.

    Concernant l'interface, j'ai quelques interrogations concernant les degrés de liberté que je veux/peux/dois laisser a l'utilisateur potentiel.
    Votre IHM ne doit absolument pas modifier les parties de votre ne gérant pas l'IHM.
    Vous devez pouvoir avoir une IHM minimaliste, ou digne d'un sous-marin soviétique, sans que cela change le moins du monde le coeur de votre programme/librairie.

    alors je me demande si au final la bonne granularité dont il aurait besoin ne serait pas une bibliothèque plutôt qu'un programme.
    Très probablement.

    Problème: d'ici l'horizon 2030-2040 il n'y a que peu de chances d'attirer le poisson écologue qui se pose les questions vers les eaux troubles du C++ qui fournit les réponses.
    Si vous proposez une librairie ayant une API "C" (pour une plus grande interopérabilité) ou une API dans un langage "classique" de votre domaine scientifique, vous rendez votre travail bien plus simple à utiliser par d'autres.

    Y'a des moyen de wrapper une bibliothèque template C++
    Les templates, c'est quand même très "C++". Je ne suis pas sûr que les utilisateurs "finaux" aient besoin de cela. Il faudrait voir comment est gérer la "généricité" dans le langage choisi pour l'utilisateur. Peut-être que Python est un bon choix, quitte à faire une petite usine à gaz de conversion, si Python est le bon choix de langage "utilisateur".

    Qu'en pensez-vous (a part que je veux a la fois le beurre, l'argent du beurre, la laiterie, le laitier, la laitière et le laiteron)?
    Il n'y pas de mal à être ambitieux, faut juste en être conscient.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include "model/model.h"
     
    std::string formatResults(const Model& model)
    {
      ....
       return res;
    }
     
    int main()
    {
       auto model = model::createModel();
     
       model.run();
     
      std::cout << formatResults(model) << std::endl;
     
      return 0;
     
    }

  4. #4
    Membre averti Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Points : 341
    Points
    341
    Par défaut
    Citation Envoyé par bacelar Voir le message
    @Seabirds, ta référence date un peu, c'est assez rare maintenant de suivre une démarche aussi lourde que le "waterfall" dont le cycle illustré est une incarnation.
    J'actualise, j'actualise ...

    Citation Envoyé par bacelar Voir le message
    Votre IHM ne doit absolument pas modifier les parties de votre ne gérant pas l'IHM.
    Vous devez pouvoir avoir une IHM minimaliste, ou digne d'un sous-marin soviétique, sans que cela change le moins du monde le coeur de votre programme/librairie.
    Oh oui oui oui, j'en suis bien conscient, sinon ça mettrait un bazar monumental et des couplages très forts.

    Citation Envoyé par bacelar Voir le message
    Si vous proposez une librairie ayant une API "C" (pour une plus grande interopérabilité) ou une API dans un langage "classique" de votre domaine scientifique, vous rendez votre travail bien plus simple à utiliser par d'autres.
    Je suis bien d'accord, mais pour l'instant on n'est qu'une toute petite poignée de codeurs dans mon domaine ... tellement petite qu'au rendu de la dernière réunion, ça n'aurait apparemment même pas beaucoup de sens d'attendre que l'utilisateur moyen sache compiler un script. Donc il semblerait qu'on doive laisser la l'idée de la bibliothèque et plutôt partir sur une option programme+fichier de configuration et/ou programme+liste d'options. Mais j'ai un peu peur que l'ensemble des comportements ainsi permis soit si faible que le programme ne soit plus d'aucun intérêt pour personne. On verra bien!

    Citation Envoyé par bacelar Voir le message
    Les templates, c'est quand même très "C++". Je ne suis pas sûr que les utilisateurs "finaux" aient besoin de cela. Il faudrait voir comment est gérer la "généricité" dans le langage choisi pour l'utilisateur.
    Moui, ce qui me fait dire que tu as sans doute raison, c'est qu'il n'y a presque plus de templates dans ma fonction principale.

    Citation Envoyé par bacelar Voir le message
    Peut-être que Python est un bon choix, quitte à faire une petite usine à gaz de conversion, si Python est le bon choix de langage "utilisateur".
    Comme dit plus haut, j'ai juste un peu peur de passer trop de temps a coder cette usine a gaz ... pour personne.

    Citation Envoyé par bacelar Voir le message
    Il n'y pas de mal à être ambitieux, faut juste en être conscient.
    Un demi-million de choses contradictoires que j'aimerais dire sur ce point ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include "model/model.h"
     
    std::string formatResults(const Model& model)
    {
      ....
       return res;
    }
     
    int main()
    {
       auto model = model::createModel();
     
       model.run();
     
      std::cout << formatResults(model) << std::endl;
     
      return 0;
     
    }
    Oooooh merci !!!
    Le débutant, lui, ignore qu'il ignore à ce point, il est fier de ses premiers succès, bien plus qu'il n'est conscient de l'étendue de ce qu'il ne sait pas, dès qu'il progresse en revanche, dès que s'accroît ce qu'il sait, il commence à saisir tout ce qui manque encore à son savoir. Qui sait peu ignore aussi très peu. [Roger Pol-Droit]
    Github
    Mon tout premier projet: une bibliothèque de simulation de génétique des populations

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 068
    Points : 12 111
    Points
    12 111
    Par défaut
    plutôt partir sur une option programme+fichier de configuration et/ou programme+liste d'options
    "programme + fichier de configuration + liste d'options" avec liste d'option prioritaires sur le fichier de configuration.

  6. #6
    Membre averti Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Points : 341
    Points
    341
    Par défaut
    Merci !
    Le débutant, lui, ignore qu'il ignore à ce point, il est fier de ses premiers succès, bien plus qu'il n'est conscient de l'étendue de ce qu'il ne sait pas, dès qu'il progresse en revanche, dès que s'accroît ce qu'il sait, il commence à saisir tout ce qui manque encore à son savoir. Qui sait peu ignore aussi très peu. [Roger Pol-Droit]
    Github
    Mon tout premier projet: une bibliothèque de simulation de génétique des populations

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Model de cycle de vie d'un logiciel
    Par apt dans le forum Méthodes
    Réponses: 4
    Dernier message: 29/10/2014, 23h54
  2. Réponses: 7
    Dernier message: 08/03/2007, 09h23
  3. Réponses: 6
    Dernier message: 07/03/2007, 09h32
  4. [Maven2] Cycle de Vie - Phases et Goals
    Par Palmer dans le forum Maven
    Réponses: 4
    Dernier message: 05/03/2007, 22h34
  5. [EJB Stateful] [Cycle de vie] methode remove()
    Par anitshka dans le forum Java EE
    Réponses: 3
    Dernier message: 05/12/2006, 17h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo