Lizard - Skriptsprache für symbolische Berechnungen, beliebig große und genaue Zahlen, Parallel-Computing und mehr

Anwendungen, Tools, Userlibs und anderes nützliches.
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Lizard - Skriptsprache für symbolische Berechnungen und

Beitrag von Nino »

Danke für die Antwort, die neue Version und die neuen Funktionen!
Auch die beiden neuen erweiterten Beispiele sind sehr hilfreich.

Mir ist aufgefallen, dass in der Datei "Lizard.pbi" die Prozedur Terminate() 2x deklariert wird. :-)
Ich staune, dass PureBasic das nicht anmeckert:

Code: Alles auswählen

Declare.i Terminate()      ; Terminates the kernel of Lizard and releases all resources.
[...]
Declare.i Terminate()      ; Terminates the kernel of Lizard. All resources are released.
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Lizard - Skriptsprache für symbolische Berechnungen und

Beitrag von Nino »

Hallo Stargåte,

ich weiß, es ist noch nicht Weihnachten. Aber ich habe schon jetzt ein paar Wünsche bzw. Vorschläge. :-)

a) Ich fände es besser, wenn die Funktion Table() in Iterate() umbenannt würde. Dass sie Table() heißt hat mich von Anfang an stark irritiert. Iterate() dagegen drückt direkt aus, was die Funktion macht und verbessert so deutlch die Lesbarkeit des Lizard-Quellcodes. Vergleiche z.B.

Code: Alles auswählen

Lizard::Evaluate("Factorial(n?Integer) := Apply(Times, Table(i, {i, n}))")
mit

Code: Alles auswählen

Lizard::Evaluate("Factorial(n?Integer) := Apply(Times, Iterate(i, {i, n}))")
Außerdem wäre dann der Name Table frei für etwas anderes. In dem neuen Beispiel 8 zeigst Du, wie Lizard ein String übergeben wird der eine Datentabelle aus einer Datei enthält, und wie man diesen dann mit Lzard in eine Liste von Listen umwandelt - also quasi in eine Lizard-Tabelle. Wenn man statistische Daten mit Lizard verarbeiten will, dann ist das eine Standard-Sache, die man dauernd braucht. Ich fände es angemessen, wenn Lizard dafür eine elegante Funktion zur Verfügung stellen würde, die man einfach etwa so verwenden könnte:

Code: Alles auswählen

Lizard::Evaluate("data = Table(Content, ListeDerSpaltentrennzeichen, ListeDerZeilentrennzeichen)")
Ich finde es sehr intuitiv, für solch eine Funktion den Namen Table zu verwenden.


b) Gerade durch den sehr flexiblen Umgang mit Listen bietet es sich wahrscheinlich an, in Lizard früher oder später Funktionen zu integrieren (durch Dich oder durch andere, wenn Lizard Open Source sein wird), die mit Mengen arbeiten (Erzeugen von Schnittmengen, Vereinigungsmengen, Teilmengen usw.). Es wäre gut, wenn die Begriffe "Set" und "Partition" dann noch nicht vergeben wären.
Meine Umbenennungs-Vorschläge:

Set() -> Assign()
SetDelayed() -> AssignDelayed()
Partition() -> Group()
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Lizard - Skriptsprache für symbolische Berechnungen und

Beitrag von STARGÅTE »

Hallo Nino,

das mit der doppelten Deklaration fixe ich beim nächsten Update.

Nun zu den Funktionsnamen. Ja, bei der Namensgebung für Funktionen in Lizard habe ich mich "leider" zimlich stark an Mathematica orientiert. Leider, weil ich teilweise selber nicht zufrieden bin, wie die Sachen heißen, aber auch weil es ja eigentlich keine Kopie werden soll. Der Name Table kommt ja daher, das diese Funktion eine Tabelle erzeugt, auch wenn es je nach Parametern ggf. nur eine Einzeilige/-spaltige Tabelle ist, also eine Liste. Iterate wäre eine alternative, gebe ich zu. Später soll z.B. auch eine übliche Funktion wie For kommen, die praktisch das selbe macht, nur keine Liste erzeugt, sondern nur durchläuft.
Die Idee mit Set zu Assign zu machen finde ich gut, zumal es ja nur formal ist, da man vermutlich immer den Operator = oder := nutzt. Ob ich später Mengen mit "Set(1,2,3)" definieren möchte oder ob ich dafür auch die Listen nutze weiß ich noch nicht.

Ganz nebenbei ist es natürlich jedem Freigestellt ein Names-Package zu nutzen, bei dem die Namen ersetzt werden, was ja in Lizard problemlos geht, wobei natürlich Table dann immer noch belegt wäre:

Code: Alles auswählen

In(1)   :=  Iterate = Table
Out(1)   =  Table
In(2)   :=  Iterate(i, {i,1,5})
Out(2)   =  {1, 2, 3, 4, 5}
Zur Datenverarbeitung: Es wird in Zukunft definitiv eine Funktion Import geben, die eine Datei importiert. Bei dieser Funktion kann man dann angeben, um was es sich handelt (z.B. Tabelle) und wie die Separatoren sind. Dann fällt das aktuell noch unhandliche Beispiel weg.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Lizard - Skriptsprache für symbolische Berechnungen und

Beitrag von STARGÅTE »

Hallo Leute,

ich freue mich euch das erste große Update vorzustellen:
________________________________________
Lizard - Symbolic computation script language (Version 0.4.0-0005)
Beinhaltet die Lizard.dll (Windows x64 und x86), die Lizard.so (Linux x64), die Lizard.pbi, einige Beispiele zur Einbindung in Pure Basic und eine ausführliche Dokumentation zu Lizard mit vielen Beispielen.
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Bei diesem Update ist zwar nur ein erwähnenswertes Feature hinzugekommen, dieses hatte/hat es allerdings (hinsichtlich der Implementierung und den jetzt folgenden Möglichkeiten) in sich:
Die neue Version ermöglicht nun auch die Nutzung von Fließkommazahlen nahezu beliebiger Größe und Präzision!

Durch dieses Feature sind nun Berechnungen wie diese hier möglich, wo die normalen Doubles ihre Grenzen hätten:

Code: Alles auswählen

In(1)   :=  123.456 ^ 6789
Out(1)   =  1.889456296024e14199

Code: Alles auswählen

In(2)   :=  Factorial(123456789.0)
Out(2)   =  2.853513e945335859

Code: Alles auswählen

In(3)   :=  1.00000000000000000000000000000000000000001 + 1
Out(3)   =  2.00000000000000000000000000000000000000001
Außerdem hat die Funktion "Calculate()" nun als zweiten Parameter die gewünschte Präzision.
So können Konstanten, Ausdrücke und alles andere beliebig genau berechnet werden:

Code: Alles auswählen

In(1)   :=  Calculate(Pi, 60)
Out(1)   =  3.14159265358979323846264338327950288419716939937510582097494

Code: Alles auswählen

In(2)   :=  Calculate(Log(10), 60)
Out(2)   =  2.30258509299404568401799145468436420760110148862877297603333

Code: Alles auswählen

In(3)   :=  Calculate(2^(1/2), 60)
Out(3)   =  1.41421356237309504880168872420969807856967187537694807317668
Natürlich beachten diese neue Präzision auch alle implementierten Funktionen und "verfolgen" den möglichen Präzisionsverlust mit jeder Operation:

Code: Alles auswählen

In(1)   :=  x = 123456.7890123456789012345678901234567890
Out(1)   =  1.234567890123456789012345678901234567890e5
In(2)   :=  Precision(x)
Out(2)   =  40.0915

Code: Alles auswählen

In(3)   :=  Cos(x)
Out(3)   =  0.0516848618965524102413372685985603
In(4)   :=  Precision( Cos(x) )
Out(4)   =  33.7128
Natürlich werden "normale" Fließkommazahlen weiterhin als Doubles behandelt, um hier den Geschwindigkeitsvorteil zu behalten.
Außerdem gibt es ein paar neue Funktionen wie: Factorial, Precision und ein paar mehr trigonometrische Funktionen.

Somit viel Spaß beim Testen

@Nino: Deine Vorschläge bezüglich einiger Namensänderungen sind noch auf meiner Liste, habe ich nicht vergessen.
Zuletzt geändert von STARGÅTE am 20.03.2021 23:24, insgesamt 1-mal geändert.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Lizard - Skriptsprache für symbolische Berechnungen und

Beitrag von Nino »

Hallo STARGÅTE,

herzlichen Dank für das Update und für die freundliche Anmerkung! :)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Lizard - Skriptsprache für symbolische Berechnungen und

Beitrag von STARGÅTE »

Tia, da war der Fehlerteufel im letzten Release wieder sehr aktiv :twisted:

Darum hier ein schnelles Bug-Fixing-Update, mit der Hoffnung nicht noch mehr eingebaut zu haben.
Ich habe die Chance auch gleich mal genutzt und habe die Beispiele und das Include zusammen mit einer Lizard.so für Linux 64-Bit kompatible gemacht.

Download:
Lizard - Symbolic computation script language (Version 0.4.0-0005)
Beinhaltet die Lizard.dll (Windows x64 und x86), die Lizard.so (Linux x64), die Lizard.pbi, einige Beispiele zur Einbindung in Pure Basic und eine ausführliche Dokumentation zu Lizard mit vielen Beispielen.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Lizard - Skriptsprache für symbolische Berechnungen und mehr

Beitrag von STARGÅTE »

Hallo Leute,

nachdem ich in meinen anderen Projekten wieder ins Stocken gekommen bin, habe ich mal wieder an Lizard weiter gearbeitet.
Daher kann ich euch das nächste große Update vorzustellen:
________________________________________
Lizard - Symbolic computation script language (Version 0.4.2-0001)
Beinhaltet die Lizard.dll (Windows x64 und x86), die Lizard.so (Linux x64), die Lizard.pbi, einige Beispiele zur Einbindung in Pure Basic und eine ausführliche Dokumentation zu Lizard mit vielen Beispielen.
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Es gibt einige Neuigkeiten:
  1. Zu aller erst habe ich ein paar Funktionen umbenannt wie es u.A. von Nino vorgeschlagen wurde. So ist Set nun Define, SetDelayed ist nun DefineDelayed und Table ist nun Iterate.
  2. Danach habe ich die Mustererkennungsroutine (die alleine knapp 1000 Zeilen Code hat) nahezu komplett neu geschrieben, um so eine Vielzahl von Bugs zu beseitigen die sich im "alten" Code nicht mehr fixen ließen.
  3. Es gibt eine ganze Reihe neuer Funktionen, vor allem mathematischer Natur, wie die Vervollständigung der trigonometrischen und hyperbolischen Funktionen, Expand, Fibonacci und Binomial, mehr Funktionen für komplexe Zahlen wie Conjugate, Im oder Re, Konstanten wie EulerMascheroni oder GoldenRatio sowie Funktionen zum Arbeiten mit Mengen wie Union oder Intersection.
  4. Zu guter Letzt habe ich auch zwei Funktionen hinzugefügt, SubDefine und SubDefineDelayed, die eine etwas andere Art der Zuweisung vornehmen, was die Überladung von Built-In Operatoren ermöglicht, erleichtert und optimiert, wie ich im folgenden Darstellen möchte.
Nehmen wir mal an, ihr wolltet eine spezielle Art von Zahlen mit Fehler implementieren in der Art:
approx(Zahl, Fehler) also z.B. approx(2.0, 0.3) was soviel bedeutet wie 2.0 ± 0.3
Natürlich möchte man gerne mit diesen spezielle Zahlen dann auch rechnen können und dabei natürlich die built-in Operatoren wie + und * nutzen können ohne eigene Funktionen zu definieren.

Der erste Ansatz wäre, die Addition so zu definieren:

Code: Alles auswählen

In(1)   :=  approx(x?, dx?) + approx(y?, dy?) := approx(x+y, dx+dy)
Dieser Ansatz hat jedoch zwei Probleme: Zum einen würde ein Hinweis kommen, dass Plus geschützt ist (was man theoretisch noch umgehen könnte). Zum anderen würde aber eine solche Definition im Symbol Plus registriert werden. Somit würde sie bei jeder beliebigen Addition (selbst ohne approx-Zahlen) geprüft werden, was bei mehreren solcher Definitionen zu einer built-in Funktion schnell zu Performanceverlusten führen kann.

Die neuen Funktionen SubDefine (@=) und SubDefineDelayed (@:=) bieten nun die Möglichkeit solche Art von Definitionen den Argumenten zuzuordnen, also im oberen Fall zu approx statt zu Plus. approx ist nicht geschützt und die Definitionen für approx werden bei einer Addition auch nur getestet, wenn es auch approx Elemente in der Addition gibt. In der Praxis sieht das dann so aus (was natürlich beliebig um weitere Operatoren erweitert werden kann):

Code: Alles auswählen

In(1)   :=  approx(x?, dx?) + approx(y?, dy?) @:= approx(x+y, dx+dy)

Code: Alles auswählen

In(2)   :=  approx(2.0, 0.3) + approx(1.0, 0.1) + approx(4.0, 0.2)
Out(2)   =  approx(7.0, 0.6)
Mit diesem Tool können nur recht einfach Zusatzpakete geschrieben werden, wie oben approx für fehlerbehaftete Werte oder aber ein Paket um mit Datums- und Zeitangaben zu rechnen und vieles mehr. Das vollständige Beispiel für "approx" habe ich als Beispiel mit in den Download gesteckt.

Viel spaß beim Testen und über Feedback würde ich mich wie immer freuen.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Lizard - Skriptsprache für symbolische Berechnungen, beliebig große und genaue Zahlen, und mehr

Beitrag von Nino »

Wow! :allright: Vielen Dank, Stargate!
Leider bin ich im Moment gerade im Büro, aber ich werde mir die neue Lizard-Version heute Nachmittag genauer ansehen. Freue mich schon. :D
Viele Grüße!
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Lizard - Skriptsprache für symbolische Berechnungen, beliebig große und genaue Zahlen, und mehr

Beitrag von STARGÅTE »

Hallo Leute,

es ist schon wieder ein dreiviertel Jahr rum, daher möchte ich euch zu Pfingsten mit einem neuen Update versorgen.
________________________________________
Lizard - Symbolic computation script language (Version 0.4.3-0002)
Beinhaltet die Lizard.dll (Windows x64 und x86), die Lizard.so (Linux x64), die Lizard.pbi, einige Beispiele zur Einbindung in Pure Basic und eine ausführliche Dokumentation zu Lizard mit vielen Beispielen.
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Dieses Update hatte vor allem den Zweck, die gesamte Funktionsbibliothek auf Bugs zu durchforsten und diese zu beheben (und es waren eine Menge :freak:).
Natürlich gibt es neben den Bug-Fixes auch ein paar neue Funktionen, wie Count und Contain, Flatten und Nest sowie ein paar numerische Funktionen wie ShiftLeft, Bernoulli, Numerator und Abfragen wie IsPrime. Mehr dazu im Change-Log der Dokumentation.
Außerdem gibt es ein neues Beispiel zum ploten von Funktionen und die Dokumentation habe ich auch etwas überarbeitet.

Viel spaß beim Testen und wie immer würde ich mich über Feedback freuen.

Edit: Hot-Fix von 0.4.3-0001 zu 0.4.3-0002: Probleme unter Windows 7 wegen Code außerhalb von DLL
Zuletzt geändert von STARGÅTE am 05.06.2022 16:15, insgesamt 1-mal geändert.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Lord
Beiträge: 313
Registriert: 21.01.2008 19:11

Re: Lizard - Skriptsprache für symbolische Berechnungen, beliebig große und genaue Zahlen, und mehr

Beitrag von Lord »

Hallo STARGÅTE!

Welche Voraussetzungen müssen noch erfüllt sein, damit Deine
Scriptsprache genutzt werden kann?
Ich erhalte mit dem Beispiel "Example10_PlotFunctions.pb" die
Fehlermeldung "Lizard kernel initialization failed!".
Die Zeile 87: LizardLibrary = OpenLibrary(#PB_Any, LibraryPath+"Lizard.dll")
gibt einen Wert 0 an die Variable LizardLibrary zurück.
Ich habe dann Probehalbe die relativen Pfade für die .DLL und .pbi in
absolute Pfade geändert, was aber zu kenem Erfolg führt.
Gibt es für die DLL noch irgendwelche Abhängigkeiten?
Mein System ist ein Win7 auf einem Core i5-760.
Bild
Antworten