# from __future__ import print_function import argparse import os import pathlib from pprint import pprint import grpc from d3m import utils as d3m_utils, runtime as runtime_module from d3m.metadata import problem as problem_module from ta3ta2_api import core_pb2, core_pb2_grpc, value_pb2, utils from axolotl.utils import pipeline as pipeline_utils from axolotl.d3m_grpc import constants # with d3m_utils.silence(): # d3m_index.load_all(blocklist=constants.PrimitivesList.BLACK_LIST) # primitives = [ # 'd3m.primitives.datasets.DatasetToDataFrame', # 'd3m.primitives.data_transformation.denormalize.Common' # ] # # with d3m_utils.silence(): # for primitive in primitives: # d3m_index.get_primitive(primitive) LENGTH = 60 ALLOWED_VALUE_TYPES = ['DATASET_URI', 'CSV_URI', 'RAW'] FULL_SPECIFIED_PIPELINE_PATH = 'modules/server/test_full_pipeline.json' PRE_SPECIFIED_PIPELINE_PATH = 'modules/server/test_placeholder.json' # PRE_SPECIFIED_PIPELINE_PATH = 'modules/server/test_placeholder_pipeline.json' def hello_request(): request = core_pb2.HelloRequest() return request def list_primitives_request(): request = core_pb2.ListPrimitivesRequest() return request def search_solutions_request(test_paths, specified_template=None): user_agent = "test_agent" version = core_pb2.DESCRIPTOR.GetOptions().Extensions[core_pb2.protocol_version] time_bound = 0.5 priority = 10 # allowed_value_types = [value_pb2.ValueType.Value(value) for value in ALLOWED_VALUE_TYPES] problem_description = utils.encode_problem_description( problem_module.Problem.load(test_paths['TRAIN']['problem']) ) template = None if specified_template == 'FULL': with d3m_utils.silence(): pipeline = pipeline_utils.load_pipeline(FULL_SPECIFIED_PIPELINE_PATH) template = utils.encode_pipeline_description(pipeline, ALLOWED_VALUE_TYPES, constants.Path.TEMP_STORAGE_ROOT) elif specified_template == 'PRE': # PRE for PREPROCESSING pipeline = runtime_module.get_pipeline(PRE_SPECIFIED_PIPELINE_PATH, load_all_primitives=False) template = utils.encode_pipeline_description(pipeline, ALLOWED_VALUE_TYPES, constants.Path.TEMP_STORAGE_ROOT) inputs = [ value_pb2.Value( dataset_uri=test_paths['TRAIN']['dataset'] ) ] request = core_pb2.SearchSolutionsRequest( user_agent=user_agent, version=version, time_bound_search=time_bound, priority=priority, allowed_value_types=ALLOWED_VALUE_TYPES, problem=problem_description, template=template, inputs=inputs ) return request def get_search_solution_results_request(search_id): request = core_pb2.GetSearchSolutionsResultsRequest(search_id=search_id) return request def fit_solution_request(solution_id, test_paths): inputs = [ value_pb2.Value( dataset_uri=test_paths['TRAIN']['dataset'] ) ] expose_outputs = ['outputs.0'] expose_value_types = ['CSV_URI'] users = [ core_pb2.SolutionRunUser( id='test_user', chosen=True, reason='just because' ) ] request = core_pb2.FitSolutionRequest( solution_id=solution_id, inputs=inputs, expose_outputs=expose_outputs, expose_value_types=expose_value_types, users=users ) return request def get_fit_solution_results_request(request_id): request = core_pb2.GetFitSolutionResultsRequest( request_id=request_id ) return request def produce_solution_request(fitted_solution_id, test_paths): inputs = [ value_pb2.Value( dataset_uri=test_paths['TEST']['dataset'] ) ] expose_outputs = ['outputs.0'] expose_value_types = ['CSV_URI'] users = [ core_pb2.SolutionRunUser( id='test_user', chosen=True, reason='just because' ) ] request = core_pb2.ProduceSolutionRequest( fitted_solution_id=fitted_solution_id, inputs=inputs, expose_outputs=expose_outputs, expose_value_types=expose_value_types, users=users ) return request def get_produce_solution_results_request(request_id): request = core_pb2.GetProduceSolutionResultsRequest( request_id=request_id ) return request def describe_solution_request(solution_id): request = core_pb2.DescribeSolutionRequest( solution_id=solution_id ) return request def score_solution_request(solution_id, test_paths): inputs = [ value_pb2.Value( dataset_uri=test_paths['SCORE']['dataset'] ) ] problem = problem_module.Problem.load(test_paths['SCORE']['problem']) performance_metrics = [] for performance_metric in problem['problem'].get('performance_metrics', []): performance_metrics.append(utils.encode_performance_metric(performance_metric)) # TODO add support for more evaluation methods users = [] evaluation_method = 'K_FOLD' configuration = core_pb2.ScoringConfiguration( method=evaluation_method, folds=2, # train_test_ratio shuffle=True, random_seed=42, stratified=True, ) request = core_pb2.ScoreSolutionRequest( solution_id=solution_id, inputs=inputs, performance_metrics=performance_metrics, users=users, configuration=configuration ) return request def get_score_solution_request(solution_id): request = core_pb2.ScoreSolutionRequest( solution_id=solution_id ) return request def solution_export_request(solution_id): rank = 0.1 request = core_pb2.SolutionExportRequest( solution_id=solution_id, rank=rank ) return request def end_search_solutions_request(search_id): request = core_pb2.EndSearchSolutionsRequest(search_id=search_id) return request def stop_search_solution_request(search_id): request = core_pb2.StopSearchSolutionsRequest(search_id=search_id) return request def run(test_paths, specified_template=None): channel = grpc.insecure_channel('localhost:45042') stub = core_pb2_grpc.CoreStub(channel) print_name('Hello') hello_r = stub.Hello(hello_request()) pprint(hello_r) print_name('ListPrimitive') list_primitives_r = stub.ListPrimitives(list_primitives_request()) for _primitive in list_primitives_r.primitives: print_space() pprint(_primitive) print_name('SearchSolution') search_solutions_r = stub.SearchSolutions(search_solutions_request(test_paths, specified_template)) search_id = search_solutions_r.search_id pprint(search_solutions_r) print_name('GetSearchSolutionsResults') solution_id = None for get_search_solution_r in stub.GetSearchSolutionsResults(get_search_solution_results_request(search_id)): print_space() pprint(get_search_solution_r) if get_search_solution_r.solution_id: solution_id = get_search_solution_r.solution_id print_name('DescribeSolution') describe_solution_r = stub.DescribeSolution(describe_solution_request(solution_id)) pprint(describe_solution_r) print_name('FitSolution') fit_solution_r = stub.FitSolution(fit_solution_request(solution_id, test_paths)) fit_request_id = fit_solution_r.request_id pprint(fit_solution_r) print_name('GetFitSolutionResultsRequest') fitted_solution_id = None for get_git_solution_results_r in stub.GetFitSolutionResults(get_fit_solution_results_request(fit_request_id)): print_space() pprint(get_git_solution_results_r) fitted_solution_id = get_git_solution_results_r.fitted_solution_id print_name('ProduceSolutionRequest') produce_solution_r = stub.ProduceSolution(produce_solution_request(fitted_solution_id, test_paths)) produce_request_id = produce_solution_r.request_id pprint(produce_solution_r) print_name('GetProduceSolutionResultsRequest') for get_produce_solution_results_r in stub.GetProduceSolutionResults( get_produce_solution_results_request(produce_request_id)): print_space() pprint(get_produce_solution_results_r) print_name('ScoreSolution') score_solution_r = stub.ScoreSolution(score_solution_request(solution_id, test_paths)) score_request_id = score_solution_r.request_id pprint(score_solution_r) print_name('GetScoreSolutionResults') for score_solution_r in stub.GetScoreSolutionResults(get_score_solution_request(score_request_id)): print_space() pprint(score_solution_r) print_name('SolutionExport') solution_export_r = stub.SolutionExport(solution_export_request(solution_id)) pprint(solution_export_r) print_name('StopSearchSolutions') stop_search_solution_r = stub.StopSearchSolutions(stop_search_solution_request(search_id)) pprint(stop_search_solution_r) print_name('EndSearchSolutions') end_search_solutions_r = stub.EndSearchSolutions(end_search_solutions_request(search_id)) pprint(end_search_solutions_r) def print_name(name): length = LENGTH free_space = length - len(name) - 2 space = int(free_space / 2) name = '#' + ' ' * space + name + ' ' * space if free_space % 2 == 0: name = name + '#' else: name = name + ' #' print("#" * length) print(name) print("#" * length) def print_space(): print('-' * LENGTH) def configure_parser(parser, *, skip_arguments=()): parser.add_argument( '-t', '--test-path', type=str, default="/D3M/internal_d3m/Winter_2018_tamuta2/datasets/26/", help="path of d3m dataset to test." ) def get_problem_id(test_path): problem_description = problem_module.Problem.load(test_path) print(problem_description) problem_id = problem_description.get('id', None) return problem_id def get_paths(test_path): # Classification Score dataset path is (problem_SCORE, dataset_SCORE) not # However, regression and other Score dataset path is (problem_TEST, dataset_TEST) score_problem_relative_path = os.path.join(test_path, 'SCORE/problem_SCORE/problemDoc.json') score_dataset_relative_path = os.path.join(test_path, 'SCORE/dataset_SCORE/datasetDoc.json') if not os.path.exists(score_problem_relative_path) or not os.path.exists(score_dataset_relative_path): score_problem_relative_path = os.path.join(test_path, 'SCORE/problem_TEST/problemDoc.json') score_dataset_relative_path = os.path.join(test_path, 'SCORE/dataset_TEST/datasetDoc.json') test_paths = { 'TRAIN': { 'dataset': os.path.join(test_path, 'TRAIN/dataset_TRAIN/datasetDoc.json'), 'problem': pathlib.Path( os.path.abspath(os.path.join(test_path, 'TRAIN/problem_TRAIN/problemDoc.json'))).as_uri() }, 'TEST': { 'dataset': os.path.join(test_path, 'TEST/dataset_TEST/datasetDoc.json'), 'problem': pathlib.Path( os.path.abspath(os.path.join(test_path, 'TEST/problem_TEST/problemDoc.json'))).as_uri() }, 'SCORE': { 'dataset': os.path.join(test_path, score_dataset_relative_path), 'problem': pathlib.Path(os.path.abspath(score_problem_relative_path)).as_uri() }, } return test_paths if __name__ == '__main__': # Creating parser parser = argparse.ArgumentParser(description="Test from command line") configure_parser(parser) arguments = parser.parse_args() # Getting test root path test_path = arguments.test_path # Getting test paths train/test/score test_paths = get_paths(test_path) # Getting problem id test_id = get_problem_id(test_paths['TEST']['problem']) print_name('Starting Test: ' + test_id) run(test_paths, None) print_name('Finishing Test: ' + test_id)