2009-12-17 5 views
3

Je dois être en mesure de prendre une formule qui utilise la syntaxe de la formule OpenDocument, l'analyser dans une syntaxe que Python peut comprendre, mais sans évaluer les variables, puis pouvoir évaluer la formule plusieurs fois en changeant objets de valeur pour les variables. Les formules peuvent être entrées par l'utilisateur, donc pyparsing me permet à la fois de gérer efficacement la syntaxe de la formule et de nettoyer les entrées utilisateur. Il y a un certain nombre de bons exemples de pypars disponibles, mais tous les mathématiques semblent supposer que l'on évalue tout dans la portée actuelle immédiatement. Pour le contexte, je travaille avec un modèle de l'économie industrielle (analyse du cycle de vie, ou ACV), où ces formules représentent la quantité d'échanges de matière ou d'énergie entre les processus. La quantité variable peut être fonction de plusieurs paramètres, tels que la localisation géographique. La chaîne de la formule et les références variables sont stockées dans un graphique acyclique dirigé, de sorte que les formules peuvent toujours être simplement évaluées. Les formules sont stockées sous forme de chaînes dans une base de données. Mes questions sont les suivantes:Évaluation partielle avec pypars

  1. Est-il possible d'analyser une formule telle que l'évaluation peut également être analysé stockées dans la base (comme une chaîne à evaled, ou autre chose)?
  2. Existe-t-il des alternatives à cette approche? Gardez à l'esprit que la solution idéale est d'analyser/écrire une fois et de lire plusieurs fois. Par exemple, analyser partiellement la formule, puis utiliser le module ast, bien que je ne sache pas comment cela pourrait fonctionner avec le stockage de base de données.
  3. Des exemples d'un projet ou d'une bibliothèque similaire à celui-ci que je pourrais examiner? Je ne suis pas un programmeur, juste un étudiant qui essaie de terminer sa thèse tout en faisant un modèle de logiciel LCA open-source dans mon temps libre.
  4. Cette approche est-elle trop lente? Je voudrais être capable de faire des courses de Monte Carlo substantielles, où chaque course pourrait impliquer des dizaines de milliers d'évaluations de formules (c'est une grande base de données).

Répondre

4

1) Oui, il est possible de décaper les résultats de l'analyse de votre expression et de l'enregistrer dans une base de données. Ensuite, vous pouvez simplement aller chercher et décomposer l'expression, plutôt que de réécrire l'original.

2) Vous pouvez faire un passage rapide et sale à ce juste en utilisant la compilation et eval Encastrements, comme dans la session interactive suivante:

>>> y = compile("m*x+b","","eval") 
>>> m = 100 
>>> x = 5 
>>> b = 1 
>>> eval(y) 
501 

Bien sûr, cela a les pièges de sécurité de toute implémentation basée sur l'évaluation ou l'exécution, dans la mesure où des chaînes sources non fiables ou malveillantes peuvent intégrer des appels système nuisibles. Mais si c'est votre thèse et entièrement à votre portée, ne faites rien d'idiot.

3) Vous pouvez obtenir un exemple en ligne d'analyse d'une expression dans une structure de données "évaluable" sur la page Exemples du wiki pyparsing. Découvrez simpleBool.py et evalArith.py en particulier. Si vous vous sentez flush, commandez un numéro de May,2008 issue du magazine Python, qui contient mon article "Ecrire un interpréteur/compilateur simple avec Pyparsing" avec une description plus détaillée des méthodes utilisées, ainsi qu'une description de la façon dont le décapage et le décapage les résultats analysés fonctionnent.

4) La partie lente sera l'analyse, de sorte que vous êtes sur la bonne voie pour préserver ces résultats sous une forme intermédiaire et pouvant être évaluée de manière reproductible. La partie eval devrait être assez accrocheuse. La deuxième partie lente consistera à récupérer ces structures décapées de votre base de données. Au cours de votre exécution de MC, je voudrais emballer une seule fonction qui prend les paramètres de sélection pour une expression, récupère de la base de données, et décuple et retourne l'expression évaluable.Ensuite, une fois que vous avez ce travail, utilisez un décorateur memoize pour mettre en cache ces paires de résultats de requête, de sorte que toute expression donnée n'ait besoin d'être récupérée/décodée qu'une seule fois.

Bonne chance avec votre thèse!