-
Notifications
You must be signed in to change notification settings - Fork 3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Extending Khiops entries with a lightweight json structure for scenarios #230
Comments
|
Extension du pilotage de Khiops via les scénariosRésuméOn propose dans ce document une extension du pilotage de Khiops via des scénarios. Khiops peut-être piloté via la ligne de commande via des scénarios
Ce mode de contrôle est intéressant pour intégrer rapidement des traitements Khiops et les lancer depuis n'importe quel On propose d'étendre d'étendre le pilotage de khiops via les scénarios:
L'intérêt de cette extension fonctionnelle est multiple:
Spécification fonctionnelleStructure de contrôle dans les scénariosOn ajoute quelques structures de contrôle dans les scénario pour permettre Les structures de contrôle sont matérialisées par des instructions en UPPER CASE sur des lignes dédiées. BoucleUne structure de boucle permet d'entourer un bloc de lignes de scenario entre deux instructions
Toutes les lignes d'un bloc de boucle sont répétées autant de fois que nécessaire. TestUne structure de test permet d'entourer un bloc de lignes de scenario entre deux instructions
Toutes les lignes d'un bloc de test sont prise en compte conditionnellement au test. Paramétrage par une structure de donnéesAjout d'un option sur la ligne de commande des outils Khiops: Le fichier json contient une série de paires clé/valeur:
Format json: https://www.json.org/json-en.html Contraintes sur les options de la ligne de commandePour faciliter la mise au point du pilotage par scenario, on rajoute l'option suivante: Contraintes:
Contraintes sur la structure du jsonSeule une petite partie de l'expressivité du format json est gérée
Contraintes sur les clés
Liens entre clés dans le json et dans le scénario
Remarque:
Exemple d'utilisationScénario en entrée:
Fichier json en entrée:
Scénario en sortie:
Encodage des valeurs dans le jsonAnalyse des besoins et contraintesKhiops accepte tout types de valeurs en entrée, ce qui permet d'être applicable à toutes sources de données.
Comme la structure json comporte une liste de clés/valeurs, les valeurs doivent donc pouvoir comporter n'importe quelle séquence de bytes. Khiops doit décoder les valeurs des clés du json en paramètre pour les transformer en chaines de caractères C++, qui sont des tableau de bytes. Selon la spécification de json https://datatracker.ietf.org/doc/html/rfc8259#section-8.1,
Choix d'encodageOn choisit un encodage UTF-8 systématique pour le json en paramètre de Khiops, selon la norme Json.
Au moment de l'écriture du scénario en sortie, on recherche la clé correspondante dans le json ou sa variante avec préfixe byte pour décoder ou non la valeur dans le search/replace. Contraintes spécifique sur la structure du json:
RemarquesLe format Quoted-Printable pourrait être une alternative à l'encodage Byte64
Liens avec protobuf
Choix d'implémentation principauxChoix techniques avec impacts utilisateur:
|
Suite à échanges avec Felipe Expression de besoin d'étendre les structures de contrôle pour les besoins actuels de pykhiops
Analyse des besoins
BilanFonctionnalité en attente de maturation: attendre pour annuler ou lancer le développement |
Suite à discussion avec Stéphane Extension avec expressivité faibleSi expressivité faible tel que proposé initialement (uniquement structures LOOP et IF):
Extension avec expressivité forteSi expressivité forte, tel que suggérée par Felipe pour les beson de pykhiops (structure DIC et VECTOR additionnelles)
Bilan
|
Suite à une étude impliquant un petit code utilisateur de l'API en java (KhiopsAPI.java) un certain nombre de points ont évolué (mis à jour dans la discussion ci-dessus).
Moyennant ces ajustements, la spécification décrite ci-dessus ne semble pas poser de problème d'implémentation et offre un confort d'utilisation satisfaisant pour le programmeur (vérifié pour java). |
Pour référence, un exemple de spécification d'opération - ici TrainPredictor - décrite en langage proto v2 avec les contraintes simplificatrices permettant une conversion simplifiée vers JSON et son utilisation avec le search replace décrit plus haut.
et un JSON conforme à cette spécification:
|
Reference - issue #230 Extending Khiops entries with a lightweight json structure for scenarios #230 - #230 - cette issue contient les specification detaillees de la fonctionnalité, donc on pourra extraire la documentation - cf. commentaire "Extension du pilotage de Khiops via les scénarios" - #230 (comment) Choix d'implementation principaux - le fichier de parametre json est lu et traite en entier de facon prealable, avec une taille limitee - le fichier de commande est traite en flux, ce qui permet de n'avoir aucune limite de taille - toute ligne de commande peut etre commentee, y compris les lignes du langage de pilotage de type IF ou LOOP - les lignes d'un fichier de commande template n'ont pas besoin de se terminer par un commentaire - toute __key__ du fichier de commande doit se trouver dans le fichier json - toute key du fichier json doit etre utilise dans le fichier de commande - les __key__ de parametrage json ne peuvent concerner que la partie parametrage utilisateur d'une valeur - toute erreur ou incoherence dans les fichiers de commande et de parametrage json provoquent une erreur fatale CommandFile - methodes publiques - ReadInputCommand: refactoring et simplification - ReadWriteCommandFiles: pour ecrire le scenario en sortie sans rejouer les commandes - methodes privees principales de parsing des scenario et de leur langage - ResetParser - RecodeCurrentLineUsingJsonParameters - ParseInputCommand: analyse syntaxique des lignes d'un fichier de commande en entree - TokenizeInputCommand - GetFirstInputToken - variables de travail du parser - prefixees par parser (ex: nParserState, sParserBlockKey, nParserLineIndex...) - maintenues le temps d'une session d'analyse, pour gerer le parser de scenario en flux - contraintes - nMaxLineLength = 500: longueur max d'une ligne de fichier de commande - nLoopMaxLineNumber = 1000: Taille max d'un bloc d'instruction IF ou LOOP d'un fichier de commande - constantes: renommees et etendues pour harmonisation - sCommentPrefix - sJsonKeyDelimiter - sByteJsonKeyPrefix - ... JsonLex.lex - STRINGERROR: variante de STRINGVALUE dans le cas d'erreur d'encodage utf8 JsonYac.yac - regles impliquant STRINGERROR pour avoir des erreurs interpretable en cas de STRINGERROR UIObject: prise en compte de l'option -O, pour les scenarios en sortie sans rejouer les commandes - ParseMainParameters - CheckCommandLineOptions TextService: - parametrage avance de la conversion de lencodage Json vers un encodage C pas necessairemernet Utf8 pour le cas des rapport Khiops - Set|GetForceUnicodeToAnsi - Set|GetForceUtf8ToAnsi - modifie le comportement de la methode JsonToCString utilisee par le parser de Json - utilise uniquement dans CCCoclusteringReport LearningTestTool - kht_test.py - --nop-output-scenario: "create an output scenario nop_output_test.prm in results dir, without replaying commands" - _kht_families - ajout de la famille JsonParameters Ajout de test\LearningTest\TestKhiops\Standard\JsonSpliceJunction pour la CI/CD Batterie de tests LearningTest\TestKhiops\JsonParameters - une petite cinquantaine de test, les trois-quart concernant la detection des erreurs
Reference - issue #230 Extending Khiops entries with a lightweight json structure for scenarios #230 - #230 - cette issue contient les specification detaillees de la fonctionnalité, donc on pourra extraire la documentation - cf. commentaire "Extension du pilotage de Khiops via les scénarios" - #230 (comment) Choix d'implementation principaux - le fichier de parametre json est lu et traite en entier de facon prealable, avec une taille limitee - le fichier de commande est traite en flux, ce qui permet de n'avoir aucune limite de taille - toute ligne de commande peut etre commentee, y compris les lignes du langage de pilotage de type IF ou LOOP - les lignes d'un fichier de commande template n'ont pas besoin de se terminer par un commentaire - toute __key__ du fichier de commande doit se trouver dans le fichier json - toute key du fichier json doit etre utilise dans le fichier de commande - les __key__ de parametrage json ne peuvent concerner que la partie parametrage utilisateur d'une valeur - toute erreur ou incoherence dans les fichiers de commande et de parametrage json provoquent une erreur fatale CommandFile - methodes publiques - ReadInputCommand: refactoring et simplification - ReadWriteCommandFiles: pour ecrire le scenario en sortie sans rejouer les commandes - methodes privees principales de parsing des scenario et de leur langage - ResetParser - RecodeCurrentLineUsingJsonParameters - ParseInputCommand: analyse syntaxique des lignes d'un fichier de commande en entree - TokenizeInputCommand - GetFirstInputToken - variables de travail du parser - prefixees par parser (ex: nParserState, sParserBlockKey, nParserLineIndex...) - maintenues le temps d'une session d'analyse, pour gerer le parser de scenario en flux - contraintes - nMaxLineLength = 500: longueur max d'une ligne de fichier de commande - nLoopMaxLineNumber = 1000: Taille max d'un bloc d'instruction IF ou LOOP d'un fichier de commande - constantes: renommees et etendues pour harmonisation - sCommentPrefix - sJsonKeyDelimiter - sByteJsonKeyPrefix - ... JsonLex.lex - STRINGERROR: variante de STRINGVALUE dans le cas d'erreur d'encodage utf8 JsonYac.yac - regles impliquant STRINGERROR pour avoir des erreurs interpretable en cas de STRINGERROR UIObject: prise en compte de l'option -O, pour les scenarios en sortie sans rejouer les commandes - ParseMainParameters - CheckCommandLineOptions TextService: - parametrage avance de la conversion de lencodage Json vers un encodage C pas necessairemernet Utf8 pour le cas des rapport Khiops - Set|GetForceUnicodeToAnsi - Set|GetForceUtf8ToAnsi - modifie le comportement de la methode JsonToCString utilisee par le parser de Json - utilise uniquement dans CCCoclusteringReport LearningTestTool - kht_test.py - --nop-output-scenario: "create an output scenario nop_output_test.prm in results dir, without replaying commands" - _kht_families - ajout de la famille JsonParameters Ajout de tests unitaires: test\UnitTests\Norm\results.ref\base_TextService.txt Ajout de test CI/CD: test\LearningTest\TestKhiops\Standard\JsonSpliceJunction Batterie de tests LearningTest\TestKhiops\JsonParameters - une petite cinquantaine de test, les trois-quart concernant la detection des erreurs
Reference - issue #230 Extending Khiops entries with a lightweight json structure for scenarios #230 - #230 - cette issue contient les specification detaillees de la fonctionnalité, donc on pourra extraire la documentation - cf. commentaire "Extension du pilotage de Khiops via les scénarios" - #230 (comment) Choix d'implementation principaux - le fichier de parametre json est lu et traite en entier de facon prealable, avec une taille limitee - le fichier de commande est traite en flux, ce qui permet de n'avoir aucune limite de taille - toute ligne de commande peut etre commentee, y compris les lignes du langage de pilotage de type IF ou LOOP - les lignes d'un fichier de commande template n'ont pas besoin de se terminer par un commentaire - toute __key__ du fichier de commande doit se trouver dans le fichier json - toute key du fichier json doit etre utilise dans le fichier de commande - les __key__ de parametrage json ne peuvent concerner que la partie parametrage utilisateur d'une valeur - toute erreur ou incoherence dans les fichiers de commande et de parametrage json provoquent une erreur fatale CommandFile - methodes publiques - ReadInputCommand: refactoring et simplification - ReadWriteCommandFiles: pour ecrire le scenario en sortie sans rejouer les commandes - methodes privees principales de parsing des scenario et de leur langage - ResetParser - RecodeCurrentLineUsingJsonParameters - ParseInputCommand: analyse syntaxique des lignes d'un fichier de commande en entree - TokenizeInputCommand - GetFirstInputToken - variables de travail du parser - prefixees par parser (ex: nParserState, sParserBlockKey, nParserLineIndex...) - maintenues le temps d'une session d'analyse, pour gerer le parser de scenario en flux - contraintes - nMaxLineLength = 500: longueur max d'une ligne de fichier de commande - nLoopMaxLineNumber = 1000: Taille max d'un bloc d'instruction IF ou LOOP d'un fichier de commande - constantes: renommees et etendues pour harmonisation - sCommentPrefix - sJsonKeyDelimiter - sByteJsonKeyPrefix - ... JsonLex.lex - STRINGERROR: variante de STRINGVALUE dans le cas d'erreur d'encodage utf8 JsonYac.yac - regles impliquant STRINGERROR pour avoir des erreurs interpretable en cas de STRINGERROR UIObject: prise en compte de l'option -O, pour les scenarios en sortie sans rejouer les commandes - ParseMainParameters - CheckCommandLineOptions TextService: - parametrage avance de la conversion de lencodage Json vers un encodage C pas necessairemernet Utf8 pour le cas des rapport Khiops - Set|GetForceUnicodeToAnsi - Set|GetForceUtf8ToAnsi - modifie le comportement de la methode JsonToCString utilisee par le parser de Json - utilise uniquement dans CCCoclusteringReport LearningTestTool - kht_test.py - --nop-output-scenario: "create an output scenario nop_output_test.prm in results dir, without replaying commands" - _kht_families - ajout de la famille JsonParameters Ajout de tests unitaires: test\UnitTests\Norm\results.ref\base_TextService.txt Ajout de test CI/CD: test\LearningTest\TestKhiops\Standard\JsonSpliceJunction Batterie de tests LearningTest\TestKhiops\JsonParameters - une petite cinquantaine de test, les trois-quart concernant la detection des erreurs
Contexte: Khiops peut-être pilote via la ligne de commande via des scénarios
Ce mode de contrôle est intéressant pour intégrer rapidement des traitements Khiops et les lancer depuis n'importe quel
langage de programmation.
Par contre, c'est plus complexe dans le cas de de paramétrage plus complexe, comme par exemple l'ensemble
des table d'un schema en flocon. Dans ce cas, on doit passer un un algorithme de création de scénario comportant
potentiellement des boucles de search/replace.
Proposition d'évolution fonctionnelle:
Intérêt de la fonctionnalité:
Ebauche de spécification, a titre illustratif
Ebauche d'étude d'impact:
The text was updated successfully, but these errors were encountered: