This module implements an interact() function decorator for the Sage notebook.
AUTHORS:
Bases: sagenb.notebook.interact.InputBox
An input box interact() control.
INPUT:
EXAMPLES:
sage: sagenb.notebook.interact.InputBox('theta', 1, 'theta')
An InputBox interactive control with theta=1 and label 'theta'
sage: sagenb.notebook.interact.InputBox('theta', 1, 'theta', int)
An InputBox interactive control with theta=1 and label 'theta'
Render this color input box to HTML.
OUTPUT:
EXAMPLES:
sage: sagenb.notebook.interact.ColorInput('c', Color('red')).render()
'...table...color...'
Return JavaScript that evaluates to value of this control. If n is 0, return code for evaluation by the actual color control. If n is 1, return code for the text area that displays the current color.
INPUT:
OUTPUT:
EXAMPLES:
sage: C = sagenb.notebook.interact.ColorInput('c', Color('red'))
sage: C.value_js(0)
'color'
sage: C.value_js(1)
'this.value'
Bases: sagenb.notebook.interact.InteractControl
An input box interact() control.
INPUT:
EXAMPLES:
sage: sagenb.notebook.interact.InputBox('theta', 1, 'theta')
An InputBox interactive control with theta=1 and label 'theta'
sage: sagenb.notebook.interact.InputBox('theta', 1, 'theta', int)
An InputBox interactive control with theta=1 and label 'theta'
Render this control as a string.
OUTPUT:
EXAMPLES:
sage: sagenb.notebook.interact.InputBox('theta', 1).render()
'...input...value="1"...theta...'
Return JavaScript string that will give the value of this control element.
OUTPUT:
EXAMPLES:
sage: sagenb.notebook.interact.InputBox('theta', 1).value_js()
'this.value'
Bases: sagenb.notebook.interact.InteractControl
A grid interact control.
INPUT:
EXAMPLES:
sage: sagenb.notebook.interact.InputGrid('M', 2,2, default_value = 0, label='M')
A 2 x 2 InputGrid interactive control with M=[[0, 0], [0, 0]] and label 'M'
sage: sagenb.notebook.interact.InputGrid('M', 2,2, default_value = [[1,2],[3,4]], label='M')
A 2 x 2 InputGrid interactive control with M=[[1, 2], [3, 4]] and label 'M'
sage: sagenb.notebook.interact.InputGrid('M', 2,2, default_value = [[1,2],[3,4]], label='M', to_value=MatrixSpace(ZZ,2,2))
A 2 x 2 InputGrid interactive control with M=[1 2]
[3 4] and label 'M'
sage: sagenb.notebook.interact.InputGrid('M', 1, 3, default_value=[1,2,3], to_value=lambda x: vector(flatten(x)))
A 1 x 3 InputGrid interactive control with M=(1, 2, 3) and label 'M'
Render this control as a string.
OUTPUT:
EXAMPLES:
sage: sagenb.notebook.interact.InputGrid('M', 1,2).render()
'...table...input...M...'
Return JavaScript string that will give the value of this control element.
OUTPUT:
EXAMPLES:
sage: sagenb.notebook.interact.InputGrid('M', 2,2).value_js()
"...jQuery...table...map...val...join..."
Bases: object
Base class for interact() canvases. This is where all the controls along with the output of the interacted function are laid out and rendered.
INPUT:
EXAMPLES:
sage: B = sagenb.notebook.interact.InputBox('x',2)
sage: sagenb.notebook.interact.InteractCanvas([B], 3)
Interactive canvas in cell 3 with 1 controls
Return the ID of the cell that contains this interact() control.
OUTPUT:
EXAMPLES:
The output below should equal the ID of the current cell:
sage: B = sagenb.notebook.interact.InputBox('x',2)
sage: C = sagenb.notebook.interact.InteractCanvas([B], 3); C
Interactive canvas in cell 3 with 1 controls
sage: C.cell_id()
3
Return a list of controls in this canvas.
OUTPUT:
Note
Returns a reference to a mutable list.
EXAMPLES:
sage: B = sagenb.notebook.interact.InputBox('x',2)
sage: sagenb.notebook.interact.InteractCanvas([B], 3).controls()
[An InputBox interactive control with x=2 and label 'x']
Returns True if any change of the values for the controls on this canvas should cause an update. If auto_update=False was not specified in the constructor for this canvas, then this will default to True.
OUTPUT:
EXAMPLES:
sage: B = sagenb.notebook.interact.InputBox('x',2)
sage: canvas = sagenb.notebook.interact.InteractCanvas([B], 3)
sage: canvas.is_auto_update()
True
sage: canvas = sagenb.notebook.interact.InteractCanvas([B], 3, auto_update=False)
sage: canvas.is_auto_update()
False
Render in text (HTML) the entire interact() canvas.
OUTPUT:
EXAMPLES:
sage: B = sagenb.notebook.interact.InputBox('x',2)
sage: sagenb.notebook.interact.InteractCanvas([B], 3).render()
'...notruncate...div...interact...table...x...'
Render in text (HTML) form all the input controls.
OUTPUT:
EXAMPLES:
sage: B = sagenb.notebook.interact.InputBox('x',2)
sage: sagenb.notebook.interact.InteractCanvas([B], 3).render_controls()
'...table...x...input...2...'
Render in text (HTML) form the output portion of the interact() canvas.
The output contains two special tags, <?TEXT> and <?HTML>, which get replaced at runtime by the text and HTML parts of the output of running the function.
OUTPUT:
EXAMPLES:
sage: B = sagenb.notebook.interact.InputBox('x',2)
sage: sagenb.notebook.interact.InteractCanvas([B], 3).render_output()
'...div...interact...3...'
Return the entire HTML for the interactive canvas, obtained by wrapping all the inside HTML of the canvas in a div and a table.
INPUT:
OUTPUT:
EXAMPLES:
sage: B = sagenb.notebook.interact.InputBox('x',2)
sage: sagenb.notebook.interact.InteractCanvas([B], 3).wrap_in_outside_frame('<!--inside-->')
'...notruncate...div...interact...table...inside...'
Bases: sagenb.notebook.interact.InteractElement
Abstract base class for interact() controls. These are controls that are used in a specific interact(). They have internal state information about the specific function being interacted, etc.
INPUT:
EXAMPLES:
sage: from sagenb.notebook.interact import InteractControl
sage: InteractControl('x', default_value=5)
A InteractControl (abstract base class)
Return integer index into adapt dictionary of function that is called to adapt the values of this control to Python.
OUTPUT:
EXAMPLES:
sage: from sagenb.notebook.interact import InteractControl
sage: InteractControl('x', 19/3).adapt_number() # random -- depends on call order
2
Return the ID of the cell that contains this interact() control.
OUTPUT:
EXAMPLES:
The output below should equal the ID of the current cell:
sage: sagenb.notebook.interact.InteractControl('theta', 1).cell_id()
0
Return the default value of the variable corresponding to this interact() control.
OUTPUT:
EXAMPLES:
sage: from sagenb.notebook.interact import InteractControl
sage: InteractControl('x', 19/3).default_value()
19/3
Returns the HTML escaped default value of the variable corresponding to this interact() control. Note that any HTML that uses quotes around this should use double quotes and not single quotes.
OUTPUT:
EXAMPLES:
sage: from sagenb.notebook.interact import InteractControl
sage: InteractControl('x', '"cool"').html_escaped_default_value()
'"cool"'
sage: InteractControl('x',"'cool'").html_escaped_default_value()
"'cool'"
sage: x = var('x')
sage: InteractControl('x', x^2).html_escaped_default_value()
'x^2'
Return a string that when evaluated in JavaScript calls the JavaScript interact() function with appropriate inputs for this control.
This method will check to see if there is a canvas attached to this control and whether or not controls should automatically update the output when their values change. If no canvas is associated with this control, then the control will automatically update.
OUTPUT:
EXAMPLES:
sage: sagenb.notebook.interact.InteractControl('x', 1).interact()
"...interact...x...1..."
Return the text label of this interact() control.
OUTPUT:
EXAMPLES:
sage: from sagenb.notebook.interact import InteractControl
sage: InteractControl('x', default_value=5, label='the x value').label()
'the x value'
JavaScript that when evaluated gives the current value of this control. This should be redefined in a derived class.
OUTPUT:
EXAMPLES:
sage: sagenb.notebook.interact.InteractControl('x', default_value=5).value_js()
'NULL'
Return the name of the variable that this control interacts.
OUTPUT:
EXAMPLES:
sage: sagenb.notebook.interact.InteractControl('theta', 1).var()
'theta'
Bases: object
x.__init__(...) initializes x; see help(type(x)) for signature
Returns the InteractCanvas associated to this element. If no canvas has been set (via the set_canvas() method), then raise a ValueError.
EXAMPLES:
sage: from sagenb.notebook.interact import InputBox, InteractCanvas
sage: B = InputBox('x',2)
sage: canvas1 = InteractCanvas([B], 3)
sage: canvas2 = InteractCanvas([B], 3)
sage: B.canvas() is canvas2
True
Returns an empty label for this element. This should be overridden for subclasses that need a label.
OUTPUT:
EXAMPLES:
sage: from sagenb.notebook.interact import UpdateButton, InteractElement
sage: b = UpdateButton(1, 'autoupdate')
sage: isinstance(b, InteractElement)
True
sage: b.label()
''
Sets the InteractCanvas on which this element appears. This method is primarily called in the constructor for InteractCanvas.
EXAMPLES:
sage: from sagenb.notebook.interact import InputBox, InteractCanvas
sage: B = InputBox('x',2)
sage: canvas1 = InteractCanvas([B], 3)
sage: canvas2 = InteractCanvas([B], 3)
sage: B.canvas() is canvas2
True
sage: B.set_canvas(canvas1)
sage: B.canvas() is canvas1
True
Bases: sagenb.notebook.interact.InteractElement
This interact() element displays a button which when clicked executes JavaScript code in the notebook.
EXAMPLES:
sage: b = sagenb.notebook.interact.JavascriptCodeButton('Push me', 'alert("2")')
Returns the HTML to display this button.
OUTPUT:
EXAMPLES:
sage: b = sagenb.notebook.interact.JavascriptCodeButton('Push me', 'alert("2")')
sage: b.render()
'...input...button...Push me...alert("2")...'
Bases: sagenb.notebook.interact.SliderGeneric
A range slider interact() control that takes on the given list of values.
INPUT:
EXAMPLES:
sage: sagenb.notebook.interact.RangeSlider('x', [1..5], (2,3), 'alpha')
Range Slider Interact Control: alpha [1--|3==4|---5]
Return the default position (as an integer) of the slider.
OUTPUT:
EXAMPLES:
sage: sagenb.notebook.interact.RangeSlider('x', [1..5], (2,3), 'alpha').default_position()
(2, 3)
Render this control as an HTML string.
OUTPUT:
EXAMPLES:
sage: sagenb.notebook.interact.RangeSlider('x', [1..5], (2,3), 'alpha').render()
'...table...slider...["1","2","3","4","5"]...range...'
sage: sagenb.notebook.interact.RangeSlider('x', [1..5], (2,3), 'alpha', display_value=False).render()
'...table...slider...null...range...
Return JavaScript string that will give the value of this control element.
OUTPUT:
EXAMPLES:
sage: sagenb.notebook.interact.RangeSlider('x', [1..5], (2,3), 'alpha').value_js()
"pos[0]+' '+pos[1]"
Bases: sagenb.notebook.interact.InteractControl
A drop down menu or a button bar that when pressed sets a variable to a given value.
INPUT:
var - a string; variable name
values - a list; button values
label - a string (default: None); label off to the left for this button group
default - an integer (default: 0); position of default value in values list.
nrows - an integer (default: None); number of rows
ncols - an integer (default: None); number of columns
width - an integer (default: None); width of all the buttons
instead of dropdown
EXAMPLES:
sage: sagenb.notebook.interact.Selector('x', [1..5], 'alpha', default=2)
Selector with 5 options for variable 'x'
sage: sagenb.notebook.interact.Selector('x', [1..4], 'alpha', default=2, nrows=2, ncols=2, width=10, buttons=True)
Selector with 4 options for variable 'x'
Render this control as a string.
OUTPUT:
EXAMPLES:
sage: sagenb.notebook.interact.Selector('x', [1..5]).render()
'...select...x...'
sage: sagenb.notebook.interact.Selector('x', [1..5], buttons=True).render()
'...table...button...x...'
Whether or not to use buttons instead of a drop down menu for this select list.
OUTPUT:
EXAMPLES:
sage: sagenb.notebook.interact.Selector('x', [1..5]).use_buttons()
False
sage: sagenb.notebook.interact.Selector('x', [1..5], buttons=True).use_buttons()
True
Return JavaScript string that will give the value of this control element.
OUTPUT:
EXAMPLES:
sage: sagenb.notebook.interact.Selector('x', [1..5]).value_js()
'this.options[this.selectedIndex].value'
sage: sagenb.notebook.interact.Selector('x', [1..5], buttons=True).value_js()
'this.value'
Bases: sagenb.notebook.interact.SliderGeneric
A slider interact() control that takes on the given list of values.
INPUT:
EXAMPLES:
sage: sagenb.notebook.interact.Slider('x', [1..5], 2, 'alpha')
Slider Interact Control: alpha [1--|3|---5]
Return the default position (as an integer) of the slider.
OUTPUT:
EXAMPLES:
sage: sagenb.notebook.interact.Slider('x', [1..5], 2, 'alpha').default_position()
2
Render this control as an HTML string.
OUTPUT:
EXAMPLES:
sage: sagenb.notebook.interact.Slider('x', [1..5], 2, 'alpha').render()
'...table...slider...["1","2","3","4","5"]...'
sage: sagenb.notebook.interact.Slider('x', [1..5], 2, 'alpha', display_value=False).render()
'...table...slider...null...'
Return JavaScript string that will give the value of this control element.
OUTPUT:
EXAMPLES:
sage: sagenb.notebook.interact.Slider('x', [1..5], 2, 'alpha').value_js()
'position'
Bases: sagenb.notebook.interact.InteractControl
An abstract slider interact() control that takes on the given list of values.
INPUT:
var - a string; name of variable being interacted
will take on
default_value - an object; default value of the slider.
label - a string; alternative label to the left of the slider, instead of the variable.
EXAMPLES:
sage: sagenb.notebook.interact.SliderGeneric('x', [1..5], 2, 'alpha')
Abstract Slider Interact Control: alpha [1--|2|---5]
Returns whether to display the value on the slider.
OUTPUT:
EXAMPLES:
sagenb.notebook.interact.Slider('x', [1..5], 2, 'alpha').display_value()
True
Return list of values the slider acts on.
OUTPUT:
EXAMPLES:
sagenb.notebook.interact.Slider('x', [1..5], 2, 'alpha').values()
[1, 2, 3, 4, 5]
Returns JavaScript array representation of values or ‘null’ if display_value=False
OUTPUT:
EXAMPLES:
sage: sagenb.notebook.interact.Slider('x', [1..5], 2, 'alpha').values_js()
'["1","2","3","4","5"]'
sage: sagenb.notebook.interact.Slider('x', [1..5], 2, 'alpha', False).values_js()
'null'
sage: sagenb.notebook.interact.Slider('x', [pi..2*pi], 2, 'alpha').values_js()
'["pi","pi + 1","pi + 2","pi + 3"]'
Bases: sagenb.notebook.interact.InteractControl
A text field interact() control
INPUT:
EXAMPLES:
sage: sagenb.notebook.interact.TextControl('x', 'something')
Text Interact Control: something
Render this control as an HTML string.
OUTPUT:
EXAMPLES:
sage: sagenb.notebook.interact.TextControl('x', 'something').render()
'...div...something...'
Bases: sagenb.notebook.interact.JavascriptCodeButton
Creates an interact() button element. A click on the button triggers recomputation of the cell with the current values of the variables.
INPUT:
EXAMPLES:
sage: b = sagenb.notebook.interact.UpdateButton(0, 'auto_update')
sage: b.render()
'...input...button...Update...0...'
Return the name of the variable that this control interacts.
OUTPUT:
EXAMPLES:
sage: sagenb.notebook.interact.UpdateButton(1, 'auto_update').var()
'auto_update'
Automagically determine the type of control from the default value of the variable.
INPUT:
OUTPUT:
EXAMPLES:
sage: sagenb.notebook.interact.automatic_control('')
Interact input box labeled None with default value ''
sage: sagenb.notebook.interact.automatic_control(15)
Interact input box labeled None with default value 15
sage: sagenb.notebook.interact.automatic_control(('start', 15))
Interact input box labeled 'start' with default value 15
sage: sagenb.notebook.interact.automatic_control((1,250))
Slider: None [1.0--|1.0|---250.0]
sage: sagenb.notebook.interact.automatic_control(('alpha', (1,250)))
Slider: alpha [1.0--|1.0|---250.0]
sage: sagenb.notebook.interact.automatic_control((2,(0,250)))
Slider: None [0.0--|2.00400801603|---250.0]
sage: sagenb.notebook.interact.automatic_control(('alpha label', (2,(0,250))))
Slider: alpha label [0.0--|2.00400801603|---250.0]
sage: sagenb.notebook.interact.automatic_control((2, ('alpha label',(0,250))))
Slider: alpha label [0.0--|2.00400801603|---250.0]
sage: C = sagenb.notebook.interact.automatic_control((1,52, 5)); C
Slider: None [1--|1|---52]
sage: C.values()
[1, 6, 11, 16, 21, 26, 31, 36, 41, 46, 51, 52]
sage: sagenb.notebook.interact.automatic_control((17, (1,100,5)))
Slider: None [1--|16|---100]
sage: sagenb.notebook.interact.automatic_control([1..4])
Button bar with 4 buttons
sage: sagenb.notebook.interact.automatic_control([1..100])
Drop down menu with 100 options
sage: sagenb.notebook.interact.automatic_control((1..100))
Slider: None [1--|1|---100]
sage: sagenb.notebook.interact.automatic_control((5, (1..100)))
Slider: None [1--|5|---100]
sage: sagenb.notebook.interact.automatic_control(matrix(2,2))
Interact 2 x 2 input grid control labeled None with default value [0, 0, 0, 0]
Bases: sagenb.notebook.interact.input_box
A checkbox interactive control. Use this in conjunction with the interact() command.
INPUT:
EXAMPLES:
sage: checkbox(False, "Points")
Interact checkbox labeled 'Points' with default value False
sage: checkbox(True, "Points")
Interact checkbox labeled 'Points' with default value True
sage: checkbox(True)
Interact checkbox labeled None with default value True
sage: checkbox()
Interact checkbox labeled None with default value True
Bases: sagenb.notebook.interact.input_box
A color selector (also called a color chooser, picker, or tool) interactive control. Use this with the interact() command.
INPUT:
EXAMPLES:
sage: color_selector()
Interact color selector labeled None, with default RGB color (0.0, 0.0, 1.0), widget 'colorpicker', and visible input box
sage: color_selector((0.5, 0.5, 1.0), widget='jpicker')
Interact color selector labeled None, with default RGB color (0.5, 0.5, 1.0), widget 'jpicker', and visible input box
sage: color_selector(default = Color(0, 0.5, 0.25))
Interact color selector labeled None, with default RGB color (0.0, 0.5, 0.25), widget 'colorpicker', and visible input box
sage: color_selector('purple', widget = 'colorpicker')
Interact color selector labeled None, with default RGB color (0.50..., 0.0, 0.50...), widget 'colorpicker', and visible input box
sage: color_selector('crayon', widget = 'colorpicker')
Traceback (most recent call last):
...
ValueError: unknown color 'crayon'
sage: color_selector('#abcdef', label='height', widget='jpicker')
Interact color selector labeled 'height', with default RGB color (0.6..., 0.8..., 0.9...), widget 'jpicker', and visible input box
sage: color_selector('abcdef', label='height', widget='jpicker')
Traceback (most recent call last):
...
ValueError: unknown color 'abcdef'
Return whether to hide the input box associated with this color selector.
OUTPUT:
EXAMPLES:
sage: color_selector().hide_box()
False
sage: color_selector('green', hide_box=True, widget='jpicker').hide_box()
True
sage: color_selector((0.75,0.5,0.25)).hide_box()
False
Return the name of the HTML widget for this color selector.
OUTPUT:
EXAMPLES:
sage: color_selector().widget()
'colorpicker'
sage: color_selector('#abcdef', hide_box=True, widget='farbtastic').widget()
'farbtastic'
sage: color_selector(widget='jpicker').widget()
'jpicker'
sage: color_selector(default=Color(0,0.5,0.25)).widget()
'colorpicker'
An interactive control object used with the interact() command. This is the abstract base class.
INPUTS:
EXAMPLES:
sage: sagenb.notebook.interact.control('a control')
Interative control 'a control' (abstract base class)
Return the label of this control.
OUTPUT:
EXAMPLES:
sage: sagenb.notebook.interact.control('a control').label()
'a control'
sage: selector([1,2,7], 'alpha').label()
'alpha'
Set the label of this control.
INPUT:
EXAMPLES:
sage: C = sagenb.notebook.interact.control('a control')
sage: C.set_label('sage'); C
Interative control 'sage' (abstract base class)
Print the input string s in a form that tells the notebook to display it in the HTML portion of the output. This function has no return value.
INPUT:
EXAMPLES:
sage: sagenb.notebook.interact.html('hello')
<html>hello</html>
Return HTML representation of a jQuery color selector.
INPUT:
OUTPUT:
EXAMPLES:
sage: sagenb.notebook.interact.html_color_selector(0, 'alert("changed")', '', default='0afcac')
'...<table>...colorpicker...'
sage: sagenb.notebook.interact.html_color_selector(99, 'console.log(color);', '', default='fedcba', widget='farbtastic', hide_box=True)
'...<table>...farbtastic...'
Return the HTML representation of a jQuery range slider.
INPUT:
OUTPUT:
EXAMPLES:
We create a jQuery range slider. If you do the following in the notebook you should obtain a slider that when moved pops up a window showing its current position:
sage: from sagenb.notebook.interact import html_rangeslider, html
sage: html(html_rangeslider('slider-007', 'null', 'alert(pos[0]+", "+pos[1])', steps=5, default_l=2, default_r=3, margin=5))
<html>...slider...range...</html>
Return the HTML representation of a jQuery slider.
INPUT:
OUTPUT:
EXAMPLES:
We create a jQuery HTML slider. If you do the following in the notebook you should obtain a slider that when moved pops up a window showing its current position:
sage: from sagenb.notebook.interact import html_slider, html
sage: html(html_slider('slider-007', 'null', 'alert(position)', steps=5, default=2, margin=5))
<html>...slider...</html>
Bases: sagenb.notebook.interact.control
An input box interactive control. Use this in conjunction with the interact() command.
INPUT:
EXAMPLES:
sage: input_box("2+2", 'expression')
Interact input box labeled 'expression' with default value '2+2'
sage: input_box('sage', label="Enter your name", type=str)
Interact input box labeled 'Enter your name' with default value 'sage'
sage: input_box('Multiline\nInput',label='Click to change value',type=str,height=5)
Interact input box labeled 'Click to change value' with default value 'Multiline\nInput'
Return the default value of this input box.
OUTPUT:
EXAMPLES:
sage: input_box('2+2', 'Expression').default()
'2+2'
sage: input_box(x^2 + 1, 'Expression').default()
x^2 + 1
sage: checkbox(True, "Points").default()
True
Return rendering of this input box as an InputBox to be used for an interact() canvas. Basically this specializes this input to be used for a specific function and variable.
INPUT:
OUTPUT:
EXAMPLES:
sage: input_box("2+2", 'Exp').render('x')
An InputBox interactive control with x='2+2' and label 'Exp'
Return the type that elements of this input box are coerced to or None if they are not coerced (they have whatever type they evaluate to).
OUTPUT:
EXAMPLES:
sage: input_box("2+2", 'expression', type=int).type()
<type 'int'>
sage: input_box("2+2", 'expression').type() is None
True
Bases: sagenb.notebook.interact.control
An input grid interactive control. Use this in conjunction with the interact() command.
INPUT:
NOTEBOOK EXAMPLE:
@interact
def _(m = input_grid(2,2, default = [[1,7],[3,4]],
label='M=', to_value=matrix),
v = input_grid(2,1, default=[1,2],
label='v=', to_value=matrix)):
try:
x = m\v
html('$$%s %s = %s$$'%(latex(m), latex(x), latex(v)))
except:
html('There is no solution to $$%s x=%s$$'%(latex(m), latex(v)))
EXAMPLES:
sage: input_grid(2,2, default = 0, label='M')
Interact 2 x 2 input grid control labeled M with default value 0
sage: input_grid(2,2, default = [[1,2],[3,4]], label='M')
Interact 2 x 2 input grid control labeled M with default value [[1, 2], [3, 4]]
sage: input_grid(2,2, default = [[1,2],[3,4]], label='M', to_value=MatrixSpace(ZZ,2,2))
Interact 2 x 2 input grid control labeled M with default value [[1, 2], [3, 4]]
sage: input_grid(1, 3, default=[[1,2,3]], to_value=lambda x: vector(flatten(x)))
Interact 1 x 3 input grid control labeled None with default value [[1, 2, 3]]
Return the default value of this input grid.
OUTPUT:
EXAMPLES:
sage: input_grid(2,2, default=1).default()
1
Return rendering of this input grid as an InputGrid to be used for an interact() canvas. Basically this specializes this input to be used for a specific function and variable.
INPUT:
OUTPUT:
EXAMPLES:
sage: input_grid(2,2).render('x')
A 2 x 2 InputGrid interactive control with x=[[None, None], [None, None]] and label 'x'
Use interact as a decorator to create interactive Sage notebook cells with sliders, text boxes, radio buttons, check boxes, and color selectors. Simply put @interact on the line before a function definition in a cell by itself, and choose appropriate defaults for the variable names to determine the types of controls (see tables below).
INPUT:
EXAMPLES:
In each example below we use a single underscore for the function name. You can use any name you want; it does not have to be an underscore.
We create an interact control with two inputs, a text input for
the variable a and a y slider that runs through the range of
integers from to
.
sage: @interact
... def _(a=5, y=(0..20)): print a + y
...
<html>...
sage: @interact(layout=[['a','b'],['d']])
... def _(a=x^2, b=(0..20), c=100, d=x+1): print a+b+c+d
...
<html>...
sage: @interact(layout={'top': [['a', 'b']], 'left': [['c']], 'bottom': [['d']]})
... def _(a=x^2, b=(0..20), c=100, d=x+1): print a+b+c+d
...
<html>...
Draw a plot interacting with the “continuous” variable a. By default continuous variables have exactly 50 possibilities.
sage: @interact
... def _(a=(0,2)):
... show(plot(sin(x*(1+a*x)), (x,0,6)), figsize=4)
<html>...
Interact a variable in steps of 1 (we also use an unnamed function):
sage: @interact
... def _(n=(10,100,1)):
... show(factor(x^n - 1))
<html>...
Interact two variables:
sage: @interact
... def _(a=(1,4), b=(0,10)):
... show(plot(sin(a*x+b), (x,0,6)), figsize=3)
<html>...
Place a block of text among the controls:
sage: @interact
... def _(t1=text_control("Factors an integer."), n="1"):
... print factor(Integer(n))
<html>...
You do not have to use interact as a decorators; you can also simply write interact(f) where f is any Python function that you have defined, though this is frowned upon. E.g., f can also be a library function as long as it is written in Python:
sage: interact(matrix) # put ZZ, 2,2,[1..4] in boxes...
<html>...
If your the time to evaluate your function takes awhile, you may not want to have it reevaluated every time the inputs change. In order to prevent this, you can add a keyword auto_update=False to your function to prevent it from updating whenever the values are changed. This will cause a button labeled ‘Update’ to appear which you can click on to re-evaluate your function.
sage: @interact
... def _(n=(10,100,1), auto_update=False):
... show(factor(x^n - 1))
<html>...
DEFAULTS:
Defaults for the variables of the input function determine interactive controls. The standard controls are input_box, slider, range_slider, checkbox, selector, input_grid, and color_selector. There is also a text control (see the defaults below).
You can also create a color selector by setting the default value for an input_box to Color(...).
There are also some convenient defaults that allow you to make controls automatically without having to explicitly specify them. E.g., you can make x a continuous slider of values between u and v by just writing x=(u,v) in the argument list of your function. These are all just convenient shortcuts for creating the controls listed above.
Note
Suppose you would like to make an interactive with a default RGB color of (1,0,0), so the function would have signature f(color=(1,0,0)). Unfortunately, the above shortcuts reinterpret the (1,0,0) as a discrete slider with step size 0 between 1 and 0. Instead you should do the following:
sage: @interact
... def _(v = input_box((1,0,0))):
... show(plot(sin,color=v))
<html>...
An alternative:
sage: @interact
... def _(c = color_selector((1, 0, 0))):
... show(plot(sin, color = c))
<html>...
MORE EXAMPLES:
We give an input box that allows one to enter completely arbitrary strings:
sage: @interact
... def _(a=input_box('sage', label="Enter your name", type=str)):
... print "Hello there %s"%a.capitalize()
<html>...
The scope of variables that you control via interact() are local to the scope of the function being interacted with. However, by using the global Python keyword, you can still modify global variables as follows:
sage: xyz = 10
sage: @interact
... def _(a=('xyz',5)):
... global xyz
... xyz = a
<html>...
If you enter the above you obtain an interact() canvas. Entering values in the box changes the global variable xyz. Here’s a example with several controls:
sage: @interact
... def _(title=["A Plot Demo", "Something silly", "something tricky"], a=input_box(sin(x*sin(x*sin(x))), 'function'),
... clr = Color('red'), thickness=[1..30], zoom=(1,0.95,..,0.1), plot_points=(200..2000)):
... html('<h1 align=center>%s</h1>'%title)
... print plot_points
... show(plot(a, -zoom*pi,zoom*pi, color=clr, thickness=thickness, plot_points=plot_points))
<html>...
For a more compact color control, use an empty label and hide the input box:
sage: @interact
... def _(color=color_selector((1,0,1), label='', hide_box=True)):
... show(plot(x/(8/7+sin(x)), (x,-50,50), fill=True, fillcolor=color))
<html>...
We give defaults and name the variables:
sage: @interact
... def _(a=('first', (1,4)), b=(0,10)):
... show(plot(sin(a*x+sin(b*x)), (x,0,6)), figsize=3)
<html>...
Another example involving labels, defaults, and the slider command:
sage: @interact
... def _(a = slider(1, 4, default=2, label='Multiplier'),
... b = slider(0, 10, default=0, label='Phase Variable')):
... show(plot(sin(a*x+b), (x,0,6)), figsize=4)
<html>...
An example where the range slider control is useful:
sage: @interact
... def _(b = range_slider(-20, 20, 1, default=(-19,3), label='Range')):
... plot(sin(x)/x, b[0], b[1]).show(xmin=b[0],xmax=b[1])
<html>...
An example using checkboxes, obtained by making the default values bools:
sage: @interact
... def _(axes=('Show axes', True), square=False):
... show(plot(sin, -5,5), axes=axes, aspect_ratio = (1 if square else None))
<html>...
An example generating a random walk that uses a checkbox control to determine whether points are placed at each step:
sage: @interact
... def foo(pts = checkbox(True, "points"), n = (50,(10..100))):
... s = 0; v = [(0,0)]
... for i in range(n):
... s += random() - 0.5
... v.append((i, s))
... L = line(v, rgbcolor='#4a8de2')
... if pts: L += points(v, pointsize=20, rgbcolor='black')
... show(L)
<html>...
You can rotate and zoom into 3-D graphics while interacting with a variable:
sage: @interact
... def _(a=(0,1)):
... x,y = var('x,y')
... show(plot3d(sin(x*cos(y*a)), (x,0,5), (y,0,5)), figsize=4)
<html>...
A random polygon:
sage: pts = [(random(), random()) for _ in xrange(20)]
sage: @interact
... def _(n = (4..len(pts)), c=Color('purple') ):
... G = points(pts[:n],pointsize=60) + polygon(pts[:n], rgbcolor=c)
... show(G, figsize=5, xmin=0, ymin=0)
<html>...
Two “sinks” displayed simultaneously via a contour plot and a 3-D interactive plot:
sage: @interact
... def _(q1=(-1,(-3,3)), q2=(-2,(-3,3))):
... x,y = var('x,y')
... f = q1/sqrt((x+1)^2 + y^2) + q2/sqrt((x-1)^2+(y+0.5)^2)
... C = contour_plot(f, (-2,2), (-2,2), plot_points=30, contours=15, cmap='cool')
... show(C, figsize=3, aspect_ratio=1)
... show(plot3d(f, (x,-2,2), (y,-2,2)), figsize=4)
<html>...
This is similar to above, but you can select the color map from a dropdown menu:
sage: @interact
... def _(q1=(-1,(-3,3)), q2=(-2,(-3,3)),
... cmap=['autumn', 'bone', 'cool', 'copper', 'gray', 'hot', 'hsv',
... 'jet', 'pink', 'prism', 'spring', 'summer', 'winter']):
... x,y = var('x,y')
... f = q1/sqrt((x+1)^2 + y^2) + q2/sqrt((x-1)^2+(y+0.5)^2)
... C = contour_plot(f, (x,-2,2), (y,-2,2), plot_points=30, contours=15, cmap=cmap)
... show(C, figsize=3, aspect_ratio=1)
<html>...
A quadratic roots etch-a-sketch:
sage: v = []
sage: html('<h2>Quadratic Root Etch-a-sketch</h2>')
<html>...<h2>Quadratic Root Etch-a-sketch</h2>...</html>
sage: @interact
... def _(a=[-10..10], b=[-10..10], c=[-10..10]):
... f = a*x^2 + b*x + c == 0; show(f)
... soln = solve(a*x^2 + b*x + c == 0, x)[0].rhs()
... show(soln)
... P = tuple(CDF(soln))
... v.append(P)
... show(line(v, rgbcolor='purple') + point(P, pointsize=200))
<html>...
In the following example, we only generate data for a given n once, so that as one varies p the data does not randomly change. We do this by simply caching the results for each n in a dictionary.:
sage: data = {}
sage: @interact
... def _(n=(500,(100,5000,1)), p=(1,(0.1,10))):
... n = int(n)
... if not data.has_key(n):
... data[n] = [(random(), random()) for _ in xrange(n)]
... show(points([(x^p,y^p) for x,y in data[n]], rgbcolor='black'), xmin=0, ymin=0, axes=False)
<html>...
A conchoid:
sage: @interact
... def _(k=(1.2,(1.1,2)), k_2=(1.2,(1.1,2)), a=(1.5,(1.1,2))):
... u, v = var('u,v')
... f = (k^u*(1+cos(v))*cos(u), k^u*(1+cos(v))*sin(u), k^u*sin(v)-a*k_2^u)
... show(parametric_plot3d(f, (u,0,6*pi), (v,0,2*pi), plot_points=[40,40], texture=(0,0.5,0)))
<html>...
An input grid:
sage: @interact
... def _(A=matrix(QQ,3,3,range(9)), v=matrix(QQ,3,1,range(3))):
... try:
... x = A\v
... html('$$%s %s = %s$$'%(latex(A), latex(x), latex(v)))
... except:
... html('There is no solution to $$%s x=%s$$'%(latex(A), latex(v)))
<html>...
Given an iterator v, return first n elements it produces as a list.
INPUT:
OUTPUT:
EXAMPLES:
sage: from itertools import takewhile
sage: p100 = takewhile(lambda x: x < 100, Primes())
sage: sagenb.notebook.interact.list_of_first_n(p100, 10)
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
sage: sagenb.notebook.interact.list_of_first_n((1..5), 10)
[1, 2, 3, 4, 5]
sage: sagenb.notebook.interact.list_of_first_n(QQ, 10)
[0, 1, -1, 1/2, -1/2, 2, -2, 1/3, -1/3, 3]
Return an integer, always counting up, and starting with 0. This is used for saving the adapt methods for controls. An adapt method is just a function that coerces data into some object, e.g., makes sure the control always produces int’s.
OUTPUT:
EXAMPLES:
sage: sagenb.notebook.interact.new_adapt_number() # random output -- depends on when called
1
Bases: sagenb.notebook.interact.slider_generic
An interactive range slider control, which can be used in conjunction with the interact() command.
INPUT:
EXAMPLES:
We specify both vmin and vmax. We make the default
but since neither is one of
-th spaced
values between
and
, the closest values:
and
, are instead chosen as the default:
sage: range_slider(2, 5, 3/17, (3,4), 'alpha')
Range Slider: alpha [2--|52/17==67/17|---5]
Here we give a list:
sage: range_slider([1..10], None, None, (3,7), 'alpha')
Range Slider: alpha [1--|3==7|---10]
Return default index into the list of values.
OUTPUT:
EXAMPLES:
sage: range_slider(2, 5, 1/2, (3,4), 'alpha').default_index()
(2, 4)
Render the interact() control for the given function and variable.
INPUT:
OUTPUT:
EXAMPLES:
sage: S = range_slider(0, 10, 1, default=(3,7), label='theta'); S
Range Slider: theta [0--|3==7|---10]
sage: S.render('x')
Range Slider Interact Control: theta [0--|3==7|---10]
sage: range_slider(2, 5, 2/7, (3,4), 'alpha').render('x')
Range Slider Interact Control: alpha [2--|20/7==4|---5]
Evaluates the interact() function associated to the cell cell_id. This typically gets called after a call to update().
INPUT:
EXAMPLES:
The following outputs __SAGE_INTERACT_RESTART__ to indicate that not all the state of the interact() canvas has been set up yet (this setup happens when JavaScript calls certain functions):
sage: sagenb.notebook.interact.recompute(10)
__SAGE_INTERACT_RESTART__
Reset the interact() state of this sage process.
EXAMPLES:
sage: sagenb.notebook.interact.state # random output
{1: {'function': <function g at 0x72aaab0>, 'variables': {'m': 3, 'n': 5}, 'adapt': {1: <bound method Slider._adaptor of Slider Interact Control: n [1--|1|---10].>, 2: <bound method Slider._adaptor of Slider Interact Control: m [1--|1|---10].>}}}
sage: from sagenb.notebook.interact import reset_state
sage: reset_state()
sage: sagenb.notebook.interact.state
{}
Bases: sagenb.notebook.interact.control
A drop down menu or a button bar that when pressed sets a variable to a given value. Use this in conjunction with the interact() command.
We use the same command to create either a drop down menu or selector bar of buttons, since conceptually the two controls do exactly the same thing - they only look different. If either nrows or ncols is given, then you get a buttons instead of a drop down menu.
INPUT:
EXAMPLES:
sage: selector([1..5])
Drop down menu with 5 options
sage: selector([1,2,7], default=2)
Drop down menu with 3 options
sage: selector([1,2,7], nrows=2)
Button bar with 3 buttons
sage: selector([1,2,7], ncols=2)
Button bar with 3 buttons
sage: selector([1,2,7], width=10)
Drop down menu with 3 options
sage: selector([1,2,7], buttons=True)
Button bar with 3 buttons
We create an interact() that involves computing charpolys of matrices over various rings:
sage: @interact
... def _(R=selector([ZZ,QQ,GF(17),RDF,RR]), n=(1..10)):
... M = random_matrix(R, n)
... show(M)
... show(matrix_plot(M,cmap='Oranges'))
... f = M.charpoly()
... print f
<html>...
Here we create a drop-down:
sage: @interact
... def _(a=selector([(2,'second'), (3,'third')])):
... print a
<html>...
Return the default choice for this control.
OUTPUT:
EXAMPLES:
sage: selector([1,2,7], default=2).default()
1
Return rendering of this button as a Selector instance to be used for an interact() canvas.
INPUT:
OUTPUT:
EXAMPLES:
sage: selector([1..5]).render('alpha')
Selector with 5 options for variable 'alpha'
Return the list of values or (val, lbl) pairs that this selector can take on.
OUTPUT:
EXAMPLES:
sage: selector([1..5]).values()
[1, 2, 3, 4, 5]
sage: selector([(5,'fifth'), (8,'eight')]).values()
[(5, 'fifth'), (8, 'eight')]
Bases: sagenb.notebook.interact.slider_generic
An interactive slider control, which can be used in conjunction with the interact() command.
INPUT:
EXAMPLES:
We specify both vmin and vmax. We make the default
, but since
isn’t one of
-th spaced values
between
and
,
is instead chosen as the
default (it is closest):
sage: slider(2, 5, 3/17, 3, 'alpha')
Slider: alpha [2--|52/17|---5]
Here we give a list:
sage: slider([1..10], None, None, 3, 'alpha')
Slider: alpha [1--|3|---10]
The elements of the list can be anything:
sage: slider([1, 'x', 'abc', 2/3], None, None, 'x', 'alpha')
Slider: alpha [1--|x|---2/3]
Return default index into the list of values.
OUTPUT:
EXAMPLES:
sage: slider(2, 5, 1/2, 3, 'alpha').default_index()
2
Render the interact() control for the given function and variable.
INPUT:
- var - a string; variable name
OUTPUT:
EXAMPLES:
sage: S = slider(0, 10, 1, default=3, label='theta'); S
Slider: theta [0--|3|---10]
sage: S.render('x')
Slider Interact Control: theta [0--|3|---10]
sage: slider(2, 5, 2/7, 3, 'alpha').render('x')
Slider Interact Control: alpha [2--|20/7|---5]
Bases: sagenb.notebook.interact.control
Returns whether to display the value on the slider.
OUTPUT:
EXAMPLES:
sagenb.notebook.interact.slider_generic(1,10,1/2).display_value()
True
Returns list of values that this slider takes on, in order.
OUTPUT:
Note
This is a reference to a mutable list.
EXAMPLES:
sage: sagenb.notebook.interact.slider(1,10,1/2).values()
[1, 3/2, 2, 5/2, 3, 7/2, 4, 9/2, 5, 11/2, 6, 13/2, 7, 15/2, 8, 17/2, 9, 19/2, 10]
Bases: sagenb.notebook.interact.control
Text that can be inserted among other interact() controls.
INPUT:
EXAMPLES:
sage: text_control('something')
Text field: something
Return rendering of the text field
INPUT:
OUTPUT:
Called when updating the positions of an interactive control. Note that this just causes the values of the variables to be updated; it does not reevaluate the function with the new values.
INPUT:
EXAMPLES:
The following outputs __SAGE_INTERACT_RESTART__ to indicate that not all the state of the interact() canvas has been set up yet (this setup happens when JavaScript calls certain functions):
sage: sagenb.notebook.interact.update(0, 'a', 0, '5', globals())
__SAGE_INTERACT_RESTART__