À la recherche d'une simple librairie de graphe

Bonjour,

Je suis à la recherche d’une librairie assez simple afin de gérer des graphes.

La structure du graphe sera utilisée afin de représenter un questionnaire (formulaire d’auto-évaluation).
C’est-à-dire que des questions seront posées à l’utilisateur.
Plusieurs réponses seront possibles (ou pas) pour chaque question.
Une réponse donnée aura un impact sur le choix de la prochaine question.
Bref, je vois assez bien une structure de graphe. Ou je me trompe ?

Avant d’aller vers des librairies trop fournies pour mon problème comme
par exemple arbre de décision avec scikit-learn, je voudrai m’assurer de ne pas
louper une solution simple (et esthétique).

Une sortie/compatibilité vers le format Gephi (GEXF) serait éventuellement un plus (j’ai déjà utilisé networkx). En tout cas il serait bien d’exporter le graphe (question, réponses possibles, etc.) dans un JSON. Ceci afin d’avoir plusieurs JSON pour instancier différents questionnaires.

Je suis également prêt à implémenter quelque chose moi même. Il y a longtemps je m’étais inspiré de cet essai:

Afin de faire une sorte de GPS (à la Google Maps) avec Dijkstra:

je pourrai repartir sur quelque chose de similaire en ajoutant aux nœuds du graphe ce dont j’ai besoin, etc.

Pour information, l’application existe déjà. Mais utilise une structure un peu complexe pour le problème (et pas orienté graphe du tout)

Merci pour vos suggestions !

Bonjour,

La question m’a fait penser à un outil Python pour la gestion de questionnaires (à la base c’est pour des questionnaires légales) et qui ne se base pas sur la création d’un graphe mais plutôt sur une série de conditions : on peut définir sous quelles conditions telle question sera posée et l’outil choisit l’ordre des questions.

C’est sans doute trop lourd pour un simple formulaire d’évaluation mais ca peut peut-être donner des idées…

-Graham

1 « J'aime »

Merci, je ne connaissais pas ce projet. Il y a peut être des idées à piquer concernant la structure yaml pour représenter les questions, le “workflow”. Mais en effet c’est un peu gros pour être utilisé comme ceci. Je cherche plus une librairie que je pourrai utiliser afin d’implémenter ceci dans un projet existant.

je viens de trouver un petit DSL: GitHub - kylebebak/questionnaire: Elegant mini-DSL for creating command line questionnaires
Mais pas encore certain que cela fera l’affaire.

Encore un projet sympa, SMPy.
Mais plus maintenu du tout.

C’est une application web que tu veux faire avec un stockage sur disque ? Pourquoi networkx fait pas l’affaire?

Tout est graphe, donc partir de base sur une solution a base de graphe ou graphdb, c’est probablement un https://xyproblem.info/

1 « J'aime »

Oui, avec un stockage en base de données (au moins pour conserver des statistiques…).

L’application existe et fonctionne même en production. Mais j’ai cependant envie de changer profondément le fonctionnement. C’est pire que le problème XY :wink: Mais plus sérieusement, le fonctionnement actuel n’est vraiment pas optimal et je pense qu’il faut améliorer le projet avant de continuer sur de nouvelles fonctionnalités.

J’ai donc commencé à approfondir mes recherches vers des DSL pour ceci et j’avoue avoir trouvé des solutions plutôt intéressantes. Pour le moment ce sont des libs non maintenues (dont il semble un projet d’étudiants qui est basé sur textX). Dans tous les cas il y aura des modifs à faire, ce n’est pas un problème.

En parallèle, je me garde de côté les graphes. Je ne pense pas trop forcer l’usage d’une structure graphe pour ce problème.

Je ne crois pas me tromper sur moi même en disant que j’ai un avis fort et renseigné par des lectures et des expériences notamment professionnel, et au grand damne des recruteurs pas que professionnel, en restant ouvert a la discussion; cela concerne un certains nombre du sujet notamment en ce qui concerne la programmation avec Python (exemple, je grossi et simplifie le trait: les ORM c’est mal, l’OOP c’est pas la panacée, Ansible est au déploiement ce que Django et Flask sont aux framework web…).

Tu as pas demandé tout ce pavé, mais c’est une bonne occasion pour moi de faire le point sur ce que je sait que je sait, j’espère que cela sera utile a d’autres.

Vu que tu as quelque chose en production, tu rentres dans la phase “make it right” de l’expression, “make it work, then make it right, then make it fast”.

Il faut explicitement identifier, écrire sur du papier numérique (ou pas!), quelles sont les avantages et inconvénients de la solution actuel, eu égard du fonctionnement de bout en bout de ton logiciel.

De bout en bout, il s’agit de l’expérience de développement, notamment la mise en place depuis zero de l’env de dev, l’onboarding d’un nouveau contributeur, la maintenance (correction de bug, maj des dépendances, strategie de tests…), et ajouts de fonctionnalités, l’architecture de l’infrastructure de preproduction et sa relation avec la production (comment on maj la preprod), l’infrastructure de production (est-ce qu’il y a un SPOF? est-ce que c’est grave? comment c’est gerer?), le processus de déploiement, et le coût d’exploitation de l’infrastructure (combien ça coûte d’héberger). D’autres chose facile a faire, mais qui prenne du temps c’est mesurer un certains nombre de chose a travers des microbenchmark memoire et cpu, mais aussi le nombre de requetes par seconde que ton installation de production supporte de meme en mesurant a la fois la consommation des cpu et de la mémoire, notamment de la production (ce qui inclus de mesurer le comportement des autres services autre que le backend python, ex: le ou les db). Quelles a la strategie de backup et de restoration from scratch de la production ie. plan de relance d’activite PRA.

Il faut que tu es une idée même approximative des évolutions futures. On ne peux généraliser par exemple factoriser, uniquement qu’a partir de deux^Wtrois exemples, il faut avoir ça en tête quand tu fait une refacto / rework qui vise a rendre plus facile non seulement l’existant qui soit disant et généralement pensée et voulu en amont comme iso-fonctionnel, car c’est dans la pratique jamais iso-fonctionnelle, il y a toujours au moins des ajouts, et parfois des régressions (nouveau ou ancien bug qui refont apparitions), voir retrait de fonctionnalités pas toujours prévues ou désirées. Il faut aussi penser la stratégie de déploiement du nouveau code (iterative vs. bigbang ou entre les deux).

Une opinion mainstream et hyper populaire c’est que la re-ecriture complete (ou pas) est impossible: je ne suis pas d’accord pour en faire une règle generale, et exclure systematiquement la re-ecriture des plans envisageable. Je dirait meme plus, dans le cadre d’un point d’etape qui vise a ameliorer l’existant d’une application en production qui marche (le bon terme c’est marchotte), il est souhaitable de toujours envisager, documenter et planifier plusieurs plans notamment celui de la re-écriture complète.

Pour résumer, il faut une vision, plusieurs plans et élaborer des chemins pour y parvenir. Et après c’est possible de faire un choix renseignes.

J’ai donc commencé à approfondir mes recherches vers des DSL pour ceci et j’avoue avoir trouvé des solutions plutôt intéressantes.

Je considere DSL un terme faux, c’est souvent confondu avec API. Je préfère parler d’interface public. DSL ce rapporte normalement au Domain Driven Design. L’exemple de DSL que toute le monde sans exception cite c’est SQL :laughing: […]. Ce que tu cherches c’est une bibliotheque sur etagere qui resoud le probleme que tu crois que tu as. D’experience, hormis les systèmes experts (exemple: scikit learn), c’est ce tirer une balle dans le pied d’acheter (caveat emptor) une lib quelle quelle soit dans le language ou tu es expert ou veux devenir expert quand il y a pas d’algorithmes critique (il faut aussi relativiser vis-a-vis de la vision en considerant le time-to-market, mais dans ton cas si ca marche en production, le time-to-market n’est pas a considerer).

Pour le moment ce sont des libs non maintenues

Non maintenue, ne veux pas dire inutiles. Si la licence est compatible ou si tu reprend le code est que tu le transforme tellement que cela a rien avoir avec le code initiale, c’est toujours une bonne source d’information. Lire du code existant est une compétence, rare ou pas, elle reste essentielle a une progression rapide dans notre métier, pour des réalisations immédiates mais aussi dans le cadre de la veille. D’ailleurs, acheter du code (import) ne devrait jamais se faire sans lire le code, au moins pour vérifier qu’il n’y a pas de faille de securites, et potentiellement de gros problemes type algo n^2 ou n^3 dans le chemin critiques, ou un problème de montée en charge si c’est un aspect qui remonte dans la vision du produit (exemple: volume des donnees, nombre de requetes, nombre d’utilisateurs, adequation avec le budget d’exploitation de l’infra etc…).

J’ai d’autre idées de paragraphes mais c’est déjà assez long (spoiler: sqlite sans orm est tres bien dans un certains nombre de cas).

(aussi ca manque de citation, la flem, mais si vous voulez que j’appuie certaines idees avec des arguments d’authorite je peux)

Merci pour cette réponse. Je suis dans l’ensemble d’accord et effectivement ces conseils seront utiles pour un bon nombre.

À propos de l’utilisation d’une lib non maintenue, je suis aussi d’accord. SMPy semble vraiment pas mal et vaut le coup de s’y attarder un peu. En plus il n’y a pas tant de code.

Dans mon cas, je n’ai trop ce genre de problème: time-to-market, infrastructure et env de dev. Je travail dans la cybersecurity et nous faisons uniquement de l’open-source depuis plus de 10 ans.
Nous sommes derrière quelques projets un petit peu connu dans la communauté cybersec comme MISP. Et nous sommes full stack à crever (on fait nos annonces BGP nous-mêmes, par exemple).

En effet sur ce projet on rentre dans la phase make-it-right. Même si le projet est déjà en production et sur plusieurs serveurs (c’est un projet configurable, comme c’est pour des questionnaires…).
Cela peut paraître bizarre, mais malgré ceci je pourrai me permettre de changer certains comportements. Il n’y a pas de cahier des charges ou exigences des utilisateurs. Le contrat de l’app est assez simple. Comme souvent pour nous. Car nous sommes aussi les utilisateurs des logiciels que nous développons. Les personnes qui aiment un de nos projets peuvent l’utiliser et/ou contribuer (via des idées, ou du code). En gros, on est OK pour intégrer les changements si c’est bénéfique pour la communauté.

Après, si je peux allez plutôt vite c’est toujours ça. De nouvelles fonctionnalités arrivent et ce serait idiot de les développer deux fois… Du coup, évidemment je veux faire attention à utiliser quelque chose de simple et qui va nous satisfaire pour les prochaines années.
Mais la base du code actuel a justement ce problème. Les différentes instances en production ont de légères différences dans la logique. Et l’ensemble est très peu configurable. Ça ne fera qu’empirer avec le temps et les nouvelles fonctionnalités. Du coup, je me demande si je ne vais pas utiliser Django sur base d’un projet très intéressant que j’ai trouvé, justement pour faire des questionnaires. Ce projet semble plutôt bien fait pour continuer à construire autour.

1 « J'aime »

Si j’ai bien compris, Yakforms est capable d’afficher un ensemble de
question en fonction des réponses précédentes, c’est peut-être ce que
tu cherches :

Bon c’est du Drupal (avec une très bonne raison).

Je ne sais pas s’ils n’ont pas un petit « recode from scratch » qui les
titillent aussi, si le projet ressemble à ce que tu cherches il faut
peut-être se rapprocher d’eux.