Reactive Runtime
Projekt Beschreibung
Veröffentlichungen und Reproduzierbarkeit ist ein Grundstein der wissenschaftlichen Methodik. Zur Bereitstellung von Analysen erfreuen sich Notebooks wie Jupyter steigender Beliebtheit. Allerdings verhindert die Abhängigkeit der Ausführungsordnung (execution order) und versteckter Zustände (hidden state) häufig die Reproduktion. Bei diesem Projekt, wird die Kalkulation ähnlich wie bei Spreadsheets (z.B. Excel) durch einen Graphen dargestellt, der die Abhängigkeiten zwischen den Variablen beschreibt. Dies ermöglicht die effiziente, automatische Ausführung des gesamten Notebooks, z.b wenn sich Inputs verändern. Zusammen mit interaktiven Widgets wie Slidern, kann man so spielerisch komplexe Daten und wissenschaftliche Modelle erforschen. Eine Haupt Innovation dieses Projekts ist es, dass man durch das erfassen des gesamten Compute-Graphs alle Berechnungen speichern kann - Das heißt, egal ob die Berechnungen auf einem super Computer gelaufen sind, oder auf einem Laptop mit einem Komplizierten Setup, ist es möglich die Resultate interaktiv im Internet einem breiten Publikum vorzustellen.
Ergebnisse
Die vollständige Notebook Integration der ReactiveRuntime ist ein wenig in den Hintergrund gerutscht, da ungleich später das Projekt Pluto.jl gestartet wurden ist, welches zu 100% die Reactive Runtime implementiert, ziemlich genau mit dem gleichen Ausführungsmodell wie ObservablHQ:
Dies hat den Fokus auf Geschwindigkeit und den statischen Export interaktiver Plots von komplexen Modellen verschoben, was Pluto bis jetzt noch nicht unterstützt.
Nichts desto trotz, funktionieren alle Elemente von ReactiveRuntime in Jupyter, IJulia, Nextjournal, VSCode und sogar auch in Pluto.jl.
Nextjournal funktioniert besonders gut, da ReactiveRuntime hier automatisch jegliche Plots offline, Interaktiv und reproduzierbar veröffentlichen kann so, dass es sehr leicht ist diese einem breiten Publikum vorzustellen, oder aber auch als Forscher auf den Artikel aufbauen kann (remix) und weiterführende Analysen erstellen kann.
Demos
Soil
# TODO Publish code & fix size
HTML("""<iframe src="https://simondanisch.github.io/WGLDemos/soil/" style="width: 1600px; height: 2500px; padding: 0; border: none; zoom: 0.5; -moz-transform: scale(0.5); -moz-transform-origin: 0 0;" scrolling="no"/>""")
Visualisierung Deutscher Geodaten
Ich hoffe, ich finde die Daten, aber ein Kollege ist grad dabei wunderbare geographische visualisierung von Deutschland zu machen (in Makie), und ich wollte immer mal die zu erwartenden Klima-Veränderungen in Deuschland interaktiv zeigen
Margo Julia Library
Demo eines Kollegen: https://observablehq.com/@margo/plots die perfekt fuer Makie funktioniert.
Implementierung
Die Basis für ReactiveRuntime ist die Plotting Bibliothek Makie.jl, welche von grund auf für interaktive Anwendungen konzipiert wurden ist. Dieses Projekt hat das high Performance Web backend (WGLMakie) weiter ausgebaut. WGLMakie benutzt JSServe.jl um interaktive Graphiken von Julia aus via ThreeJS & WebGL im Browser zu rendern.
Die Interaktivität wird durch Observables.jl ermöglicht, welches einen Compute Graph von allen Input und Output Variablen erstellt. Durch die Benutzung von Observables kann Makie mit minimal Aufwand und maximaler performance Animationen erstellen, da nur exakt die Daten neu berechnet werden müssen, die für die Visualisierung gebraucht werden.
Zum Beispiel, in dem interaktiven Plot, wird nur die neue Farbe + Markersize zum Browser geschickt, was nur wenige bytes sind.
]up; add WGLMakie AbstractPlotting JSServe
using WGLMakie, AbstractPlotting, JSServe, Colors
using JSServe.DOM; set_theme!(resolution=(500, 500));
function app(args...)
markersize = JSServe.Slider(LinRange(1, 20, 100))
markersize_display = DOM.div(markersize, markersize.value)
hue_slider = JSServe.Slider(LinRange(1, 360, 100))
color = map(hue_slider) do hue
HSV(hue, 0.5, 0.5)
end
positions = rand(Point3f0, 10^6)
plot = scatter(positions, markersize=markersize, color=color)
return DOM.div(markersize_display, hue_slider, plot)
end
JSServe.with_session(app)
Dies hilft auch sehr beim Offline mode, da durch das Fehlen des Julia Prozesses alle Daten voraus berechnet werden müssen. In ReactiveRuntime haben wir vollständige Transparenz, welche Daten wirklich gespeichert werden müssen, um eine Interaktive Graphik zu erstellen. Wenn auf dem Weg zur Graphik Gigabytes an Daten verarbeitet werden müssen, aber am ende nur ein paar Positionen und Farben verändert werden müssen, speichert ReactiveRuntime nur diese! Dies passiert via `record_statemap`:
# TODO, fix bug
JSServe.with_session() do session, r
return JSServe.record_state_map(session, app)
end
Dies nimmt eine statemap für alle Input Elemente die irgendwo in der Julia App gefunden werden auf, und ersetzt dann die Kommunikation mit dem Julia Prozess durch einen lookup in der statemap. Dies funktioniert natürlich nur für Input Elemente mit einer finiten Anzahl an states, wie Slider und dropdowns.