Mathematica: Verwenden Sie simplify, um die Unterdrückung von Unterausdrücken und die Reduzierung der Stärke zu vereinfachen

8

So habe ich mich in letzter Zeit damit beschäftigt, wie Mathematicas Pattern-Matching und Termersetzung bei Compiler-Optimierungen genutzt werden können ... und dabei versucht, kurze Code-Blöcke, die die inneren Teile von Loops sind, zu optimieren. Zwei gängige Methoden zur Verringerung des Aufwands für die Auswertung eines Ausdrucks bestehen darin, Unterausdrücke, die mehr als einmal vorkommen, zu identifizieren und das Ergebnis zu speichern und das gespeicherte Ergebnis anschließend zu verwenden, um Arbeit zu sparen. Ein anderer Ansatz besteht darin, wo immer möglich billigere Operationen zu verwenden. Zum Beispiel ist mein Verständnis, dass Quadratwurzeln nehmen mehr Taktzyklen als Additionen und Multiplikationen. Um es klar zu sagen, ich interessiere mich für die Kosten in Bezug auf Gleitkommaoperationen, die die Auswertung des Ausdrucks benötigen würde, und nicht, wie lange es dauert, bis Mathematica es bewertet.

Mein erster Gedanke war, dass ich das Problem angehen würde, indem ich Mathematicas Vereinfachung -Funktion einsetze. Es ist möglich, eine Komplexitätsfunktion anzugeben, die die relative Einfachheit von zwei Ausdrücken vergleicht. Ich wollte eine mit Gewichten für die relevanten arithmetischen Operationen erstellen und dazu den LeafCount für den Ausdruck hinzufügen, um die erforderlichen Zuweisungsoperationen zu berücksichtigen. Das spricht für die Verringerung der Stärke Seite, aber es ist die Beseitigung der üblichen Teilausdrücke, die mich stolpern.

Ich habe darüber nachgedacht, den möglichen Transformationsfunktionen, die die Verwendung vereinfachen, eine gemeinsame Teilausdruckseliminierung hinzuzufügen. Aber für einen großen Ausdruck könnte es viele mögliche Teilausdrücke geben, die ersetzt werden könnten und es wird nicht möglich sein zu wissen, was sie sind, bis Sie den Ausdruck sehen. Ich habe eine Funktion geschrieben, die die möglichen Ersetzungen liefert, aber es scheint, als ob die Transformationsfunktion, die Sie angeben, nur eine einzige mögliche Transformation zurückgeben muss, zumindest aus den Beispielen in der Dokumentation. Irgendwelche Gedanken darüber, wie man diese Einschränkung umgehen könnte? Hat jemand eine bessere Vorstellung davon, wie einfach die Transformationsfunktionen sind, die auf eine Vorwärtsrichtung hinweisen?

Ich stelle mir vor, dass Simplify hinter den Kulissen eine dynamische Programmierung vornimmt, die verschiedene Vereinfachungen an verschiedenen Teilen der Ausdrücke versucht und die mit dem niedrigsten Komplexitätswert zurückgibt. Wäre es besser für mich, diese dynamische Programmierung selbst zu machen, indem ich übliche algebraische Vereinfachungen wie Faktor und Collect verwende?

BEARBEITEN: Ich habe den Code hinzugefügt, der mögliche Unterausdrücke erzeugt, um

zu entfernen %Vor%

Sobald ein allgemeiner Unterausdruck aus der von CommonSubExpressions zurückgegebenen Liste ausgewählt wurde, ist die Funktion, die die Ersetzung durchführt, unten.

%Vor%

Auf die Gefahr hin, dass diese Frage lang wird, werde ich einen kleinen Beispielcode aufstellen. Ich dachte, ein anständiger Ausdruck zum Optimieren wäre die klassische Runge-Kutta Methode zum Lösen von Differential Gleichungen.

%Vor%

Schließlich ist der Code zur Beurteilung der relativen Kosten verschiedener Ausdrücke unten angegeben. Die Gewichte sind an dieser Stelle konzeptionell, da dies immer noch ein Bereich ist, den ich erforsche.

%Vor%     
Samsdram 17.11.2010, 08:56
quelle

2 Antworten

4

Um wiederkehrende Teilausdrücke zu identifizieren, könnten Sie so etwas verwenden

%Vor%     
Yaroslav Bulatov 17.11.2010, 19:08
quelle
4

Es gibt auch einige Routinen, die hier von diesem Autor implementiert wurden: Ссылка

Ich habe es in eine * .M-Datei gepackt und einen Fehler behoben (wenn der Ausdruck keine wiederholten Unterausdrücke hat, stirbt er), und ich versuche die Kontaktdaten des Autors zu finden, um zu sehen, ob ich seinen modifizierten Code hochladen kann Pastebin oder wo auch immer.

EDIT: Ich habe die Erlaubnis vom Autor erhalten, es hochzuladen und habe es hier eingefügt: Ссылка

    
eacousineau 22.08.2012 14:42
quelle