InteractModels
InteractModels.InteractModels — ModuleInteractModels
InteractModels is a subpackage of ModelParameters.jl that provides an interactive web interface that can run in Atom, Jupyter notebooks, Electron apps or be served on the web.
It's separated out to avoid loading the web stack when it isn't needed.
InteractModels.InteractModel — TypeInteractModel(f, model)An AbstractModel that generates its own Interact.jl interface. Each model Param has a slider generated for it to update the model. After any slider updates the user-defined function f is passed the updated model to generate a new output - anything that will display in a WebIO.jl node, like a Plots.jl plot
After any slider changes, the parent model is updated, so that parent(model) will return it's latest state.
Arguments
f: a function that take the model object as an argument, but withParamfields replaced with their values. Usually adoblock.model: any object withParams objects in some fields.
Param fields
Param objects in the model need to include a range or bounds field to define the slider range - holding an AbsractRange or NTuple{2}, respectively.
Optionally, the Params can also include:
- A
labelfield to use instead of field names - A
desciptionfield to use in mouse hover text
Keyword Arguments
title:""set a window title, if you need it.submodel:Nothing.TypeorUnionthat will group sliders into labeled subsections.throttle:0.1. Slider throttle, in seconds. Adjust to improve performance.layout:vbox. This can be any three-argument function that will combine title, output, and sliders (all WebIO nodes) into a combined WebIO node. You can use this method to do any additional layout you need.
Example
This is a simple example where the model is a NamedTuple, adapted from an Interact.jl example. It will display in atoms plot pane:
using InteractModels, Interact, ColorSchemes, Colors
color(i) = Colors.hex(colors[i%length(colors)+1])
colors = ColorSchemes.viridis
width, height = 700, 300
nsamples = 256
model = (;
sample_step=Param(val=0.05, range=0.01:0.001:0.1, label="Sample step"),
phase=Param(val=0.0, range=0:0.1:2pi, label="Phase"),
radii=Param(val=20,range=0:0.1:60, label="Radus")
)
ui = InteractModel(model; submodel=Nothing, throttle=0.1) do m
cxs_unscaled = [i * m.sample_step + m.phase for i in 1:nsamples]
cys = sin.(cxs_unscaled) .* height/3 .+ height/2
cxs = cxs_unscaled .* width/4pi
c = (dom"svg:circle[cx=$(cxs[i]), cy=$(cys[i]), r=$(m.radii), fill=#$(color(i))]"()
for i in 1:nsamples)
return dom"svg:svg[width=$width, height=$height]"(c...)
endInteractModels.attach_sliders! — Methodattach_sliders!(f, model::AbstractModel; submodel=false, throttle=0.1)
attach_sliders!(model::AbstractModel; submodel=false, throttle=0.1, f=identity)Internal method that may be useful for creating custom interfaces like InteractModel, without actually using InteracModel directly. This interface will be less stable than InteractModel.
Create sliders and attach them to the model so it will be updated when they are moved.
Arguments
f: a function that accepts the model, stripped ofParamwrappers, with a return value that sets the observableobs. Usually this converts it to a plot or other web output.model: aAbstractModel
Keyword Arguments
throttle:0.1- sliders response time, in seconds.submodel:Nothing.TypeorUnionthat will group sliders into labeled subsections.obs: An optional observable to be updated when sliders change
Returns a vbox holding the slider widgets.