#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Copyright 2019 The FATE Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import json
import os
import subprocess
import sys
import time
# from load_file_functions import load_file
home_dir = os.path.split(os.path.realpath(__file__))[0]
config_path = home_dir + '/conf'
data_path = home_dir + '/../data'
load_file_program = home_dir + '/../load_file/load_file.py'
data_set = 'breast'
# data_set = 'default_credit'
# data_set = 'give_credit'
# data_set = 'breast_onehot'
# data_set = 'student-mat'
mode = 'fit'
# mode = 'transform'
def make_config_file(work_mode, job_id, role, guest_partyid, host_partyid):
work_mode = int(work_mode)
with open(config_path + '/{}_runtime_conf.json'.format(role), 'r', encoding='utf-8') as load_f:
role_config = json.load(load_f)
if role == 'guest':
role_config['local']['party_id'] = guest_partyid
data_suffix = 'b'
else:
role_config['local']['party_id'] = host_partyid
data_suffix = 'a'
role_config['role']['host'][0] = host_partyid
role_config['role']['guest'][0] = guest_partyid
role_config['WorkFlowParam']['work_mode'] = int(work_mode)
role_config['FeatureBinningParam']['process_method'] = mode
role_config['WorkFlowParam']['train_input_table'] = "{}_{}_{}".format(data_set, role, job_id)
# guest_config_path = config_path + '/guest_runtime_conf.json_' + str(job_id)
role_config_path = "{}/{}_runtime_conf.json_{}".format(
config_path, role, job_id
)
with open(role_config_path, 'w', encoding='utf-8') as json_file:
json.dump(role_config, json_file, ensure_ascii=False)
with open(config_path + '/load_file.json', 'r', encoding='utf-8') as load_f:
load_config = json.load(load_f)
load_config['work_mode'] = work_mode
# load_config['file'] = data_path + '/' + data_set + '_b.csv'
load_config['file'] = "{}/{}_{}.csv".format(data_path, data_set, data_suffix)
load_config['table_name'] = "{}_{}_{}".format(data_set, role, job_id)
# load_file_role = config_path + '/load_file.json_guest_' + str(job_id)
load_file_path = "{}/load_file.json_{}_{}".format(config_path, role, job_id)
with open(load_file_path, 'w', encoding='utf-8') as json_file:
json.dump(load_config, json_file, ensure_ascii=False)
return role_config_path, load_file_path
def load_file(load_file_path):
load_process = subprocess.Popen(["python",
load_file_program,
"-c",
load_file_path,
])
# load_process.communicate()
returncode = load_process.wait()
print("Load file return code : {}".format(returncode))
def attach_all_result_log(running_process, job_id, role):
while True:
poll = running_process.poll()
if poll is None:
print('Workflow is still running')
time.sleep(5)
else:
break
log_dir = home_dir + '/../../logs/{}'.format(job_id)
role = role.lower()
if role == 'guest':
role_list = ['Guest', 'guest', 'GUEST']
else:
role_list = ['Host', 'host', 'HOST']
result_log_list = []
for log_file in os.listdir(log_dir):
# print('current log_file: {}'.format(log_file))
with open(log_dir + '/' + log_file, 'r', encoding='utf-8') as f:
for log_line in f:
if 'Result' in log_line:
for r in role_list:
if r in log_line:
result_log_list.append(log_line)
break
log_list = sorted(result_log_list, key=get_time)
for log_line in log_list:
print(log_line)
def get_time(log_line):
time_str = log_line.split(' - ')[0]
time_str = time_str[1:]
time_str.strip()
time_sec, time_mili_sec = time_str.split(',')
timestamp = time.mktime(time.strptime(time_sec, '%Y-%m-%d %H:%M:%S'))
timestamp += float(time_mili_sec) / 1000
return timestamp
if __name__ == '__main__':
work_mode = sys.argv[1]
jobid = sys.argv[2]
role = sys.argv[3]
guest_partyid = int(sys.argv[4])
host_partyid = int(sys.argv[5])
role_config_path, load_file_path = make_config_file(work_mode, jobid, role, guest_partyid, host_partyid)
load_file(load_file_path)
work_path = home_dir + '/../../workflow/hetero_binning_workflow/' \
'hetero_binning_{}_workflow.py'.format(role)
workflow_process = subprocess.Popen(["python",
work_path,
"-c",
role_config_path,
"-j",
jobid
])
returncode = workflow_process.wait()
print("Load file return code : {}".format(returncode))
attach_all_result_log(workflow_process, jobid, role)