code: def vertical_combine(data_owners):
      data_iters = [
          data_owner.provide_data() for data_owner in data_owners
      ]
      while True:
          feature_0, label = next(data_iters[0])
          feature_1 = next(data_iters[1])
          feature_2 = next(data_iters[2])
          feature = tfe.concat(
              [feature_0, feature_1, feature_2], axis=1
          )
          yield feature, label
  
file_path: tf-encrypted/examples/application/joint-train/vertical-training.py
imports: import argparse
  import sys
  import tf_encrypted
  from tf_encrypted.keras.datasets import *
  from tf_encrypted.player import DataOwner
  from tf_encrypted.protocol import ABY3
  from tf_encrypted.protocol import Pond
  from tf_encrypted.protocol import SecureNN
label_desc: Use image node_id 1 for calling a global function with example usage: vertical_combine(data_owners) without return types