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 = LogisticRegressionNetwork(
          len(df_x1.columns), len(df_x2.columns)
      )
      set_one_like_parameter(model)
      loss_fn = nn.BCELoss()
      optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)
  
      x1 = torch.tensor(df_x1.to_numpy(dtype="float32"))
      x2 = torch.tensor(df_x2.to_numpy(dtype="float32"))
      y = torch.tensor(
          np.expand_dims(df_y.to_numpy(dtype="float32"), axis=1)
      )
      assert len(x1) == len(x2) == len(y)
      batch_size = 4
  
      pytorch_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],
          )
          pred = model(X1, X2)
          loss = loss_fn(pred, Y)
          optimizer.zero_grad()
          loss.backward()
          optimizer.step()
          i += batch_size
          if i % 100 == 0:
              loss, current = loss.item(), i
              print(f"loss: {loss:>7f}  [{current:>3d}/{size:>3d}]")
              pytorch_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(
          pytorch_loss_list, ppl.loss_history
      ), "Validation failed, correctness of PPML and native Pytorch not the same"
  
imports: import multiprocessing
  import threading
  from multiprocessing import Process
  import unittest
  import numpy
  import pandas
  import os
  import torch
  from bigdl.ppml.fl.nn.fl_context import init_fl_context
  from bigdl.ppml.fl.nn.pytorch.utils import set_one_like_parameter
  from bigdl.ppml.fl.nn.fl_server import FLServer
  from torch import Tensor, nn
  import logging
  from bigdl.ppml.fl.estimator import Estimator
  from bigdl.ppml.fl.utils import FLTest
  from typing import List
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