Domanda

Devo essere in grado di prendere una formula che utilizzi la sintassi della formula OpenDocument, analizzarla in una sintassi che Python possa comprendere, ma senza valutare le variabili, e quindi essere in grado di valutare la formula molte volte modificando i valori per le variabili.Le formule possono essere input dell'utente, quindi pyparsing mi consente sia di gestire in modo efficace la sintassi della formula, sia di pulire l'input dell'utente.Sono disponibili numerosi buoni esempi di pyparsing, ma tutti quelli matematici sembrano presupporre che si valuti immediatamente tutto nell'ambito corrente.

Per contesto, sto lavorando con un modello di economia industriale (valutazione del ciclo di vita o LCA), in cui queste formule rappresentano la quantità di scambi di materiale o energia tra i processi.L'importo variabile può essere funzione di diversi parametri, come la posizione geografica.La catena di formule e riferimenti alle variabili è memorizzata in un grafico aciclico diretto, in modo che le formule possano sempre essere valutate in modo semplice.Le formule vengono archiviate come stringhe in un database.Le mie domande sono:

  1. È possibile analizzare una formula in modo tale che la valutazione analizzata possa anche essere memorizzata nel database (come una stringa da valutare o qualcos'altro)?
  2. Esistono alternative a questo approccio?Tieni presente che la soluzione ideale è analizzare/scrivere una volta e leggere molte volte.Ad esempio, analizzando parzialmente la formula e quindi utilizzando il modulo ast, anche se non so come potrebbe funzionare con l'archiviazione del database.
  3. Qualche esempio di progetto o libreria simile a questo che potrei esaminare?Non sono un programmatore, solo uno studente che cerca di finire la sua tesi mentre realizza un modello software LCA open source nel tempo libero.
  4. Questo approccio è troppo lento?Mi piacerebbe essere in grado di fare corse Monte Carlo sostanziali, dove ogni corsa potrebbe coinvolgere decine di migliaia di valutazioni di formule (è un grande database).
È stato utile?

Soluzione

1) Sì, è possibile mettere in salamoia i risultati dell'analisi dell'espressione e salvarli in un database.Quindi puoi semplicemente recuperare e deselezionare l'espressione, anziché rieseguire l'analisi dell'originale.

2) Puoi fare un passaggio veloce e sporco semplicemente usando i built-in compile ed eval, come nella seguente sessione interattiva:

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

Naturalmente, questo presenta le insidie ​​​​di sicurezza di qualsiasi implementazione basata su eval o exec, in quanto stringhe di origine non attendibili o dannose possono incorporare chiamate di sistema dannose.Ma se questa è la tua tesi ed è interamente sotto il tuo controllo, non fare nulla di stupido.

3) È possibile ottenere un esempio online di analisi di un'espressione in una struttura dati "valutabile" nella pagina Esempi del wiki pyparsing.Guardare sempliceBool.py E evalArith.py particolarmente.Se ti senti in salute, ordina un numero arretrato di Numero di maggio 2008 della rivista Python, che contiene il mio articolo "Writing a Simple Interpreter/Compiler with Pyparsing" con una descrizione più dettagliata dei metodi utilizzati, oltre a una descrizione di come funziona il serializzazione e la deserializzazione dei risultati analizzati.

4) La parte lenta sarà l'analisi, quindi sei sulla strada giusta per preservare questi risultati in una forma intermedia e ripetibilmente valutabile.La parte di valutazione dovrebbe essere abbastanza scattante.La seconda parte lenta consisterà nel recuperare queste strutture in salamoia dal tuo database.Durante l'esecuzione di MC, creerei un pacchetto di una singola funzione che accetta i parametri di selezione per un'espressione, recupera dal database, deseleziona e restituisce l'espressione valutabile.Quindi, una volta che tutto funziona, utilizza un decoratore di memoize per memorizzare nella cache queste coppie di risultati della query, in modo che ogni determinata espressione debba essere recuperata/deselezionata solo una volta.

Buona fortuna con la tua tesi!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top