code: def predict(
      ctx,
      role: Role,
      test_data: cpn.dataframe_input(roles=[GUEST, HOST]),
      predict_model_input: cpn.json_model_input(roles=[GUEST, HOST]),
      test_output_data: cpn.dataframe_output(roles=[GUEST, HOST]),
  ):
      model_input = predict_model_input.read()
      test_data = test_data.read()
      if role.is_guest:
          booster = HeteroSecureBoostGuest()
          booster.from_model(model_input)
          pred_table_rs = booster.predict(ctx, test_data)
          pred_table_rs = add_dataset_type(
              pred_table_rs, consts.TEST_SET
          )
          test_output_data.write(pred_table_rs)
  
      elif role.is_host:
          booster = HeteroSecureBoostHost()
          booster.from_model(model_input)
          booster.predict(ctx, test_data)
  
      else:
          raise RuntimeError(f"Unknown role: {role}")
  
file_path: FATE/python/fate/components/components/hetero_secureboost.py
imports: import logging
  from fate.arch.dataframe import DataFrame
  from fate.arch import Context
  from fate.components.core import GUEST, HOST, Role, cpn, params
  from fate.ml.ensemble import HeteroSecureBoostGuest, HeteroSecureBoostHost, BINARY_BCE, MULTI_CE, REGRESSION_L2
  from fate.components.components.utils.tools import add_dataset_type
  from fate.components.components.utils import consts
label_desc: Use image node_id 3 for calling a global function with example usage: predict(ctx, role, test_data, predict_model_input, test_output_data) without return types