Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Documenting "inspect" and context awareness udf.rst #617

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions docs/udf.rst
Original file line number Diff line number Diff line change
Expand Up @@ -317,7 +317,58 @@ To invoke a UDF like this, the apply_neighborhood method is most suitable:
{'dimension': 'y', 'value': 128, 'unit': 'px'}
], overlap=[])

Inspecting variables within UDF
daviddkovacs marked this conversation as resolved.
Show resolved Hide resolved
========================================

To print and inspect variables that are within the UDF, users can use `inspect(data=[], message="")` function.
This will print the data that is supplied within, and show it with the message within the logs.

.. code-block:: python
:linenos:
:caption: ``Inspecting UDFs``
:emphasize-lines: 7

# Create a UDF object from inline source code.
udf = openeo.UDF("""
import xarray

def apply_datacube(cube: xarray.DataArray, context: dict) -> xarray.DataArray:
cube.values = 0.0001 * cube.values
inspect(data=[type(cube.values)], message="The dtype of cube.values")
return cube
""")

In the above example, the `inspect` function is used to retrieve the datatype of `cube.values`. Once the job logs are opened in the Web Editor, the result will appear
under the supplied message. This case it will be shown that `Data: <class 'numpy.ndarray'>`

Passing user defined variables to UDF
========================================

In order to pass variables and values that are used throughout the user side of script, these need to be put in the `context` dictionary.
daviddkovacs marked this conversation as resolved.
Show resolved Hide resolved
Once, these variables are defined within `context` dictionary, the UDF needs to be made context aware, by adding `context={"from_parameter": "context"}` at the end of your UDF.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Once, these variables are defined within `context` dictionary, the UDF needs to be made context aware, by adding `context={"from_parameter": "context"}` at the end of your UDF.
Once these variables are defined within `context` dictionary, the UDF needs to be made context aware, by adding `context={"from_parameter": "context"}` at the end of your UDF.

variables are defined within context dictionary

This is a bit confusing, because in your example you define them in a user_variable dictionary

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

true, how should I define it?

See the example below:

.. code-block:: python
:linenos:
:caption: ``Passing user defined values``
:emphasize-lines: 8

# Create a UDF object from inline source code.
udf = openeo.UDF("""
import xarray

def apply_datacube(cube: xarray.DataArray, context: dict) -> xarray.DataArray:
cube.values = context["factor"] * cube.values # Accessing the value stored in the context dictionary by the "factor" key.
daviddkovacs marked this conversation as resolved.
Show resolved Hide resolved
return cube
""",context={"from_parameter": "context"}) # the UDF is now context aware

user_variable = {"factor": 0.0001}
cube = cube.apply(udf, context = user_variable)

In the example above, the user stores a preferred value of `0.0001` in the `user_variable` dictionary,
daviddkovacs marked this conversation as resolved.
Show resolved Hide resolved
which can be passed to the UDF and used by the function.
Later, this value is accessed by calling `context["factor"]` within the UDF.
The parent UDF is called with the user's custom dictionary with `.apply(udf, context = user_variable)`.
daviddkovacs marked this conversation as resolved.
Show resolved Hide resolved

Example: ``apply_dimension`` with a UDF
========================================
Expand Down