deephaven / deephaven-plugins

Deephaven Plugins
11 stars 15 forks source link

Errors are a complete indirection at what problems are #997

Open chipkent opened 2 weeks ago

chipkent commented 2 weeks ago

I've been iterating on some code. The errors that are coming from ui are complete misdirections. Below I have some broken code plus the error that came with it. I made some changes towards resolving the problem, and then I get a different cryptic error. In the end, my code was completely broken, and it had to do with passing in the wrong number of arguments and doing other dumb things. If you iterate through trying to fix the code below, you will see that the error messages are complete misdirections for the user.

Code:

# TODO: pydoc
import logging
from typing import Tuple, Callable, Any
from deephaven import ui, dtypes
from deephaven.table import Table, PartitionedTable
from deephaven.plot.figure import Figure

# This function is to avoid UI bugs in rendering tables with non-primitive columns
# TODO: https://github.com/deephaven/deephaven-plugins/issues/701
# TODO: https://github.com/deephaven/deephaven-core/issues/5708
def _retain_primitive_cols(name: str, table: Table) -> Table:
    """Return a new table with only primitive columns.

    This function is to avoid UI bugs in rendering tables with non-primitive columns.

    Args:
        name (str): The name of the table.
        table (Table): The table to filter.
    """
    def retain_col(col):
        retain = col.data_type.is_primitive or col.data_type in [dtypes.string, dtypes.bool_, dtypes.Instant]

        if not retain:
            logging.warning(f"REMOVING COLUMN FOR VISUALIZATION: table={name} column={col.name} type={col.data_type}.")

        return retain

    return table.view([col.name for col in table.columns if retain_col(col)])

def null_note(t: Table, note: str, func: Callable[[], Any]) -> Any:
    """ Return a note if the table is empty; otherwise, return the element from the function. """
    return func() if t else ui.text(note)

# TODO: this is commented out because it fails if it is not
# @ui.component
def _symbol_picker(table: PartitionedTable, label: str = "Symbol") -> Tuple[ui.Element, str]:
    symbol_table = ui.use_memo(lambda: table.table.view("symbol").select_distinct().sort("symbol"), [])
    symbol, set_symbol = ui.use_state("")

    pick_table = ui.picker(
        symbol_table,
        label=label,
        on_change=set_symbol,
        selected_key=symbol,
    )

    text = ui.text_field(
        value=symbol,
        on_change=set_symbol,
        label=label,
    )

    return ui.flex(pick_table, text), symbol

@ui.component
def _tab_table_view(tables: dict[str, PartitionedTable], symbol: str) -> ui.BaseElement:

    def make_component(table):
        t = table.get_constituent([symbol])
        return null_note(t, f"No data for {symbol}", lambda: t)

    return ui.stack([ui.panel(make_component(table), title=name) for name, table in tables.items()])

@ui.component
def plot_shares(shares: Table) -> Figure:
    p = Figure()

    for col in shares.columns:
        if "shares_" in col.name and "dilution_factor" not in col.name:
            p = p.plot_xy(col.name, shares, x="timestamp", y=col.name)

    return p.show()

@ui.component
def plot_prices(prices: Table) -> Figure:
    return (
        Figure()
        .plot_xy("close_split_div_adj", prices, x="timestamp", y="close_split_div_adj")
        .y_axis(log=True)
        .show()
    )

@ui.component
def plot_fundamentals(fundamentals: Table, series: str):
    return (
        Figure()
        .plot_xy(series, fundamentals, x="timestamp", y=series)
        .show()
    )

@ui.component
def plot_model_preds(model_preds: Table, symbol: str, active: bool) -> Figure:
    #TODO: get rid of active as an input?
    mp = model_preds.where("active" if active else "!active")

    if mp.size == 0:
        return ui.text(f"No {'active' if active else 'inactive'} model predictions for {symbol}")

    mp = mp.update_view([
                "pred_price_sdp = pred_price + pred_price_stdev_uncorr",  # TODO: which stdev?
                "pred_price_sdm = pred_price - pred_price_stdev_uncorr",  # TODO: which stdev?
            ])

    p = Figure()

    p = p.plot_xy("Pred", t=mp, x="pred_time", y="pred_price",
                      y_low="pred_price_sdm", y_high="pred_price_sdp", by=["full_name"])

    # # TODO: *** meta_preds
    # # TODO: select meta pred
    # meta = (
    #     meta_preds
    #     .where(["stdev_calc == `uncorr`", "meta_weights_func == `sd`"])
    #     .update_view([
    #             "pred_price_sdp = pred_price + pred_price_stdev",
    #             "pred_price_sdm = pred_price - pred_price_stdev",
    #         ]))
    # 
    # p = p.plot_xy("Meta", t=meta, x="pred_time", y="pred_price", y_low="pred_price_sdm", y_high="pred_price_sdp") #TODO: add full name?, by=["full_name"])

    p = p.y_axis(log=True)
    return p.show()

@ui.component
def plot_meta_preds(meta_preds: Table, symbol: str) -> Figure:

    if meta_preds.size == 0:
        return ui.text(f"No {'active' if active else 'inactive'} meta predictions for {symbol}")

    meta = (
        meta_preds
        .where(["stdev_calc == `uncorr`", "meta_weights_func == `sd`"])
        .update_view([
            "full_name = stdev_calc + ` ` + meta_weights_func",
            "pred_price_sdp = pred_price + pred_price_stdev",
            "pred_price_sdm = pred_price - pred_price_stdev",
        ])
    )

    p = Figure()

    p = p.plot_xy("Meta", t=meta, x="pred_time", y="pred_price", y_low="pred_price_sdm", y_high="pred_price_sdp", by=["full_name"])

    p = p.y_axis(log=True)
    return p.show()

@ui.component
def _input_plots(tables: dict[str, PartitionedTable], symbol: str) -> ui.BaseElement:

    # TODO: this doesn't work --> need to have calls to the same number of hooks
    # if not symbol:
    #     return ui.panel(ui.text("Select a symbol"))

    # TODO: filter on date

    shares = tables["shares"].get_constituent([symbol])
    prices = tables["prices"].get_constituent([symbol])
    fundamentals = tables["fundamentals"].get_constituent([symbol])
    model_preds = tables["model_preds"].get_constituent([symbol])
    meta_preds = tables["meta_preds"].get_constituent([symbol])

    error_msg = f"No data for {symbol}"
    outputs = []

    outputs.append(ui.panel(null_note(shares, error_msg, lambda: plot_shares(shares)), title="shares"))
    outputs.append(ui.panel(null_note(prices, error_msg, lambda: plot_prices(prices)), title="prices"))

    for col in tables["fundamentals"].constituent_table_columns:
        if col.name in ["date", "timestamp", "symbol"]:
            continue

        outputs.append(ui.panel(null_note(fundamentals, error_msg, lambda: plot_fundamentals(fundamentals, col.name)), title=col.name))

    outputs.append(ui.panel(null_note(model_preds, error_msg, lambda: plot_model_preds(model_preds, meta_preds, symbol, active=True)), title="model_preds_active"))
    outputs.append(ui.panel(null_note(model_preds, error_msg, lambda: plot_model_preds(model_preds, meta_preds, symbol, active=False)), title="model_preds_inactive"))
    outputs.append(ui.panel(null_note(meta_preds, error_msg, lambda: plot_meta_preds(meta_preds, symbol)), title="meta_preds"))

    return ui.stack(
        *outputs,
    )

@ui.component
def my_panel(tables: dict[str, PartitionedTable]) -> ui.BaseElement:
    model_preds = tables["model_preds"]
    symbol_picker, symbol = _symbol_picker(model_preds, label="Symbol")

    # TODO: thinks this should be fine --> Doesn't work because new stuff is garbage at the bottom
    # if not symbol:
    #     return ui.column(symbol_picker)

    ttv = _tab_table_view(tables, symbol)
    ip = _input_plots(tables, symbol)

    return ui.column(
        symbol_picker,
        ttv,
        ip,
    )

def my_dashboard(tables: dict[str, Table]) -> ui.DashboardElement:
    part_tables = {name: _retain_primitive_cols(name, table).partition_by("symbol") for name, table in tables.items()}
    return ui.dashboard(my_panel(part_tables)) # TODO: Bad type hint or should fail

if __name__ == "__main__":
    from cecropia.lynchmunger import cli
    globals().update(cli.debug_values)
    dashboard = my_dashboard(cli.debug_values)

Error:

TypeError

plot_model_preds() got multiple values for argument 'active'

Traceback (most recent call last):
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/object_types/ElementMessageStream.py", line 189, in _render
    node = self._renderer.render(self._element)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 153, in render
    return _render_element(element, self._context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 123, in _render_element
    props = _render_dict_in_open_context(props, context)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 103, in _render_dict_in_open_context
    return {key: _render_child_item(value, context, key) for key, value in item.items()}
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 45, in _render_child_item
    return _render_element(item, parent_context.get_child_context(key))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 123, in _render_element
    props = _render_dict_in_open_context(props, context)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 103, in _render_dict_in_open_context
    return {key: _render_child_item(value, context, key) for key, value in item.items()}
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 45, in _render_child_item
    return _render_element(item, parent_context.get_child_context(key))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 123, in _render_element
    props = _render_dict_in_open_context(props, context)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 103, in _render_dict_in_open_context
    return {key: _render_child_item(value, context, key) for key, value in item.items()}
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 27, in _render_child_item
    return _render_list(item, parent_context.get_child_context(index_key))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 68, in _render_list
    _render_child_item(value, context, str(key))
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 45, in _render_child_item
    return _render_element(item, parent_context.get_child_context(key))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 123, in _render_element
    props = _render_dict_in_open_context(props, context)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 103, in _render_dict_in_open_context
    return {key: _render_child_item(value, context, key) for key, value in item.items()}
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 45, in _render_child_item
    return _render_element(item, parent_context.get_child_context(key))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 123, in _render_element
    props = _render_dict_in_open_context(props, context)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 103, in _render_dict_in_open_context
    return {key: _render_child_item(value, context, key) for key, value in item.items()}
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 27, in _render_child_item
    return _render_list(item, parent_context.get_child_context(index_key))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 68, in _render_list
    _render_child_item(value, context, str(key))
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 45, in _render_child_item
    return _render_element(item, parent_context.get_child_context(key))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 123, in _render_element
    props = _render_dict_in_open_context(props, context)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 103, in _render_dict_in_open_context
    return {key: _render_child_item(value, context, key) for key, value in item.items()}
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 45, in _render_child_item
    return _render_element(item, parent_context.get_child_context(key))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 120, in _render_element
    props = element.render(context)
            ^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/elements/FunctionElement.py", line 43, in render
    children = self._render()
               ^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/components/make_component.py", line 23, in <lambda>
    return FunctionElement(component_type, lambda: func(*args, **kwargs), key=key)
                                                   ^^^^^^^^^^^^^^^^^^^^^
TypeError: plot_model_preds() got multiple values for argument 'active'

Screenshot:

image
NameError

name 'active' is not defined

Traceback (most recent call last):
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/object_types/ElementMessageStream.py", line 189, in _render
    node = self._renderer.render(self._element)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 153, in render
    return _render_element(element, self._context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 123, in _render_element
    props = _render_dict_in_open_context(props, context)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 103, in _render_dict_in_open_context
    return {key: _render_child_item(value, context, key) for key, value in item.items()}
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 45, in _render_child_item
    return _render_element(item, parent_context.get_child_context(key))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 123, in _render_element
    props = _render_dict_in_open_context(props, context)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 103, in _render_dict_in_open_context
    return {key: _render_child_item(value, context, key) for key, value in item.items()}
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 45, in _render_child_item
    return _render_element(item, parent_context.get_child_context(key))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 123, in _render_element
    props = _render_dict_in_open_context(props, context)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 103, in _render_dict_in_open_context
    return {key: _render_child_item(value, context, key) for key, value in item.items()}
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 27, in _render_child_item
    return _render_list(item, parent_context.get_child_context(index_key))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 68, in _render_list
    _render_child_item(value, context, str(key))
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 45, in _render_child_item
    return _render_element(item, parent_context.get_child_context(key))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 123, in _render_element
    props = _render_dict_in_open_context(props, context)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 103, in _render_dict_in_open_context
    return {key: _render_child_item(value, context, key) for key, value in item.items()}
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 45, in _render_child_item
    return _render_element(item, parent_context.get_child_context(key))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 123, in _render_element
    props = _render_dict_in_open_context(props, context)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 103, in _render_dict_in_open_context
    return {key: _render_child_item(value, context, key) for key, value in item.items()}
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 27, in _render_child_item
    return _render_list(item, parent_context.get_child_context(index_key))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 68, in _render_list
    _render_child_item(value, context, str(key))
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 45, in _render_child_item
    return _render_element(item, parent_context.get_child_context(key))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 123, in _render_element
    props = _render_dict_in_open_context(props, context)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 103, in _render_dict_in_open_context
    return {key: _render_child_item(value, context, key) for key, value in item.items()}
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 45, in _render_child_item
    return _render_element(item, parent_context.get_child_context(key))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/renderer/Renderer.py", line 120, in _render_element
    props = element.render(context)
            ^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/elements/FunctionElement.py", line 43, in render
    children = self._render()
               ^^^^^^^^^^^^^^
  File "/Users/chip/dev/ccpy/venv3.12-v2/lib/python3.12/site-packages/deephaven/ui/components/make_component.py", line 23, in <lambda>
    return FunctionElement(component_type, lambda: func(*args, **kwargs), key=key)
                                                   ^^^^^^^^^^^^^^^^^^^^^
  File "<string>", line 100, in plot_model_preds
NameError: name 'active' is not defined
vbabich commented 1 week ago

@chipkent What error message would you expect in this situation? The first TypeError seems pretty accurate.