Question

Je dois être en mesure de prendre une formule qui utilise la syntaxe de formule OpenDocument, l'analyser en syntaxe Python peut comprendre, mais sans évaluer les variables, et être en mesure d'évaluer la formule à plusieurs reprises avec le changement de valeur pour les variables . Les formules peuvent être entrées utilisateur, donc pyparsing me permet à la fois gérer efficacement la syntaxe de la formule, et l'entrée d'utilisateur propre. Il y a un certain nombre de bons exemples de pyparsing 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 (évaluation du cycle de vie ou ACV), où ces formules représentent la quantité de matière ou échanges d'énergie entre les processus. La quantité variable peut être fonction de plusieurs paramètres, tels que l'emplacement géographique. La chaîne de références de formule et variables sont stockées dans un graphe orienté acyclique, 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:

  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 quelque chose d'autre)?
  2. Y at-il des alternatives à cette approche? Gardez à l'esprit que la solution idéale consiste à analyser / écrire une fois et lu plusieurs fois. Par exemple, l'analyse syntaxique partiellement la formule, puis en utilisant le module ast, bien que je ne sais pas comment cela pourrait fonctionner avec le stockage de base de données.
  3. Tous les exemples d'un projet ou d'une bibliothèque similaire à ce que je pourrais regarder par-dessus? Je ne suis pas un programmeur, juste un étudiant essayant de terminer sa thèse en faisant un modèle de logiciel LCA open source dans mon temps libre.
  4. Cette approche est trop lent? Je voudrais être en mesure de faire substantielle court de Monte-Carlo, où chaque terme pourrait impliquer des dizaines de milliers d'évaluations de formule (il est une grande base de données).
Était-ce utile?

La solution

1) Oui, il est possible de décaper les résultats de l'analyse syntaxique de votre expression, et sauver ce à une base de données. Ensuite, vous pouvez simplement chercher et unpickle l'expression, plutôt que Reparse à nouveau 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 la sécurité de tout ou la mise en œuvre exec éva- basée, en ce que les chaînes de sources non fiables ou malveillants peuvent intégrer des appels système nocifs. Mais si cela est votre thèse et entièrement dans votre champ de contrôle, il suffit de ne pas faire quoi que ce soit stupide.

3) Vous pouvez obtenir un exemple en ligne de l'analyse d'une expression dans une structure de données « évaluables » à la page Exemples du wiki pyparsing. Consultez simpleBool.py et evalArith.py en particulier. Si vous vous sentez flush, commander un ancien numéro du mai 2008 numéro du magazine Python, qui a mon article « l'écriture d'un simple interprète / compilateur 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 unpickling les travaux de résultats analysés.

4) La partie lente sera l'analyse syntaxique, alors vous êtes sur la bonne voie dans la préservation de ces résultats sous une forme intermédiaire et répétable-évaluable. La partie eval devrait être assez accrocheurs. La deuxième partie sera lente à aller chercher ces structures à partir de votre base de données marinées. Pendant votre course MC, j'empaqueter une seule fonction qui prend les paramètres de sélection pour une expression, va chercher de la base de données et unpickles et renvoie l'expression évaluable. Ensuite, une fois que vous avez ce travail, utilisez un décorateur memoize pour mettre en cache ces paires requêtes-résultats, de sorte que toute expression donnée ne doit être tiré par les cheveux / unpickled une fois.

Bonne chance avec votre thèse!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top