code: def test_two_party_logistic_regression(self) -> None:
      df_train = pd.read_csv(
          os.path.join(resource_path, "pima-indians-diabetes.csv")
      )
  
      df_x1 = df_train[
          ["Pregnancies", "Glucose", "BloodPressure", "SkinThickness"]
      ]
      df_x2 = df_train[
          ["Insulin", "BMI", "DiabetesPedigreeFunction", "Age"]
      ]
      df_y = df_train["Outcome"]
      model = build_whole_model(feature_num1=4, feature_num2=4)
      set_one_like_parameter(model)
      optimizer = tf.keras.optimizers.SGD(learning_rate=1e-3)
      loss_fn = tf.keras.losses.BinaryCrossentropy()
  
      x1 = tf.convert_to_tensor(df_x1.to_numpy(dtype="float32"))
      x2 = tf.convert_to_tensor(df_x2.to_numpy(dtype="float32"))
      y = tf.convert_to_tensor(
          np.expand_dims(df_y.to_numpy(dtype="float32"), axis=1)
      )
      assert len(x1) == len(x2) == len(y)
      batch_size = 4
  
      tensorflow_loss_list = []
  
      i, size = 0, len(x1)
      # just abandon last batch to reduce code
      while i + batch_size < len(x1):
          X1, X2, Y = (
              x1[i : i + batch_size],
              x2[i : i + batch_size],
              y[i : i + batch_size],
          )
          with tf.GradientTape() as tape:
              pred = model([X1, X2])
              loss = loss_fn(pred, Y)
          grads = tape.gradient(loss, model.trainable_variables)
          optimizer.apply_gradients(
              zip(grads, model.trainable_variables)
          )
          i += batch_size
          if i % 100 == 0:
              loss, current = loss, i
              print(f"loss: {loss:>7f}  [{current:>3d}/{size:>3d}]")
              tensorflow_loss_list.append(np.array(loss))
  
      mock_party2 = Process(
          target=mock_process,
          args=("diabetes-vfl-2.csv", self.target, 2, False),
      )
      mock_party2.start()
      ppl = mock_process(
          data_train="diabetes-vfl-1.csv",
          target=self.target,
          client_id=1,
          upload_server_model=True,
      )
      mock_party2.join()
      assert np.allclose(
          tensorflow_loss_list, ppl.loss_history, 1e-1, 1e-1
      ), "Validation failed, correctness of PPML and native Tensorflow not the same"
  
imports: import multiprocessing
  import threading
  from multiprocessing import Process
  import unittest
  import numpy
  import pandas
  import os
  import logging
  from bigdl.ppml.fl.nn.fl_context import init_fl_context
  from bigdl.ppml.fl.nn.tensorflow.utils import set_one_like_parameter
  from bigdl.ppml.fl.nn.fl_server import FLServer
  from bigdl.ppml.fl.estimator import Estimator
  from bigdl.ppml.fl.utils import FLTest
  from typing import List
  import tensorflow
  from tensorflow import Tensor
  from tensorflow.keras.layers import Dense
  from tensorflow.keras import Model, Input
label_desc: Use image node_id 4 for calling the TestLogisticRegression obj's underlying member method code with example usage: obj.test_two_party_logistic_regression() without return types