Skip to content

Conversation

@FrancescAlted
Copy link
Member

This allows to use a bespoke DSL (Domain Specific Language) for expressing computational kernels on blocks that are beyond single expressions. For example:

@blosc2.dsl_kernel
def mandelbrot_dsl(cr, ci, max_iter):
    # max_iter is passed per-call through lazyudf inputs
    zr = 0.0
    zi = 0.0
    escape_iter = float(max_iter)
    for it in range(max_iter):
        zr2 = zr * zr
        zi2 = zi * zi
        mag2 = zr2 + zi2

        active = escape_iter == float(max_iter)
        just_escaped = (mag2 > 4.0) & active
        escape_iter = np.where(just_escaped, it, escape_iter)

        active = escape_iter == float(max_iter)
        if np.all(active == 0):
            break

        zr_new = zr2 - zi2 + cr
        zi_new = 2.0 * zr * zi + ci
        zr = np.where(active, zr_new, zr)
        zi = np.where(active, zi_new, zi)

    return escape_iter

See full example in: https://github.com/Blosc/python-blosc2/blob/3590e61b33e75a8dde77bf8c54c2d5f1faa31746/examples/ndarray/mandelbrot-dsl.ipynb

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant