Note
Because this documentation consists of static html, the live_plot
and live_info
widget is not live. Download the notebook
in order to see the real behaviour.
.. seealso:: The complete source code of this tutorial can be found in :jupyter-download:notebook:`tutorial.DataSaver`
.. jupyter-execute:: :hide-code: import adaptive adaptive.notebook_extension(_inline_js=False)
If the function that you want to learn returns a value along with some metadata, you can wrap your learner in an adaptive.DataSaver.
In the following example the function to be learned returns its result and the execution time in a dictionary:
.. jupyter-execute:: from operator import itemgetter def f_dict(x): """The function evaluation takes roughly the time we `sleep`.""" import random from time import sleep waiting_time = random.random() sleep(waiting_time) a = 0.01 y = x + a**2 / (a**2 + x**2) return {'y': y, 'waiting_time': waiting_time} # Create the learner with the function that returns a 'dict' # This learner cannot be run directly, as Learner1D does not know what to do with the 'dict' _learner = adaptive.Learner1D(f_dict, bounds=(-1, 1)) # Wrapping the learner with 'adaptive.DataSaver' and tell it which key it needs to learn learner = adaptive.DataSaver(_learner, arg_picker=itemgetter('y'))
learner.learner
is the original learner, so
learner.learner.loss()
will call the correct loss method.
.. jupyter-execute:: runner = adaptive.Runner(learner, goal=lambda l: l.learner.loss() < 0.1)
.. jupyter-execute:: :hide-code: await runner.task # This is not needed in a notebook environment!
.. jupyter-execute:: runner.live_info()
.. jupyter-execute:: runner.live_plot(plotter=lambda l: l.learner.plot(), update_interval=0.1)
Now the DataSavingLearner
will have an dictionary attribute
extra_data
that has x
as key and the data that was returned by
learner.function
as values.
.. jupyter-execute:: learner.extra_data