From e4ee3efeb89f24762baa2758a23962fb544e6df1 Mon Sep 17 00:00:00 2001 From: stellahsr Date: Thu, 14 Dec 2023 10:46:43 +0800 Subject: [PATCH 01/23] =?UTF-8?q?update:=20=E6=8C=89code=20step=20?= =?UTF-8?q?=E9=80=90=E4=B8=80=E7=94=9F=E6=88=90=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- metagpt/actions/write_analysis_code.py | 30 ++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/metagpt/actions/write_analysis_code.py b/metagpt/actions/write_analysis_code.py index 3e91f4b14..1cfc28811 100644 --- a/metagpt/actions/write_analysis_code.py +++ b/metagpt/actions/write_analysis_code.py @@ -202,8 +202,34 @@ class WriteCodeWithTools(BaseWriteAnalysisCode): module_name=module_name, tool_catalog=tool_catalog, ) - - + code_steps_ = eval(code_steps) + print(code_steps_) + + new_code = "" + tool_context = "" + for idx, (step_id, step_instruction) in enumerate(code_steps_.items()): + prompt = TOOL_USAGE_PROMPT.format( + user_requirement=plan.goal, + history_code=code_context, + current_task=plan.current_task.instruction, + column_info=column_info, + special_prompt=special_prompt, + code_steps=step_instruction, + module_name=module_name, + tool_catalog=tool_catalog, + ) + + tool_config = create_func_config(CODE_GENERATOR_WITH_TOOLS) + + rsp = await self.llm.aask_code(prompt, **tool_config) + logger.info(f"rsp is: {rsp}") + new_code = new_code + "\n\n" + rsp["code"] + code_context = code_context + "\n\n" + new_code + tool_context = tool_context + "\n\n" + prompt + context = [Message(content=tool_context, role="user")] + return context, new_code + + else: prompt = GENERATE_CODE_PROMPT.format( user_requirement=plan.goal, From 31bd653f07a3d974ef163bfaf9f89e9cb133da9e Mon Sep 17 00:00:00 2001 From: stellahsr Date: Thu, 14 Dec 2023 10:47:05 +0800 Subject: [PATCH 02/23] =?UTF-8?q?update:=20=E5=8E=BB=E9=99=A4=E5=9B=9E?= =?UTF-8?q?=E8=BD=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- metagpt/actions/write_code_steps.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/metagpt/actions/write_code_steps.py b/metagpt/actions/write_code_steps.py index 9e06bc91e..89bf8980f 100644 --- a/metagpt/actions/write_code_steps.py +++ b/metagpt/actions/write_code_steps.py @@ -106,7 +106,7 @@ class WriteCodeSteps(Action): def process_task(task): task_dict = task.dict() # ptask = {k: task_dict[k] for k in task_dict if k in select_task_keys } - ptask = f"task_id_{task_dict['task_id']}:{task_dict['instruction']}\n" + ptask = f"task_id_{task_dict['task_id']}:{task_dict['instruction']}" return ptask From 41e872a8c0cee55c81fefeb82f737ce1210721c6 Mon Sep 17 00:00:00 2001 From: stellahsr Date: Thu, 14 Dec 2023 10:47:47 +0800 Subject: [PATCH 03/23] =?UTF-8?q?update:=20=E6=9B=B4=E6=96=B0prompt?= =?UTF-8?q?=EF=BC=8C=E7=BB=99=E5=87=BA=E5=8D=95step-code=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- metagpt/prompts/ml_engineer.py | 20 ++++++++++++++++++-- metagpt/roles/ml_engineer.py | 18 +++++++++++------- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/metagpt/prompts/ml_engineer.py b/metagpt/prompts/ml_engineer.py index 2d2d3315a..ae6938ee0 100644 --- a/metagpt/prompts/ml_engineer.py +++ b/metagpt/prompts/ml_engineer.py @@ -208,8 +208,10 @@ Follow steps below when you writing code if it's convenient. Each Class tool is described in JSON format. When you call it, import the tool from `{module_name}` first. {tool_catalog} -# Output Example: -For "fill missing value and handle outliers", the output code be like when there are training data and test data: +# Step Example: +Here is a coding example for each code step: +[Step 1]: Handle missing values by imputing or dropping them. For numerical columns, use median or mean imputation +[Code] ```python # Tools used: ['FillMissingValue'] from metagpt.tools.functions.libs.data_preprocess import FillMissingValue @@ -227,12 +229,26 @@ for col in num_cols: train_processed[col] = train_processed[col].clip(low, high) test_processed[col] = test_processed[col].clip(low, high) ```end +[Step 2]: xxx +[Code]: +```python +# Tools used: [xxx] +from metagpt.tools.functions.libs.xxx import +```end +[Step 3]: xxx +[Code]: +```python +# Tools used: [xxx] +from metagpt.tools.functions.libs.xxx import +```end # Constraints: - Prioritize using pre-defined tools for the same functionality. - Copy DataFrame before processing if needed. +- Strictly follow the code steps to write code """ #- If 'Code Steps' contains step done in 'Done Tasks', such as reading data, don't repeat it. +#For "fill missing value and handle outliers", the output code be like when there are training data and test data: DATA_PREPROCESS_PROMPT = """ The current task is about data preprocessing, please note the following: diff --git a/metagpt/roles/ml_engineer.py b/metagpt/roles/ml_engineer.py index c735eb983..357fdbe09 100644 --- a/metagpt/roles/ml_engineer.py +++ b/metagpt/roles/ml_engineer.py @@ -33,14 +33,13 @@ STRUCTURAL_CONTEXT = """ ## Current Task {current_task} ## Packages Installed -scikit-learn pandas numpy -lightgbm -xgboost -catboost """ - +# scikit-learn +# lightgbm +# xgboost +# catboost def truncate(result: str, keep_len: int = 1000) -> str: desc = "Truncated to show only the last 1000 characters\n" @@ -290,11 +289,16 @@ if __name__ == "__main__": # requirement = "Perform data analysis on the provided data. Train a model to predict the target variable Survived. Include data preprocessing, feature engineering, and modeling in your pipeline. The metric is accuracy." - data_path = f"{DATA_PATH}/titanic" - requirement = f"This is a titanic passenger survival dataset, your goal is to predict passenger survival outcome. The target column is Survived. Perform data analysis, data preprocessing, feature engineering, and modeling to predict the target. Report accuracy on the eval data. Train data path: '{data_path}/split_train.csv', eval data path: '{data_path}/split_eval.csv'." + # data_path = f"{DATA_PATH}/titanic" + # requirement = f"This is a titanic passenger survival dataset, your goal is to predict passenger survival outcome. The target column is Survived. Perform data analysis, data preprocessing, feature engineering, and modeling to predict the target. Report accuracy on the eval data. Train data path: '{data_path}/split_train.csv', eval data path: '{data_path}/split_eval.csv'." # requirement = f"Run data analysis on sklearn Wine recognition dataset, include a plot, and train a model to predict wine class (20% as validation), and show validation accuracy" # data_path = f"{DATA_PATH}/icr-identify-age-related-conditions" # requirement = f"This is a medical dataset with over fifty anonymized health characteristics linked to three age-related conditions. Your goal is to predict whether a subject has or has not been diagnosed with one of these conditions.The target column is Class. Perform data analysis, data preprocessing, feature engineering, and modeling to predict the target. Report f1 score on the eval data. Train data path: {data_path}/split_train.csv, eval data path: {data_path}/split_eval.csv." + # data_path = f"{DATA_PATH}/house-prices-advanced-regression-techniques" + # requirement = f"This is a house price dataset, your goal is to predict the sale price of a property based on its features. The target column is SalePrice. Perform data analysis, data preprocessing, feature engineering, and modeling to predict the target. Report RMSE between the logarithm of the predicted value and the logarithm of the observed sales price on the eval data. Train data path: '{data_path}/split_train.csv', eval data path: '{data_path}/split_eval.csv'." + + data_path = f"{DATA_PATH}/santander-customer-transaction-prediction" + requirement = f"This is a customers financial dataset. Your goal is to predict which customers will make a specific transaction in the future. The target column is target. Perform data analysis, data preprocessing, feature engineering, and modeling to predict the target. Report F1 Score on the eval data. Train data path: '{data_path}/split_train.csv', eval data path: '{data_path}/split_eval.csv' ." async def main(requirement: str = requirement, auto_run: bool = True): role = MLEngineer(goal=requirement, auto_run=auto_run) await role.run(requirement) From 70fdb1905f8b6a615b4557cc9278454381d26983 Mon Sep 17 00:00:00 2001 From: stellahsr Date: Thu, 14 Dec 2023 15:33:00 +0800 Subject: [PATCH 04/23] =?UTF-8?q?=E6=9B=B4=E6=96=B0=EF=BC=9A=E4=BF=AE?= =?UTF-8?q?=E6=94=B9execute=5Fcode=20=E5=88=9D=E5=A7=8B=E5=8C=96=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0resume=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- metagpt/actions/execute_code.py | 8 ++- metagpt/roles/ml_engineer.py | 119 ++++++++++++++++++++++++++------ 2 files changed, 102 insertions(+), 25 deletions(-) diff --git a/metagpt/actions/execute_code.py b/metagpt/actions/execute_code.py index 6fd980494..54d2cf348 100644 --- a/metagpt/actions/execute_code.py +++ b/metagpt/actions/execute_code.py @@ -45,9 +45,12 @@ class ExecuteCode(ABC): class ExecutePyCode(ExecuteCode, Action): """execute code, return result to llm, and display it.""" - def __init__(self, name: str = "python_executor", context=None, llm=None): + def __init__(self, name: str = "python_executor", context=None, llm=None, nb=None): super().__init__(name, context, llm) - self.nb = nbformat.v4.new_notebook() + if nb is None: + self.nb = nbformat.v4.new_notebook() + else: + self.nb = nb self.nb_client = NotebookClient(self.nb) self.console = Console() self.interaction = "ipython" if self.is_ipython() else "terminal" @@ -158,6 +161,7 @@ class ExecutePyCode(ExecuteCode, Action): def save_notebook(self, path: str): path = Path(path) + print(path) path.parent.mkdir(parents=True, exist_ok=True) nbformat.write(self.nb, path) diff --git a/metagpt/roles/ml_engineer.py b/metagpt/roles/ml_engineer.py index 357fdbe09..e8b0bda16 100644 --- a/metagpt/roles/ml_engineer.py +++ b/metagpt/roles/ml_engineer.py @@ -4,7 +4,8 @@ from datetime import datetime from typing import List import fire -import pandas as pd +import nbformat +from pathlib import Path from metagpt.actions import Action from metagpt.actions.execute_code import ExecutePyCode @@ -36,6 +37,8 @@ STRUCTURAL_CONTEXT = """ pandas numpy """ + + # scikit-learn # lightgbm # xgboost @@ -129,17 +132,18 @@ class MLEngineer(Role): task.code_steps = code_steps self.plan.finish_current_task() self.working_memory.clear() - + success, new_code = await self._update_data_columns() if success: task.code = task.code + "\n\n" + new_code + else: # update plan according to user's feedback and to take on changed tasks await self._update_plan() - + time = datetime.now().strftime('%Y-%m-%d_%H-%M-%S') self.execute_code.save_notebook(f"{DATA_PATH}/notebooks/ml_{time}.ipynb") - + async def _update_data_columns(self): rsp = await UpdateDataColumns().run(self.plan) is_update, code = rsp["is_update"], rsp["code"] @@ -149,7 +153,7 @@ class MLEngineer(Role): if success: self.data_desc["column_info"] = result return success, code - + async def _write_and_exec_code(self, max_retry: int = 3): code_steps = ( await WriteCodeSteps().run(self.plan) @@ -162,23 +166,15 @@ class MLEngineer(Role): success = False debug_context = [] - finished_tasks = self.plan.get_finished_tasks() - code_context = [task.code for task in finished_tasks] - code_result = [task.result for task in finished_tasks] - code_context = "\n\n".join(code_context) - code_result = "\n\n".join(code_result) - while not success and counter < max_retry: context = self.get_useful_memories() - + if counter > 0: improve_code = await DebugCode().run(plan=self.plan.current_task.instruction, - # finished_code=code_context, - # finished_code_result=code_result, code=code, runtime_result=self.working_memory.get(), context=debug_context) - + if improve_code != "": code = improve_code logger.info(f"new code \n{improve_code}") @@ -217,7 +213,7 @@ class MLEngineer(Role): ) if "!pip" in code: - success = False + success = False # if not success: # await self._ask_review() @@ -294,14 +290,91 @@ if __name__ == "__main__": # requirement = f"Run data analysis on sklearn Wine recognition dataset, include a plot, and train a model to predict wine class (20% as validation), and show validation accuracy" # data_path = f"{DATA_PATH}/icr-identify-age-related-conditions" # requirement = f"This is a medical dataset with over fifty anonymized health characteristics linked to three age-related conditions. Your goal is to predict whether a subject has or has not been diagnosed with one of these conditions.The target column is Class. Perform data analysis, data preprocessing, feature engineering, and modeling to predict the target. Report f1 score on the eval data. Train data path: {data_path}/split_train.csv, eval data path: {data_path}/split_eval.csv." - # data_path = f"{DATA_PATH}/house-prices-advanced-regression-techniques" - # requirement = f"This is a house price dataset, your goal is to predict the sale price of a property based on its features. The target column is SalePrice. Perform data analysis, data preprocessing, feature engineering, and modeling to predict the target. Report RMSE between the logarithm of the predicted value and the logarithm of the observed sales price on the eval data. Train data path: '{data_path}/split_train.csv', eval data path: '{data_path}/split_eval.csv'." - data_path = f"{DATA_PATH}/santander-customer-transaction-prediction" - requirement = f"This is a customers financial dataset. Your goal is to predict which customers will make a specific transaction in the future. The target column is target. Perform data analysis, data preprocessing, feature engineering, and modeling to predict the target. Report F1 Score on the eval data. Train data path: '{data_path}/split_train.csv', eval data path: '{data_path}/split_eval.csv' ." - async def main(requirement: str = requirement, auto_run: bool = True): - role = MLEngineer(goal=requirement, auto_run=auto_run) - await role.run(requirement) + data_path = f"{DATA_PATH}/house-prices-advanced-regression-techniques" + requirement = f"This is a house price dataset, your goal is to predict the sale price of a property based on its features. The target column is SalePrice. Perform data analysis, data preprocessing, feature engineering, and modeling to predict the target. Report RMSE between the logarithm of the predicted value and the logarithm of the observed sales price on the eval data. Train data path: '{data_path}/split_train.csv', eval data path: '{data_path}/split_eval.csv'." + # data_path = f"{DATA_PATH}/santander-customer-transaction-prediction" + # requirement = f"This is a customers financial dataset. Your goal is to predict which customers will make a specific transaction in the future. The target column is target. Perform data analysis, data preprocessing, feature engineering, and modeling to predict the target. Report F1 Score on the eval data. Train data path: '{data_path}/split_train.csv', eval data path: '{data_path}/split_eval.csv' ." + + + save_dir = "" + save_dir = DATA_PATH / "save" / "2023-12-14_15-11-40" + + + def load_history(save_dir: str = save_dir): + """ + Load history from the specified save directory. + + Args: + save_dir (str): The directory from which to load the history. + + Returns: + Tuple: A tuple containing the loaded plan and notebook. + """ + + plan_path = Path(save_dir) / "plan.json" + nb_path = Path(save_dir) / "history_nb.ipynb" + plan = json.load(open(plan_path, "r", encoding="utf-8")) + nb = nbformat.read(open(nb_path, "r", encoding="utf-8"), as_version=nbformat.NO_CONVERT) + return plan, nb + + + async def save_history(role: Role = MLEngineer, save_dir: str = save_dir): + """ + Save history to the specified directory. + + Args: + role (Role): The role containing the plan and execute_code attributes. + save_dir (str): The directory to save the history. + + Returns: + Path: The path to the saved history directory. + """ + save_path = Path(save_dir) if save_dir else DATA_PATH / "save" / datetime.now().strftime( + '%Y-%m-%d_%H-%M-%S') + # overwrite + save_path.mkdir(parents=True, exist_ok=True) + + plan = role.plan.dict() + logger.info(f"Plan is {plan}") + + with open(save_path / "plan.json", "w", encoding="utf-8") as plan_file: + json.dump(plan, plan_file, indent=4, ensure_ascii=False) + + role.execute_code.save_notebook(path=save_path / "history_nb.ipynb") + return save_path + + + async def main(requirement: str = requirement, auto_run: bool = True, save_dir: str = save_dir): + """ + The main function to run the MLEngineer with optional history loading. + + Args: + requirement (str): The requirement for the MLEngineer. + auto_run (bool): Whether to auto-run the MLEngineer. + save_dir (str): The directory from which to load the history or to save the new history. + + Raises: + Exception: If an error occurs during execution, log the error and save the history. + """ + if save_dir: + logger.info("Resuming from history trajectory") + plan, nb = load_history(save_dir) + role = MLEngineer(goal=requirement, auto_run=auto_run) + role.plan = Plan(**plan) + role.execute_code = ExecutePyCode(nb) + import pdb;pdb.set_trace() + else: + logger.info("Run from scratch") + role = MLEngineer(goal=requirement, auto_run=auto_run) + + try: + await role.run(requirement) + except Exception as e: + + save_path = await save_history(role, save_dir) + + logger.exception(f"An error occurred: {e}, save trajectory here: {save_path}") fire.Fire(main) From 9d046a7ce570f65b01d9732b5651ea3584e23b4f Mon Sep 17 00:00:00 2001 From: stellahsr Date: Thu, 14 Dec 2023 15:48:00 +0800 Subject: [PATCH 05/23] rm runtime result --- .../catboost_info/catboost_training.json | 1004 ----------------- .../catboost_info/learn/events.out.tfevents | Bin 54870 -> 0 bytes metagpt/roles/catboost_info/learn_error.tsv | 1001 ---------------- metagpt/roles/catboost_info/time_left.tsv | 1001 ---------------- 4 files changed, 3006 deletions(-) delete mode 100644 metagpt/roles/catboost_info/catboost_training.json delete mode 100644 metagpt/roles/catboost_info/learn/events.out.tfevents delete mode 100644 metagpt/roles/catboost_info/learn_error.tsv delete mode 100644 metagpt/roles/catboost_info/time_left.tsv diff --git a/metagpt/roles/catboost_info/catboost_training.json b/metagpt/roles/catboost_info/catboost_training.json deleted file mode 100644 index 68f95dbe6..000000000 --- a/metagpt/roles/catboost_info/catboost_training.json +++ /dev/null @@ -1,1004 +0,0 @@ -{ -"meta":{"test_sets":[],"test_metrics":[],"learn_metrics":[{"best_value":"Min","name":"Logloss"}],"launch_mode":"Train","parameters":"","iteration_count":1000,"learn_sets":["learn"],"name":"experiment"}, -"iterations":[ -{"learn":[0.6882514366],"iteration":0,"passed_time":0.2209602877,"remaining_time":220.7393274}, -{"learn":[0.6847159377],"iteration":1,"passed_time":0.2329893569,"remaining_time":116.2616891}, -{"learn":[0.6795580406],"iteration":2,"passed_time":0.25602594,"remaining_time":85.08595405}, -{"learn":[0.6750537284],"iteration":3,"passed_time":0.2782187523,"remaining_time":69.27646932}, -{"learn":[0.6699312491],"iteration":4,"passed_time":0.2999463484,"remaining_time":59.68932333}, -{"learn":[0.6650724516],"iteration":5,"passed_time":0.3218397014,"remaining_time":53.31811054}, -{"learn":[0.6606555729],"iteration":6,"passed_time":0.3459084069,"remaining_time":49.06957829}, -{"learn":[0.6561724634],"iteration":7,"passed_time":0.3679667854,"remaining_time":45.62788139}, -{"learn":[0.6519794747],"iteration":8,"passed_time":0.3899457437,"remaining_time":42.93735911}, -{"learn":[0.6492472012],"iteration":9,"passed_time":0.4007993018,"remaining_time":39.67913088}, -{"learn":[0.6446640682],"iteration":10,"passed_time":0.4235608008,"remaining_time":38.08196655}, -{"learn":[0.6400603726],"iteration":11,"passed_time":0.4457455009,"remaining_time":36.69971291}, -{"learn":[0.637483839],"iteration":12,"passed_time":0.4554558546,"remaining_time":34.57960988}, -{"learn":[0.6334773178],"iteration":13,"passed_time":0.4733180286,"remaining_time":33.33511259}, -{"learn":[0.6286841787],"iteration":14,"passed_time":0.4951142595,"remaining_time":32.51250304}, -{"learn":[0.6262362324],"iteration":15,"passed_time":0.506736055,"remaining_time":31.16426738}, -{"learn":[0.6227706725],"iteration":16,"passed_time":0.5269891476,"remaining_time":30.47237247}, -{"learn":[0.618564194],"iteration":17,"passed_time":0.5488836139,"remaining_time":29.94465049}, -{"learn":[0.6154841122],"iteration":18,"passed_time":0.5635392104,"remaining_time":29.09641923}, -{"learn":[0.6112592312],"iteration":19,"passed_time":0.5852540048,"remaining_time":28.67744624}, -{"learn":[0.6077881571],"iteration":20,"passed_time":0.6073336225,"remaining_time":28.31331507}, -{"learn":[0.6037553183],"iteration":21,"passed_time":0.6292302093,"remaining_time":27.97214294}, -{"learn":[0.6006649251],"iteration":22,"passed_time":0.6456397926,"remaining_time":27.42565554}, -{"learn":[0.5975849834],"iteration":23,"passed_time":0.6645987882,"remaining_time":27.02701739}, -{"learn":[0.5940831045],"iteration":24,"passed_time":0.6864422193,"remaining_time":26.77124655}, -{"learn":[0.5916771489],"iteration":25,"passed_time":0.7039365724,"remaining_time":26.37054698}, -{"learn":[0.5894338237],"iteration":26,"passed_time":0.7168747032,"remaining_time":25.83404023}, -{"learn":[0.5875190394],"iteration":27,"passed_time":0.7261948992,"remaining_time":25.20933721}, -{"learn":[0.5844895773],"iteration":28,"passed_time":0.7450785696,"remaining_time":24.9472859}, -{"learn":[0.5810267327],"iteration":29,"passed_time":0.7672816003,"remaining_time":24.80877174}, -{"learn":[0.5778936903],"iteration":30,"passed_time":0.7890965402,"remaining_time":24.66563056}, -{"learn":[0.576124503],"iteration":31,"passed_time":0.7996305702,"remaining_time":24.18882475}, -{"learn":[0.5735057785],"iteration":32,"passed_time":0.8142960813,"remaining_time":23.86134275}, -{"learn":[0.570293767],"iteration":33,"passed_time":0.8360974032,"remaining_time":23.75500269}, -{"learn":[0.5672457801],"iteration":34,"passed_time":0.8581203558,"remaining_time":23.6596041}, -{"learn":[0.5649423522],"iteration":35,"passed_time":0.8765849625,"remaining_time":23.47299733}, -{"learn":[0.5615275613],"iteration":36,"passed_time":0.9024578152,"remaining_time":23.48829395}, -{"learn":[0.5581402135],"iteration":37,"passed_time":0.9273196032,"remaining_time":23.47582785}, -{"learn":[0.555577741],"iteration":38,"passed_time":0.9458885498,"remaining_time":23.30766401}, -{"learn":[0.5523266666],"iteration":39,"passed_time":0.9682634562,"remaining_time":23.23832295}, -{"learn":[0.5508561568],"iteration":40,"passed_time":0.9762371787,"remaining_time":22.83442572}, -{"learn":[0.5487373589],"iteration":41,"passed_time":0.9944226088,"remaining_time":22.68230617}, -{"learn":[0.5460358061],"iteration":42,"passed_time":1.017613209,"remaining_time":22.64781026}, -{"learn":[0.5429618153],"iteration":43,"passed_time":1.039705016,"remaining_time":22.58995444}, -{"learn":[0.5411169242],"iteration":44,"passed_time":1.058342618,"remaining_time":22.46038223}, -{"learn":[0.5389150372],"iteration":45,"passed_time":1.080413363,"remaining_time":22.40683365}, -{"learn":[0.5364783846],"iteration":46,"passed_time":1.102740504,"remaining_time":22.3598234}, -{"learn":[0.534124059],"iteration":47,"passed_time":1.117903644,"remaining_time":22.17175561}, -{"learn":[0.5307002414],"iteration":48,"passed_time":1.140720347,"remaining_time":22.13928674}, -{"learn":[0.5289874066],"iteration":49,"passed_time":1.176629736,"remaining_time":22.35596498}, -{"learn":[0.5263977673],"iteration":50,"passed_time":1.206713737,"remaining_time":22.45433992}, -{"learn":[0.5243808354],"iteration":51,"passed_time":1.229893513,"remaining_time":22.42190481}, -{"learn":[0.5226468558],"iteration":52,"passed_time":1.251654021,"remaining_time":22.36445959}, -{"learn":[0.5205374561],"iteration":53,"passed_time":1.277702019,"remaining_time":22.38344648}, -{"learn":[0.5184600522],"iteration":54,"passed_time":1.300474793,"remaining_time":22.34452145}, -{"learn":[0.5161120982],"iteration":55,"passed_time":1.32256994,"remaining_time":22.29475042}, -{"learn":[0.5135670428],"iteration":56,"passed_time":1.345110102,"remaining_time":22.25331274}, -{"learn":[0.5117345666],"iteration":57,"passed_time":1.367616671,"remaining_time":22.21198111}, -{"learn":[0.5103042276],"iteration":58,"passed_time":1.379228529,"remaining_time":21.99752619}, -{"learn":[0.5088685224],"iteration":59,"passed_time":1.393836981,"remaining_time":21.83677937}, -{"learn":[0.5069392613],"iteration":60,"passed_time":1.420003792,"remaining_time":21.85874689}, -{"learn":[0.5058379484],"iteration":61,"passed_time":1.434821217,"remaining_time":21.70745648}, -{"learn":[0.504071849],"iteration":62,"passed_time":1.450886544,"remaining_time":21.57905859}, -{"learn":[0.5026509319],"iteration":63,"passed_time":1.470451497,"remaining_time":21.50535314}, -{"learn":[0.5013652681],"iteration":64,"passed_time":1.485685519,"remaining_time":21.37101477}, -{"learn":[0.4990494982],"iteration":65,"passed_time":1.507402942,"remaining_time":21.33203558}, -{"learn":[0.4975801239],"iteration":66,"passed_time":1.529043474,"remaining_time":21.29250091}, -{"learn":[0.4954073892],"iteration":67,"passed_time":1.55148063,"remaining_time":21.26441099}, -{"learn":[0.4937794274],"iteration":68,"passed_time":1.573374258,"remaining_time":21.22915121}, -{"learn":[0.4917253363],"iteration":69,"passed_time":1.595265697,"remaining_time":21.19424426}, -{"learn":[0.4897655824],"iteration":70,"passed_time":1.617828232,"remaining_time":21.16848489}, -{"learn":[0.4881025387],"iteration":71,"passed_time":1.63997141,"remaining_time":21.13740929}, -{"learn":[0.4855490154],"iteration":72,"passed_time":1.668328528,"remaining_time":21.18548693}, -{"learn":[0.4839406321],"iteration":73,"passed_time":1.694200638,"remaining_time":21.20040257}, -{"learn":[0.4825486397],"iteration":74,"passed_time":1.714501822,"remaining_time":21.14552248}, -{"learn":[0.4806147512],"iteration":75,"passed_time":1.74069548,"remaining_time":21.16319241}, -{"learn":[0.4790772126],"iteration":76,"passed_time":1.76355628,"remaining_time":21.13977203}, -{"learn":[0.4783791778],"iteration":77,"passed_time":1.771777779,"remaining_time":20.94332195}, -{"learn":[0.476922228],"iteration":78,"passed_time":1.789701952,"remaining_time":20.86475313}, -{"learn":[0.4757319459],"iteration":79,"passed_time":1.811825511,"remaining_time":20.83599338}, -{"learn":[0.4742068644],"iteration":80,"passed_time":1.833878171,"remaining_time":20.80659308}, -{"learn":[0.4726812191],"iteration":81,"passed_time":1.855740771,"remaining_time":20.77524424}, -{"learn":[0.4710468444],"iteration":82,"passed_time":1.877655908,"remaining_time":20.74470443}, -{"learn":[0.4693673381],"iteration":83,"passed_time":1.899915651,"remaining_time":20.71812782}, -{"learn":[0.4676818392],"iteration":84,"passed_time":1.929145481,"remaining_time":20.76668371}, -{"learn":[0.4657056761],"iteration":85,"passed_time":1.951233566,"remaining_time":20.73752883}, -{"learn":[0.4642140634],"iteration":86,"passed_time":1.969771174,"remaining_time":20.6712768}, -{"learn":[0.4632998746],"iteration":87,"passed_time":1.991742157,"remaining_time":20.64169144}, -{"learn":[0.4622314595],"iteration":88,"passed_time":2.014152311,"remaining_time":20.61677254}, -{"learn":[0.460592481],"iteration":89,"passed_time":2.036215085,"remaining_time":20.58839697}, -{"learn":[0.4593241639],"iteration":90,"passed_time":2.058798714,"remaining_time":20.56536298}, -{"learn":[0.4584569869],"iteration":91,"passed_time":2.073992457,"remaining_time":20.46940381}, -{"learn":[0.4577605438],"iteration":92,"passed_time":2.085384355,"remaining_time":20.33810334}, -{"learn":[0.4561556633],"iteration":93,"passed_time":2.107586742,"remaining_time":20.31354881}, -{"learn":[0.4554982999],"iteration":94,"passed_time":2.119182321,"remaining_time":20.188}, -{"learn":[0.4545744958],"iteration":95,"passed_time":2.137405105,"remaining_time":20.1272314}, -{"learn":[0.4540947284],"iteration":96,"passed_time":2.145521477,"remaining_time":19.97325664}, -{"learn":[0.4540085087],"iteration":97,"passed_time":2.150456003,"remaining_time":19.7929726}, -{"learn":[0.4531926189],"iteration":98,"passed_time":2.164042187,"remaining_time":19.6949698}, -{"learn":[0.4527317281],"iteration":99,"passed_time":2.176278456,"remaining_time":19.5865061}, -{"learn":[0.4519466344],"iteration":100,"passed_time":2.196543022,"remaining_time":19.55140769}, -{"learn":[0.450688372],"iteration":101,"passed_time":2.226552191,"remaining_time":19.60239085}, -{"learn":[0.4488322057],"iteration":102,"passed_time":2.2501016,"remaining_time":19.595545}, -{"learn":[0.4478782417],"iteration":103,"passed_time":2.272366787,"remaining_time":19.57731386}, -{"learn":[0.4468232543],"iteration":104,"passed_time":2.294253479,"remaining_time":19.55577965}, -{"learn":[0.4457592303],"iteration":105,"passed_time":2.316373853,"remaining_time":19.53620967}, -{"learn":[0.4447781675],"iteration":106,"passed_time":2.334811885,"remaining_time":19.48585994}, -{"learn":[0.4438522903],"iteration":107,"passed_time":2.36016004,"remaining_time":19.49317366}, -{"learn":[0.4430406598],"iteration":108,"passed_time":2.375441273,"remaining_time":19.41759793}, -{"learn":[0.4420804721],"iteration":109,"passed_time":2.397764964,"remaining_time":19.40009835}, -{"learn":[0.4413288303],"iteration":110,"passed_time":2.431630964,"remaining_time":19.47495429}, -{"learn":[0.4406769097],"iteration":111,"passed_time":2.448104093,"remaining_time":19.40996816}, -{"learn":[0.439927404],"iteration":112,"passed_time":2.471054306,"remaining_time":19.39668291}, -{"learn":[0.4387131738],"iteration":113,"passed_time":2.493169175,"remaining_time":19.37673587}, -{"learn":[0.4379161685],"iteration":114,"passed_time":2.515201611,"remaining_time":19.35611674}, -{"learn":[0.4368122477],"iteration":115,"passed_time":2.536876581,"remaining_time":19.33274912}, -{"learn":[0.4363066446],"iteration":116,"passed_time":2.558814198,"remaining_time":19.31139262}, -{"learn":[0.4352350106],"iteration":117,"passed_time":2.580710273,"remaining_time":19.28971577}, -{"learn":[0.4340016567],"iteration":118,"passed_time":2.602677388,"remaining_time":19.26856117}, -{"learn":[0.4332395033],"iteration":119,"passed_time":2.625437408,"remaining_time":19.25320766}, -{"learn":[0.4323511556],"iteration":120,"passed_time":2.650764059,"remaining_time":19.25637692}, -{"learn":[0.4316166781],"iteration":121,"passed_time":2.686256274,"remaining_time":19.33223778}, -{"learn":[0.4304510199],"iteration":122,"passed_time":2.712823213,"remaining_time":19.34265007}, -{"learn":[0.4297836948],"iteration":123,"passed_time":2.744805133,"remaining_time":19.39072014}, -{"learn":[0.4286476712],"iteration":124,"passed_time":2.819134566,"remaining_time":19.73394196}, -{"learn":[0.4281044323],"iteration":125,"passed_time":2.83375925,"remaining_time":19.65639353}, -{"learn":[0.4277452421],"iteration":126,"passed_time":2.851695114,"remaining_time":19.60259712}, -{"learn":[0.4268564678],"iteration":127,"passed_time":2.873147663,"remaining_time":19.57331846}, -{"learn":[0.4262834378],"iteration":128,"passed_time":2.894895865,"remaining_time":19.54615735}, -{"learn":[0.4255606014],"iteration":129,"passed_time":2.917059119,"remaining_time":19.52185718}, -{"learn":[0.4252233113],"iteration":130,"passed_time":2.937915636,"remaining_time":19.48892128}, -{"learn":[0.424750709],"iteration":131,"passed_time":2.956196683,"remaining_time":19.43923273}, -{"learn":[0.4237267015],"iteration":132,"passed_time":2.978141095,"remaining_time":19.41389721}, -{"learn":[0.4229110275],"iteration":133,"passed_time":3.000071725,"remaining_time":19.38852324}, -{"learn":[0.4226882753],"iteration":134,"passed_time":3.011578793,"remaining_time":19.29641227}, -{"learn":[0.4220238002],"iteration":135,"passed_time":3.029874756,"remaining_time":19.24861609}, -{"learn":[0.4216236205],"iteration":136,"passed_time":3.044691237,"remaining_time":19.17933239}, -{"learn":[0.4213023831],"iteration":137,"passed_time":3.059441462,"remaining_time":19.1104242}, -{"learn":[0.4205216151],"iteration":138,"passed_time":3.081243821,"remaining_time":19.08597792}, -{"learn":[0.4202240166],"iteration":139,"passed_time":3.099524481,"remaining_time":19.0399361}, -{"learn":[0.4192685081],"iteration":140,"passed_time":3.121315434,"remaining_time":19.01567346}, -{"learn":[0.4183050279],"iteration":141,"passed_time":3.143410659,"remaining_time":18.99328412}, -{"learn":[0.4173978005],"iteration":142,"passed_time":3.165354005,"remaining_time":18.96998868}, -{"learn":[0.4162954182],"iteration":143,"passed_time":3.195654275,"remaining_time":18.9963893}, -{"learn":[0.415992639],"iteration":144,"passed_time":3.220638215,"remaining_time":18.99065982}, -{"learn":[0.4157126501],"iteration":145,"passed_time":3.240805289,"remaining_time":18.95649121}, -{"learn":[0.4155852885],"iteration":146,"passed_time":3.249262286,"remaining_time":18.85456279}, -{"learn":[0.4148007449],"iteration":147,"passed_time":3.271747229,"remaining_time":18.83465297}, -{"learn":[0.4145476092],"iteration":148,"passed_time":3.289985958,"remaining_time":18.79045671}, -{"learn":[0.4139132529],"iteration":149,"passed_time":3.312792785,"remaining_time":18.77249245}, -{"learn":[0.4134843771],"iteration":150,"passed_time":3.32803032,"remaining_time":18.71190558}, -{"learn":[0.4124055164],"iteration":151,"passed_time":3.350009767,"remaining_time":18.68952817}, -{"learn":[0.412222917],"iteration":152,"passed_time":3.358421193,"remaining_time":18.59204412}, -{"learn":[0.4115787549],"iteration":153,"passed_time":3.380687937,"remaining_time":18.57183113}, -{"learn":[0.411081548],"iteration":154,"passed_time":3.402466212,"remaining_time":18.5489287}, -{"learn":[0.4110031407],"iteration":155,"passed_time":3.411424026,"remaining_time":18.45667871}, -{"learn":[0.4105687169],"iteration":156,"passed_time":3.439257058,"remaining_time":18.46683885}, -{"learn":[0.4095109133],"iteration":157,"passed_time":3.463613233,"remaining_time":18.45798951}, -{"learn":[0.4089787829],"iteration":158,"passed_time":3.485545103,"remaining_time":18.43612221}, -{"learn":[0.4084130488],"iteration":159,"passed_time":3.507325669,"remaining_time":18.41345976}, -{"learn":[0.4077252474],"iteration":160,"passed_time":3.529486341,"remaining_time":18.39278907}, -{"learn":[0.4072843557],"iteration":161,"passed_time":3.548156286,"remaining_time":18.35404301}, -{"learn":[0.4066351535],"iteration":162,"passed_time":3.569884188,"remaining_time":18.3312458}, -{"learn":[0.4063103387],"iteration":163,"passed_time":3.584669678,"remaining_time":18.27307226}, -{"learn":[0.4059185096],"iteration":164,"passed_time":3.599569148,"remaining_time":18.21600144}, -{"learn":[0.4052304697],"iteration":165,"passed_time":3.621153956,"remaining_time":18.1930265}, -{"learn":[0.4050859305],"iteration":166,"passed_time":3.629460067,"remaining_time":18.10383375}, -{"learn":[0.4044742571],"iteration":167,"passed_time":3.65097424,"remaining_time":18.08101529}, -{"learn":[0.4041975026],"iteration":168,"passed_time":3.679528258,"remaining_time":18.0928283}, -{"learn":[0.4035590426],"iteration":169,"passed_time":3.703328795,"remaining_time":18.08095824}, -{"learn":[0.4030297385],"iteration":170,"passed_time":3.728541368,"remaining_time":18.07579412}, -{"learn":[0.4025456368],"iteration":171,"passed_time":3.762066103,"remaining_time":18.11041124}, -{"learn":[0.402334931],"iteration":172,"passed_time":3.773807336,"remaining_time":18.0401079}, -{"learn":[0.401831618],"iteration":173,"passed_time":3.795813183,"remaining_time":18.01920511}, -{"learn":[0.4017743873],"iteration":174,"passed_time":3.807120561,"remaining_time":17.94785407}, -{"learn":[0.4011280658],"iteration":175,"passed_time":3.829251163,"remaining_time":17.92785772}, -{"learn":[0.4005475562],"iteration":176,"passed_time":3.851096112,"remaining_time":17.90650904}, -{"learn":[0.4000603326],"iteration":177,"passed_time":3.883514366,"remaining_time":17.93398207}, -{"learn":[0.3990424765],"iteration":178,"passed_time":3.954211249,"remaining_time":18.13635439}, -{"learn":[0.3987132685],"iteration":179,"passed_time":4.006291434,"remaining_time":18.2508832}, -{"learn":[0.3980735307],"iteration":180,"passed_time":4.04072907,"remaining_time":18.28374093}, -{"learn":[0.3976839336],"iteration":181,"passed_time":4.066100873,"remaining_time":18.27511272}, -{"learn":[0.3970583957],"iteration":182,"passed_time":4.088135325,"remaining_time":18.25140197}, -{"learn":[0.3968093954],"iteration":183,"passed_time":4.109985916,"remaining_time":18.22689406}, -{"learn":[0.3965549511],"iteration":184,"passed_time":4.121652408,"remaining_time":18.1575498}, -{"learn":[0.3961498711],"iteration":185,"passed_time":4.13684245,"remaining_time":18.10424599}, -{"learn":[0.3958574586],"iteration":186,"passed_time":4.158257951,"remaining_time":18.07841558}, -{"learn":[0.3958036693],"iteration":187,"passed_time":4.166355942,"remaining_time":17.99511183}, -{"learn":[0.3954652307],"iteration":188,"passed_time":4.184386925,"remaining_time":17.95522644}, -{"learn":[0.3949970516],"iteration":189,"passed_time":4.215870756,"remaining_time":17.9729227}, -{"learn":[0.3946423615],"iteration":190,"passed_time":4.243567046,"remaining_time":17.97406147}, -{"learn":[0.3937733218],"iteration":191,"passed_time":4.267948498,"remaining_time":17.96094993}, -{"learn":[0.3931025335],"iteration":192,"passed_time":4.290856304,"remaining_time":17.94155978}, -{"learn":[0.3925366206],"iteration":193,"passed_time":4.31302246,"remaining_time":17.91905208}, -{"learn":[0.391865258],"iteration":194,"passed_time":4.33481009,"remaining_time":17.89498524}, -{"learn":[0.3914533348],"iteration":195,"passed_time":4.356400319,"remaining_time":17.87013192}, -{"learn":[0.3912476553],"iteration":196,"passed_time":4.37834033,"remaining_time":17.84673749}, -{"learn":[0.3905329154],"iteration":197,"passed_time":4.400898981,"remaining_time":17.82586355}, -{"learn":[0.3898798389],"iteration":198,"passed_time":4.423174721,"remaining_time":17.80383393}, -{"learn":[0.3891654603],"iteration":199,"passed_time":4.455398968,"remaining_time":17.82159587}, -{"learn":[0.3887747769],"iteration":200,"passed_time":4.477551848,"remaining_time":17.7988255}, -{"learn":[0.3884753081],"iteration":201,"passed_time":4.499497174,"remaining_time":17.77524131}, -{"learn":[0.3877793274],"iteration":202,"passed_time":4.521143304,"remaining_time":17.75049859}, -{"learn":[0.3874664375],"iteration":203,"passed_time":4.543454079,"remaining_time":17.72837964}, -{"learn":[0.3871008215],"iteration":204,"passed_time":4.565293203,"remaining_time":17.70442974}, -{"learn":[0.3865209415],"iteration":205,"passed_time":4.587377641,"remaining_time":17.68144586}, -{"learn":[0.3859273739],"iteration":206,"passed_time":4.609581413,"remaining_time":17.65892783}, -{"learn":[0.3855620818],"iteration":207,"passed_time":4.631576096,"remaining_time":17.63561667}, -{"learn":[0.3851648115],"iteration":208,"passed_time":4.653493816,"remaining_time":17.61202684}, -{"learn":[0.3843406643],"iteration":209,"passed_time":4.675584403,"remaining_time":17.58910323}, -{"learn":[0.3842506785],"iteration":210,"passed_time":4.702482855,"remaining_time":17.58416575}, -{"learn":[0.3840729725],"iteration":211,"passed_time":4.725032901,"remaining_time":17.56285814}, -{"learn":[0.3836865443],"iteration":212,"passed_time":4.759392503,"remaining_time":17.58517324}, -{"learn":[0.3834504777],"iteration":213,"passed_time":4.787775158,"remaining_time":17.58500595}, -{"learn":[0.383221126],"iteration":214,"passed_time":4.810450824,"remaining_time":17.56373906}, -{"learn":[0.382875332],"iteration":215,"passed_time":4.833018275,"remaining_time":17.54206633}, -{"learn":[0.3827132502],"iteration":216,"passed_time":4.854566753,"remaining_time":17.51670861}, -{"learn":[0.3825534206],"iteration":217,"passed_time":4.872745824,"remaining_time":17.47929924}, -{"learn":[0.3821802218],"iteration":218,"passed_time":4.894785533,"remaining_time":17.45583334}, -{"learn":[0.3818052054],"iteration":219,"passed_time":4.916556405,"remaining_time":17.43142725}, -{"learn":[0.3816117561],"iteration":220,"passed_time":4.938252004,"remaining_time":17.40677969}, -{"learn":[0.3812172842],"iteration":221,"passed_time":4.960909917,"remaining_time":17.38553115}, -{"learn":[0.3810255507],"iteration":222,"passed_time":4.988823751,"remaining_time":17.3825832}, -{"learn":[0.3809283758],"iteration":223,"passed_time":5.010867096,"remaining_time":17.3590753}, -{"learn":[0.3808446585],"iteration":224,"passed_time":5.03372608,"remaining_time":17.33838983}, -{"learn":[0.3801708307],"iteration":225,"passed_time":5.055982895,"remaining_time":17.31562284}, -{"learn":[0.3798560036],"iteration":226,"passed_time":5.078222381,"remaining_time":17.29280132}, -{"learn":[0.3794923916],"iteration":227,"passed_time":5.100240524,"remaining_time":17.26923546}, -{"learn":[0.3793373475],"iteration":228,"passed_time":5.121943623,"remaining_time":17.24462242}, -{"learn":[0.3791100641],"iteration":229,"passed_time":5.144086578,"remaining_time":17.22150724}, -{"learn":[0.3786186348],"iteration":230,"passed_time":5.16685425,"remaining_time":17.20048017}, -{"learn":[0.3783799747],"iteration":231,"passed_time":5.20100571,"remaining_time":17.21712235}, -{"learn":[0.3779793355],"iteration":232,"passed_time":5.262317101,"remaining_time":17.32273483}, -{"learn":[0.3777902426],"iteration":233,"passed_time":5.311745138,"remaining_time":17.38802041}, -{"learn":[0.377759024],"iteration":234,"passed_time":5.326918408,"remaining_time":17.3408195}, -{"learn":[0.3775407801],"iteration":235,"passed_time":5.366940659,"remaining_time":17.37433332}, -{"learn":[0.3772180796],"iteration":236,"passed_time":5.410539935,"remaining_time":17.41874249}, -{"learn":[0.3770122934],"iteration":237,"passed_time":5.434735311,"remaining_time":17.40028701}, -{"learn":[0.3765490897],"iteration":238,"passed_time":5.464453118,"remaining_time":17.39936746}, -{"learn":[0.3764835925],"iteration":239,"passed_time":5.490098561,"remaining_time":17.38531211}, -{"learn":[0.3759776808],"iteration":240,"passed_time":5.513007919,"remaining_time":17.36254361}, -{"learn":[0.3757142158],"iteration":241,"passed_time":5.534974237,"remaining_time":17.33682013}, -{"learn":[0.3752871326],"iteration":242,"passed_time":5.556902667,"remaining_time":17.31100954}, -{"learn":[0.3748925461],"iteration":243,"passed_time":5.578824076,"remaining_time":17.28520902}, -{"learn":[0.3746214472],"iteration":244,"passed_time":5.600775557,"remaining_time":17.25953284}, -{"learn":[0.3740866821],"iteration":245,"passed_time":5.622820585,"remaining_time":17.23417366}, -{"learn":[0.3735711811],"iteration":246,"passed_time":5.645061274,"remaining_time":17.20943781}, -{"learn":[0.3732294839],"iteration":247,"passed_time":5.666748819,"remaining_time":17.1830448}, -{"learn":[0.3729683346],"iteration":248,"passed_time":5.678427534,"remaining_time":17.12650232}, -{"learn":[0.3727413457],"iteration":249,"passed_time":5.709521815,"remaining_time":17.12856544}, -{"learn":[0.3723892856],"iteration":250,"passed_time":5.732680933,"remaining_time":17.10668534}, -{"learn":[0.3719863363],"iteration":251,"passed_time":5.758476679,"remaining_time":17.09262125}, -{"learn":[0.3716739793],"iteration":252,"passed_time":5.793914284,"remaining_time":17.10693269}, -{"learn":[0.3716103601],"iteration":253,"passed_time":5.808977588,"remaining_time":17.06101292}, -{"learn":[0.3715319129],"iteration":254,"passed_time":5.827444128,"remaining_time":17.02527794}, -{"learn":[0.371508316],"iteration":255,"passed_time":5.835459561,"remaining_time":16.95930435}, -{"learn":[0.3713832526],"iteration":256,"passed_time":5.847111057,"remaining_time":16.90429383}, -{"learn":[0.3710349299],"iteration":257,"passed_time":5.86851783,"remaining_time":16.87767531}, -{"learn":[0.371030348],"iteration":258,"passed_time":5.873415663,"remaining_time":16.80386489}, -{"learn":[0.3708892154],"iteration":259,"passed_time":5.894554845,"remaining_time":16.77680994}, -{"learn":[0.3705921581],"iteration":260,"passed_time":5.916265404,"remaining_time":16.75141814}, -{"learn":[0.3702244894],"iteration":261,"passed_time":5.938204167,"remaining_time":16.72669723}, -{"learn":[0.3702202347],"iteration":262,"passed_time":5.943096693,"remaining_time":16.65422914}, -{"learn":[0.3698349185],"iteration":263,"passed_time":5.965210221,"remaining_time":16.63028304}, -{"learn":[0.3696711654],"iteration":264,"passed_time":5.983506973,"remaining_time":16.59576462}, -{"learn":[0.3692863237],"iteration":265,"passed_time":6.008756231,"remaining_time":16.58055291}, -{"learn":[0.3690671729],"iteration":266,"passed_time":6.030910934,"remaining_time":16.55677047}, -{"learn":[0.3687581564],"iteration":267,"passed_time":6.053029386,"remaining_time":16.53290116}, -{"learn":[0.3683941859],"iteration":268,"passed_time":6.074786966,"remaining_time":16.50806421}, -{"learn":[0.368050992],"iteration":269,"passed_time":6.096955104,"remaining_time":16.4843601}, -{"learn":[0.3677324616],"iteration":270,"passed_time":6.118732429,"remaining_time":16.45961602}, -{"learn":[0.3674997199],"iteration":271,"passed_time":6.133897356,"remaining_time":16.41719586}, -{"learn":[0.3672484703],"iteration":272,"passed_time":6.155501408,"remaining_time":16.3921228}, -{"learn":[0.3670583272],"iteration":273,"passed_time":6.177355776,"remaining_time":16.3677383}, -{"learn":[0.366936125],"iteration":274,"passed_time":6.196658037,"remaining_time":16.33664392}, -{"learn":[0.3665623609],"iteration":275,"passed_time":6.223489438,"remaining_time":16.32538534}, -{"learn":[0.3663926512],"iteration":276,"passed_time":6.249200888,"remaining_time":16.31109113}, -{"learn":[0.3659325492],"iteration":277,"passed_time":6.275677092,"remaining_time":16.29870094}, -{"learn":[0.3656171802],"iteration":278,"passed_time":6.300903365,"remaining_time":16.28297966}, -{"learn":[0.3654984176],"iteration":279,"passed_time":6.322813287,"remaining_time":16.25866274}, -{"learn":[0.3653075674],"iteration":280,"passed_time":6.344882826,"remaining_time":16.23477136}, -{"learn":[0.3652175898],"iteration":281,"passed_time":6.366618787,"remaining_time":16.21004358}, -{"learn":[0.365164193],"iteration":282,"passed_time":6.374755754,"remaining_time":16.15088295}, -{"learn":[0.3648739127],"iteration":283,"passed_time":6.397192914,"remaining_time":16.12813425}, -{"learn":[0.3648461699],"iteration":284,"passed_time":6.408952603,"remaining_time":16.07860039}, -{"learn":[0.3646301237],"iteration":285,"passed_time":6.430803359,"remaining_time":16.05452307}, -{"learn":[0.3646030346],"iteration":286,"passed_time":6.444636163,"remaining_time":16.01054211}, -{"learn":[0.3644969437],"iteration":287,"passed_time":6.469654901,"remaining_time":15.99442462}, -{"learn":[0.3643646754],"iteration":288,"passed_time":6.495103933,"remaining_time":15.97930414}, -{"learn":[0.3639816129],"iteration":289,"passed_time":6.516903674,"remaining_time":15.95517796}, -{"learn":[0.3636656294],"iteration":290,"passed_time":6.538871352,"remaining_time":15.93147694}, -{"learn":[0.363430258],"iteration":291,"passed_time":6.575359293,"remaining_time":15.94299445}, -{"learn":[0.3632201443],"iteration":292,"passed_time":6.615051101,"remaining_time":15.96191511}, -{"learn":[0.3628359855],"iteration":293,"passed_time":6.65904192,"remaining_time":15.99076053}, -{"learn":[0.3627236518],"iteration":294,"passed_time":6.696672672,"remaining_time":16.00391266}, -{"learn":[0.3622184354],"iteration":295,"passed_time":6.758116653,"remaining_time":16.07335853}, -{"learn":[0.3621264294],"iteration":296,"passed_time":6.787336902,"remaining_time":16.0656493}, -{"learn":[0.3620089934],"iteration":297,"passed_time":6.824504579,"remaining_time":16.0765175}, -{"learn":[0.3618790034],"iteration":298,"passed_time":6.853537324,"remaining_time":16.06799219}, -{"learn":[0.3617399454],"iteration":299,"passed_time":6.877452265,"remaining_time":16.04738862}, -{"learn":[0.3616850281],"iteration":300,"passed_time":6.889464347,"remaining_time":15.99912152}, -{"learn":[0.3613225424],"iteration":301,"passed_time":6.911690035,"remaining_time":15.97470081}, -{"learn":[0.3613077955],"iteration":302,"passed_time":6.919765154,"remaining_time":15.9177436}, -{"learn":[0.3611613922],"iteration":303,"passed_time":6.941101626,"remaining_time":15.89146951}, -{"learn":[0.3606681647],"iteration":304,"passed_time":6.963247586,"remaining_time":15.86707237}, -{"learn":[0.3606662726],"iteration":305,"passed_time":6.971583113,"remaining_time":15.81136824}, -{"learn":[0.3606644378],"iteration":306,"passed_time":6.977915177,"remaining_time":15.75145022}, -{"learn":[0.3601634319],"iteration":307,"passed_time":7.004917362,"remaining_time":15.73832083}, -{"learn":[0.3599344409],"iteration":308,"passed_time":7.027043523,"remaining_time":15.71419765}, -{"learn":[0.3596092344],"iteration":309,"passed_time":7.049369762,"remaining_time":15.6905327}, -{"learn":[0.3595229983],"iteration":310,"passed_time":7.071081586,"remaining_time":15.66551515}, -{"learn":[0.3591048131],"iteration":311,"passed_time":7.093007056,"remaining_time":15.64098992}, -{"learn":[0.3589464226],"iteration":312,"passed_time":7.114835418,"remaining_time":15.61626815}, -{"learn":[0.3588198429],"iteration":313,"passed_time":7.136272187,"remaining_time":15.5907093}, -{"learn":[0.3585066029],"iteration":314,"passed_time":7.1580098,"remaining_time":15.56583083}, -{"learn":[0.3584892118],"iteration":315,"passed_time":7.172922678,"remaining_time":15.52619972}, -{"learn":[0.3580264626],"iteration":316,"passed_time":7.195573733,"remaining_time":15.50339703}, -{"learn":[0.3580001595],"iteration":317,"passed_time":7.207669718,"remaining_time":15.45795833}, -{"learn":[0.3578136454],"iteration":318,"passed_time":7.228151813,"remaining_time":15.4306313}, -{"learn":[0.3576122347],"iteration":319,"passed_time":7.255577239,"remaining_time":15.41810163}, -{"learn":[0.3573283521],"iteration":320,"passed_time":7.28056961,"remaining_time":15.4003326}, -{"learn":[0.3569801921],"iteration":321,"passed_time":7.307082032,"remaining_time":15.38571931}, -{"learn":[0.3568810457],"iteration":322,"passed_time":7.329394107,"remaining_time":15.36222851}, -{"learn":[0.35676928],"iteration":323,"passed_time":7.355222467,"remaining_time":15.34608144}, -{"learn":[0.3566134286],"iteration":324,"passed_time":7.377839391,"remaining_time":15.32320489}, -{"learn":[0.3565307492],"iteration":325,"passed_time":7.393089132,"remaining_time":15.28509839}, -{"learn":[0.3562459001],"iteration":326,"passed_time":7.415445478,"remaining_time":15.26175782}, -{"learn":[0.3559648846],"iteration":327,"passed_time":7.43874903,"remaining_time":15.24036387}, -{"learn":[0.3558310934],"iteration":328,"passed_time":7.461531161,"remaining_time":15.21789486}, -{"learn":[0.355525639],"iteration":329,"passed_time":7.488692372,"remaining_time":15.20431482}, -{"learn":[0.3553348141],"iteration":330,"passed_time":7.512358605,"remaining_time":15.18358884}, -{"learn":[0.3552290203],"iteration":331,"passed_time":7.534131988,"remaining_time":15.15903665}, -{"learn":[0.3545412457],"iteration":332,"passed_time":7.556277348,"remaining_time":15.13524622}, -{"learn":[0.3543498177],"iteration":333,"passed_time":7.578229608,"remaining_time":15.1110806}, -{"learn":[0.354267269],"iteration":334,"passed_time":7.600212936,"remaining_time":15.08698986}, -{"learn":[0.3541845198],"iteration":335,"passed_time":7.62304827,"remaining_time":15.06459539}, -{"learn":[0.3538121961],"iteration":336,"passed_time":7.644785675,"remaining_time":15.04003829}, -{"learn":[0.3535608169],"iteration":337,"passed_time":7.667040919,"remaining_time":15.0165121}, -{"learn":[0.3531983941],"iteration":338,"passed_time":7.689794841,"remaining_time":14.99396575}, -{"learn":[0.3530182856],"iteration":339,"passed_time":7.706120291,"remaining_time":14.95893939}, -{"learn":[0.3527164122],"iteration":340,"passed_time":7.737325144,"remaining_time":14.95277792}, -{"learn":[0.352633574],"iteration":341,"passed_time":7.779216311,"remaining_time":14.96703021}, -{"learn":[0.3525075494],"iteration":342,"passed_time":7.905813197,"remaining_time":15.14320487}, -{"learn":[0.3524961056],"iteration":343,"passed_time":7.927378105,"remaining_time":15.11732569}, -{"learn":[0.35245364],"iteration":344,"passed_time":7.959635347,"remaining_time":15.11177146}, -{"learn":[0.3521993518],"iteration":345,"passed_time":7.982424347,"remaining_time":15.08816625}, -{"learn":[0.3520077509],"iteration":346,"passed_time":8.011559383,"remaining_time":15.076508}, -{"learn":[0.3519447224],"iteration":347,"passed_time":8.041947635,"remaining_time":15.06709729}, -{"learn":[0.3518945368],"iteration":348,"passed_time":8.053708214,"remaining_time":15.02281962}, -{"learn":[0.3516107656],"iteration":349,"passed_time":8.075229556,"remaining_time":14.99685489}, -{"learn":[0.3515159018],"iteration":350,"passed_time":8.09696984,"remaining_time":14.9713203}, -{"learn":[0.3515000807],"iteration":351,"passed_time":8.105153638,"remaining_time":14.92085101}, -{"learn":[0.3512670327],"iteration":352,"passed_time":8.127032488,"remaining_time":14.89572244}, -{"learn":[0.3508513767],"iteration":353,"passed_time":8.148752566,"remaining_time":14.87032248}, -{"learn":[0.3504572704],"iteration":354,"passed_time":8.174282947,"remaining_time":14.8518662}, -{"learn":[0.35017651],"iteration":355,"passed_time":8.214266086,"remaining_time":14.85951505}, -{"learn":[0.3501286962],"iteration":356,"passed_time":8.260065356,"remaining_time":14.87737262}, -{"learn":[0.3498837488],"iteration":357,"passed_time":8.323683533,"remaining_time":14.92682913}, -{"learn":[0.3495626772],"iteration":358,"passed_time":8.36389557,"remaining_time":14.93386368}, -{"learn":[0.3493757992],"iteration":359,"passed_time":8.399382759,"remaining_time":14.93223602}, -{"learn":[0.3490827511],"iteration":360,"passed_time":8.424002237,"remaining_time":14.91118401}, -{"learn":[0.3488646977],"iteration":361,"passed_time":8.448150513,"remaining_time":14.88928184}, -{"learn":[0.3484613426],"iteration":362,"passed_time":8.471364531,"remaining_time":14.86572784}, -{"learn":[0.3483259359],"iteration":363,"passed_time":8.496857622,"remaining_time":14.84615782}, -{"learn":[0.3480209179],"iteration":364,"passed_time":8.522528902,"remaining_time":14.82686535}, -{"learn":[0.3476817077],"iteration":365,"passed_time":8.54443234,"remaining_time":14.80101121}, -{"learn":[0.3474725024],"iteration":366,"passed_time":8.566187938,"remaining_time":14.77492361}, -{"learn":[0.3474285581],"iteration":367,"passed_time":8.577474249,"remaining_time":14.73087969}, -{"learn":[0.3470858003],"iteration":368,"passed_time":8.599341907,"remaining_time":14.70510771}, -{"learn":[0.3469015363],"iteration":369,"passed_time":8.621413585,"remaining_time":14.67970421}, -{"learn":[0.3463432335],"iteration":370,"passed_time":8.643379322,"remaining_time":14.65413907}, -{"learn":[0.3461185251],"iteration":371,"passed_time":8.665799542,"remaining_time":14.62936052}, -{"learn":[0.3458407874],"iteration":372,"passed_time":8.701760975,"remaining_time":14.62735692}, -{"learn":[0.3457031815],"iteration":373,"passed_time":8.756442967,"remaining_time":14.65650614}, -{"learn":[0.3455128742],"iteration":374,"passed_time":8.807534181,"remaining_time":14.67922364}, -{"learn":[0.3452742962],"iteration":375,"passed_time":8.872117774,"remaining_time":14.72394014}, -{"learn":[0.3452251263],"iteration":376,"passed_time":8.899250902,"remaining_time":14.70618916}, -{"learn":[0.3450881669],"iteration":377,"passed_time":8.928085048,"remaining_time":14.69118757}, -{"learn":[0.3449793371],"iteration":378,"passed_time":8.947728076,"remaining_time":14.66105313}, -{"learn":[0.344691491],"iteration":379,"passed_time":8.969934723,"remaining_time":14.63515665}, -{"learn":[0.3443639578],"iteration":380,"passed_time":8.99241215,"remaining_time":14.60971948}, -{"learn":[0.3442136782],"iteration":381,"passed_time":9.02144383,"remaining_time":14.59490127}, -{"learn":[0.3440594348],"iteration":382,"passed_time":9.03745504,"remaining_time":14.55903332}, -{"learn":[0.3439143606],"iteration":383,"passed_time":9.059658661,"remaining_time":14.53320244}, -{"learn":[0.3437593269],"iteration":384,"passed_time":9.081463941,"remaining_time":14.50675409}, -{"learn":[0.3433892597],"iteration":385,"passed_time":9.103490585,"remaining_time":14.48068192}, -{"learn":[0.3430005665],"iteration":386,"passed_time":9.125031046,"remaining_time":14.45386055}, -{"learn":[0.3426363435],"iteration":387,"passed_time":9.147229098,"remaining_time":14.42810363}, -{"learn":[0.3425431519],"iteration":388,"passed_time":9.169451319,"remaining_time":14.40240297}, -{"learn":[0.3422194687],"iteration":389,"passed_time":9.192135544,"remaining_time":14.37744277}, -{"learn":[0.3420983186],"iteration":390,"passed_time":9.21482497,"remaining_time":14.35250232}, -{"learn":[0.3419547464],"iteration":391,"passed_time":9.240174122,"remaining_time":14.33169864}, -{"learn":[0.3418564406],"iteration":392,"passed_time":9.266114196,"remaining_time":14.31178452}, -{"learn":[0.3416273848],"iteration":393,"passed_time":9.291484275,"remaining_time":14.29096312}, -{"learn":[0.3413111854],"iteration":394,"passed_time":9.321332214,"remaining_time":14.27697719}, -{"learn":[0.3411554684],"iteration":395,"passed_time":9.340067818,"remaining_time":14.24596203}, -{"learn":[0.3410876043],"iteration":396,"passed_time":9.370184518,"remaining_time":14.23229538}, -{"learn":[0.3410429673],"iteration":397,"passed_time":9.39162494,"remaining_time":14.20542265}, -{"learn":[0.341042403],"iteration":398,"passed_time":9.406694781,"remaining_time":14.16898136}, -{"learn":[0.3409573532],"iteration":399,"passed_time":9.451310091,"remaining_time":14.17696514}, -{"learn":[0.3408655821],"iteration":400,"passed_time":9.4923409,"remaining_time":14.17933217}, -{"learn":[0.3406567823],"iteration":401,"passed_time":9.547103264,"remaining_time":14.20190983}, -{"learn":[0.3404763525],"iteration":402,"passed_time":9.579503053,"remaining_time":14.19097599}, -{"learn":[0.3403717595],"iteration":403,"passed_time":9.60199694,"remaining_time":14.16532222}, -{"learn":[0.3400880712],"iteration":404,"passed_time":9.62408225,"remaining_time":14.1390838}, -{"learn":[0.3399640397],"iteration":405,"passed_time":9.646009648,"remaining_time":14.1126348}, -{"learn":[0.3399010234],"iteration":406,"passed_time":9.667975784,"remaining_time":14.08626447}, -{"learn":[0.339826297],"iteration":407,"passed_time":9.690275059,"remaining_time":14.06039911}, -{"learn":[0.3397102041],"iteration":408,"passed_time":9.709651563,"remaining_time":14.03032781}, -{"learn":[0.3395576906],"iteration":409,"passed_time":9.732244916,"remaining_time":14.00493781}, -{"learn":[0.3392198413],"iteration":410,"passed_time":9.757549483,"remaining_time":13.98344683}, -{"learn":[0.3391475536],"iteration":411,"passed_time":9.785746366,"remaining_time":13.9660652}, -{"learn":[0.3389268153],"iteration":412,"passed_time":9.814648628,"remaining_time":13.94963376}, -{"learn":[0.3389266721],"iteration":413,"passed_time":9.823336433,"remaining_time":13.90452935}, -{"learn":[0.3388830216],"iteration":414,"passed_time":9.838841117,"remaining_time":13.86920977}, -{"learn":[0.3388260339],"iteration":415,"passed_time":9.861509022,"remaining_time":13.84404151}, -{"learn":[0.3385376482],"iteration":416,"passed_time":9.884074666,"remaining_time":13.81874228}, -{"learn":[0.3384459997],"iteration":417,"passed_time":9.906639396,"remaining_time":13.79345485}, -{"learn":[0.3384035804],"iteration":418,"passed_time":9.928521171,"remaining_time":13.76723341}, -{"learn":[0.338206978],"iteration":419,"passed_time":9.950592651,"remaining_time":13.74129461}, -{"learn":[0.3381563107],"iteration":420,"passed_time":9.972312358,"remaining_time":13.71489039}, -{"learn":[0.3380916237],"iteration":421,"passed_time":9.994182293,"remaining_time":13.68871414}, -{"learn":[0.3379155117],"iteration":422,"passed_time":10.01716742,"remaining_time":13.66407943}, -{"learn":[0.3377370109],"iteration":423,"passed_time":10.0451664,"remaining_time":13.64626379}, -{"learn":[0.3376685347],"iteration":424,"passed_time":10.06750274,"remaining_time":13.620739}, -{"learn":[0.3375387678],"iteration":425,"passed_time":10.08578742,"remaining_time":13.58976991}, -{"learn":[0.3375264339],"iteration":426,"passed_time":10.10044959,"remaining_time":13.5539991}, -{"learn":[0.3375078804],"iteration":427,"passed_time":10.10840815,"remaining_time":13.5093679}, -{"learn":[0.337340127],"iteration":428,"passed_time":10.13027685,"remaining_time":13.4834221}, -{"learn":[0.3372056844],"iteration":429,"passed_time":10.15208,"remaining_time":13.45740837}, -{"learn":[0.336977263],"iteration":430,"passed_time":10.18504522,"remaining_time":13.44615019}, -{"learn":[0.3367988208],"iteration":431,"passed_time":10.2187855,"remaining_time":13.43581056}, -{"learn":[0.3367285927],"iteration":432,"passed_time":10.23098873,"remaining_time":13.39716076}, -{"learn":[0.3366052887],"iteration":433,"passed_time":10.2766679,"remaining_time":13.40229039}, -{"learn":[0.3363612465],"iteration":434,"passed_time":10.32772274,"remaining_time":13.41416862}, -{"learn":[0.3362435567],"iteration":435,"passed_time":10.37212705,"remaining_time":13.41715518}, -{"learn":[0.3361462199],"iteration":436,"passed_time":10.40813808,"remaining_time":13.40911154}, -{"learn":[0.3361461347],"iteration":437,"passed_time":10.41298218,"remaining_time":13.36094973}, -{"learn":[0.3360079098],"iteration":438,"passed_time":10.43960066,"remaining_time":13.34081086}, -{"learn":[0.3358086626],"iteration":439,"passed_time":10.46151863,"remaining_time":13.31466007}, -{"learn":[0.3356011997],"iteration":440,"passed_time":10.48387624,"remaining_time":13.28908576}, -{"learn":[0.3354146851],"iteration":441,"passed_time":10.50689004,"remaining_time":13.26435439}, -{"learn":[0.3352191524],"iteration":442,"passed_time":10.53608105,"remaining_time":13.24739762}, -{"learn":[0.3348674793],"iteration":443,"passed_time":10.55831293,"remaining_time":13.22167115}, -{"learn":[0.3348375647],"iteration":444,"passed_time":10.56995489,"remaining_time":13.18275273}, -{"learn":[0.3346763511],"iteration":445,"passed_time":10.59183961,"remaining_time":13.15667969}, -{"learn":[0.3344469846],"iteration":446,"passed_time":10.61412676,"remaining_time":13.13112326}, -{"learn":[0.3341331513],"iteration":447,"passed_time":10.63614375,"remaining_time":13.10524854}, -{"learn":[0.3338919982],"iteration":448,"passed_time":10.65810123,"remaining_time":13.07931798}, -{"learn":[0.3336666898],"iteration":449,"passed_time":10.67988947,"remaining_time":13.05319824}, -{"learn":[0.3336666289],"iteration":450,"passed_time":10.68502464,"remaining_time":13.00682601}, -{"learn":[0.3336154028],"iteration":451,"passed_time":10.70821328,"remaining_time":12.98252407}, -{"learn":[0.3333581167],"iteration":452,"passed_time":10.73100265,"remaining_time":12.95774492}, -{"learn":[0.333290786],"iteration":453,"passed_time":10.74255886,"remaining_time":12.91946506}, -{"learn":[0.3332008443],"iteration":454,"passed_time":10.76369789,"remaining_time":12.89278099}, -{"learn":[0.3331038516],"iteration":455,"passed_time":10.79258158,"remaining_time":12.87536048}, -{"learn":[0.3329428533],"iteration":456,"passed_time":10.81736692,"remaining_time":12.85302021}, -{"learn":[0.3329254389],"iteration":457,"passed_time":10.83350231,"remaining_time":12.82043286}, -{"learn":[0.3326182973],"iteration":458,"passed_time":10.85619419,"remaining_time":12.795645}, -{"learn":[0.3321795229],"iteration":459,"passed_time":10.87927788,"remaining_time":12.77132621}, -{"learn":[0.3320965842],"iteration":460,"passed_time":10.90369744,"remaining_time":12.74857466}, -{"learn":[0.3320919904],"iteration":461,"passed_time":10.9128379,"remaining_time":12.70802336}, -{"learn":[0.3317616467],"iteration":462,"passed_time":10.94039362,"remaining_time":12.68896625}, -{"learn":[0.3314515976],"iteration":463,"passed_time":10.96485849,"remaining_time":12.66630204}, -{"learn":[0.3314302988],"iteration":464,"passed_time":10.97934712,"remaining_time":12.63215206}, -{"learn":[0.331326468],"iteration":465,"passed_time":11.02336518,"remaining_time":12.63192491}, -{"learn":[0.3312172495],"iteration":466,"passed_time":11.06920655,"remaining_time":12.6335912}, -{"learn":[0.3311362468],"iteration":467,"passed_time":11.11033467,"remaining_time":12.62969667}, -{"learn":[0.3308259578],"iteration":468,"passed_time":11.15241621,"remaining_time":12.62672283}, -{"learn":[0.3306543113],"iteration":469,"passed_time":11.19050052,"remaining_time":12.61907506}, -{"learn":[0.3304472924],"iteration":470,"passed_time":11.22114388,"remaining_time":12.60294079}, -{"learn":[0.3302050118],"iteration":471,"passed_time":11.24489435,"remaining_time":12.57903435}, -{"learn":[0.3302042287],"iteration":472,"passed_time":11.25318644,"remaining_time":12.5379054}, -{"learn":[0.3302042278],"iteration":473,"passed_time":11.2585324,"remaining_time":12.49364566}, -{"learn":[0.330077596],"iteration":474,"passed_time":11.28675622,"remaining_time":12.47483582}, -{"learn":[0.3299967493],"iteration":475,"passed_time":11.30915867,"remaining_time":12.44957803}, -{"learn":[0.3298204689],"iteration":476,"passed_time":11.33547981,"remaining_time":12.42862881}, -{"learn":[0.3296573275],"iteration":477,"passed_time":11.36870769,"remaining_time":12.41519961}, -{"learn":[0.3295569924],"iteration":478,"passed_time":11.39100902,"remaining_time":12.38980313}, -{"learn":[0.329329664],"iteration":479,"passed_time":11.41344547,"remaining_time":12.36456593}, -{"learn":[0.329131173],"iteration":480,"passed_time":11.43771739,"remaining_time":12.34132084}, -{"learn":[0.3289868495],"iteration":481,"passed_time":11.45959838,"remaining_time":12.31550199}, -{"learn":[0.3288599313],"iteration":482,"passed_time":11.481945,"remaining_time":12.29019786}, -{"learn":[0.3285822513],"iteration":483,"passed_time":11.50452789,"remaining_time":12.26515783}, -{"learn":[0.3282988587],"iteration":484,"passed_time":11.52631836,"remaining_time":12.23928651}, -{"learn":[0.3282849959],"iteration":485,"passed_time":11.54937837,"remaining_time":12.21477465}, -{"learn":[0.3281045884],"iteration":486,"passed_time":11.57297806,"remaining_time":12.19083726}, -{"learn":[0.3279303325],"iteration":487,"passed_time":11.59488577,"remaining_time":12.16512606}, -{"learn":[0.3277856921],"iteration":488,"passed_time":11.61756328,"remaining_time":12.14023484}, -{"learn":[0.3277359886],"iteration":489,"passed_time":11.63917325,"remaining_time":12.11424154}, -{"learn":[0.3275212786],"iteration":490,"passed_time":11.66039364,"remaining_time":12.08786225}, -{"learn":[0.3273286251],"iteration":491,"passed_time":11.68281481,"remaining_time":12.06274374}, -{"learn":[0.3271903876],"iteration":492,"passed_time":11.70660697,"remaining_time":12.03904611}, -{"learn":[0.3270655317],"iteration":493,"passed_time":11.73027173,"remaining_time":12.0152176}, -{"learn":[0.3270389056],"iteration":494,"passed_time":11.73848459,"remaining_time":11.97562569}, -{"learn":[0.326813723],"iteration":495,"passed_time":11.76041241,"remaining_time":11.95009648}, -{"learn":[0.3265823051],"iteration":496,"passed_time":11.7841956,"remaining_time":11.92645954}, -{"learn":[0.326481471],"iteration":497,"passed_time":11.80409698,"remaining_time":11.898909}, -{"learn":[0.3263322725],"iteration":498,"passed_time":11.82616979,"remaining_time":11.87356926}, -{"learn":[0.3261136043],"iteration":499,"passed_time":11.86466859,"remaining_time":11.86466859}, -{"learn":[0.3259491378],"iteration":500,"passed_time":11.88944591,"remaining_time":11.84198305}, -{"learn":[0.3255755285],"iteration":501,"passed_time":11.91145079,"remaining_time":11.81653883}, -{"learn":[0.325431063],"iteration":502,"passed_time":11.9334484,"remaining_time":11.79110111}, -{"learn":[0.3251221632],"iteration":503,"passed_time":11.9553648,"remaining_time":11.7655971}, -{"learn":[0.3249533874],"iteration":504,"passed_time":11.97708778,"remaining_time":11.73991773}, -{"learn":[0.3245557056],"iteration":505,"passed_time":11.99903462,"remaining_time":11.71447253}, -{"learn":[0.3244819748],"iteration":506,"passed_time":12.02060642,"remaining_time":11.68867646}, -{"learn":[0.3244571553],"iteration":507,"passed_time":12.0398824,"remaining_time":11.66067351}, -{"learn":[0.3243944087],"iteration":508,"passed_time":12.06431851,"remaining_time":11.63768249}, -{"learn":[0.3243932505],"iteration":509,"passed_time":12.07556097,"remaining_time":11.60200956}, -{"learn":[0.3243735511],"iteration":510,"passed_time":12.08694504,"remaining_time":11.56656776}, -{"learn":[0.3242641705],"iteration":511,"passed_time":12.10916608,"remaining_time":11.54154892}, -{"learn":[0.3238891977],"iteration":512,"passed_time":12.13107379,"remaining_time":11.51624354}, -{"learn":[0.3237673065],"iteration":513,"passed_time":12.15282633,"remaining_time":11.49080466}, -{"learn":[0.3236015493],"iteration":514,"passed_time":12.17484746,"remaining_time":11.46563305}, -{"learn":[0.3233656351],"iteration":515,"passed_time":12.19863579,"remaining_time":11.44213125}, -{"learn":[0.3232732615],"iteration":516,"passed_time":12.22211573,"remaining_time":11.41834023}, -{"learn":[0.3231361121],"iteration":517,"passed_time":12.24498624,"remaining_time":11.39398333}, -{"learn":[0.32299658],"iteration":518,"passed_time":12.2674654,"remaining_time":11.36926947}, -{"learn":[0.3229860023],"iteration":519,"passed_time":12.27596326,"remaining_time":11.3316584}, -{"learn":[0.322752282],"iteration":520,"passed_time":12.30415749,"remaining_time":11.31226764}, -{"learn":[0.3227072424],"iteration":521,"passed_time":12.32641801,"remaining_time":11.2874096}, -{"learn":[0.3226090551],"iteration":522,"passed_time":12.35471927,"remaining_time":11.26807092}, -{"learn":[0.3224092365],"iteration":523,"passed_time":12.39195665,"remaining_time":11.25681558}, -{"learn":[0.3224092358],"iteration":524,"passed_time":12.39737271,"remaining_time":11.21667054}, -{"learn":[0.322391538],"iteration":525,"passed_time":12.40533802,"remaining_time":11.1789548}, -{"learn":[0.3222006912],"iteration":526,"passed_time":12.42948673,"remaining_time":11.15587708}, -{"learn":[0.3221324811],"iteration":527,"passed_time":12.4519036,"remaining_time":11.13124716}, -{"learn":[0.3221061996],"iteration":528,"passed_time":12.46338891,"remaining_time":11.09689258}, -{"learn":[0.3220694662],"iteration":529,"passed_time":12.48500417,"remaining_time":11.07160747}, -{"learn":[0.3219756017],"iteration":530,"passed_time":12.5070657,"remaining_time":11.04673035}, -{"learn":[0.3219724232],"iteration":531,"passed_time":12.51552779,"remaining_time":11.00990039}, -{"learn":[0.3215889876],"iteration":532,"passed_time":12.53731651,"remaining_time":10.98485331}, -{"learn":[0.3214944521],"iteration":533,"passed_time":12.56633158,"remaining_time":10.96612456}, -{"learn":[0.3214735687],"iteration":534,"passed_time":12.57450905,"remaining_time":10.92924618}, -{"learn":[0.3211667307],"iteration":535,"passed_time":12.59607083,"remaining_time":10.90406132}, -{"learn":[0.3210361058],"iteration":536,"passed_time":12.6184051,"remaining_time":10.87955598}, -{"learn":[0.3209803394],"iteration":537,"passed_time":12.63658166,"remaining_time":10.85148834}, -{"learn":[0.3209803394],"iteration":538,"passed_time":12.64103614,"remaining_time":10.81172108}, -{"learn":[0.3209335447],"iteration":539,"passed_time":12.65243667,"remaining_time":10.77800161}, -{"learn":[0.3208255558],"iteration":540,"passed_time":12.67388975,"remaining_time":10.75289352}, -{"learn":[0.3204879029],"iteration":541,"passed_time":12.69799169,"remaining_time":10.73003726}, -{"learn":[0.3203255553],"iteration":542,"passed_time":12.72041289,"remaining_time":10.70576186}, -{"learn":[0.3203078373],"iteration":543,"passed_time":12.7392844,"remaining_time":10.67851781}, -{"learn":[0.3201807045],"iteration":544,"passed_time":12.76135281,"remaining_time":10.65397345}, -{"learn":[0.3200168479],"iteration":545,"passed_time":12.78311559,"remaining_time":10.62918403}, -{"learn":[0.3199792981],"iteration":546,"passed_time":12.80212903,"remaining_time":10.6021288}, -{"learn":[0.3198294345],"iteration":547,"passed_time":12.82745361,"remaining_time":10.58030845}, -{"learn":[0.3198294344],"iteration":548,"passed_time":12.83217461,"remaining_time":10.54154964}, -{"learn":[0.319647278],"iteration":549,"passed_time":12.88575667,"remaining_time":10.54289182}, -{"learn":[0.3196091956],"iteration":550,"passed_time":12.91083071,"remaining_time":10.52080397}, -{"learn":[0.3194977614],"iteration":551,"passed_time":12.95694549,"remaining_time":10.51578184}, -{"learn":[0.3194412347],"iteration":552,"passed_time":12.97875463,"remaining_time":10.49096442}, -{"learn":[0.319377863],"iteration":553,"passed_time":13.00016171,"remaining_time":10.46583416}, -{"learn":[0.319212072],"iteration":554,"passed_time":13.02191225,"remaining_time":10.44099271}, -{"learn":[0.3192120719],"iteration":555,"passed_time":13.02651986,"remaining_time":10.40247269}, -{"learn":[0.3191064217],"iteration":556,"passed_time":13.05525834,"remaining_time":10.38326651}, -{"learn":[0.3190443835],"iteration":557,"passed_time":13.07782907,"remaining_time":10.35914059}, -{"learn":[0.3189403324],"iteration":558,"passed_time":13.09956572,"remaining_time":10.33436222}, -{"learn":[0.3187465621],"iteration":559,"passed_time":13.12216052,"remaining_time":10.31026898}, -{"learn":[0.3185833798],"iteration":560,"passed_time":13.14414249,"remaining_time":10.28570152}, -{"learn":[0.3184379867],"iteration":561,"passed_time":13.16591073,"remaining_time":10.26097669}, -{"learn":[0.3182631548],"iteration":562,"passed_time":13.18804655,"remaining_time":10.23654768}, -{"learn":[0.3181986719],"iteration":563,"passed_time":13.2078342,"remaining_time":10.21031155}, -{"learn":[0.3180519592],"iteration":564,"passed_time":13.23026202,"remaining_time":10.18613094}, -{"learn":[0.3180225705],"iteration":565,"passed_time":13.24844462,"remaining_time":10.15870135}, -{"learn":[0.3178969873],"iteration":566,"passed_time":13.27035077,"remaining_time":10.13414794}, -{"learn":[0.3176445672],"iteration":567,"passed_time":13.29577878,"remaining_time":10.11228245}, -{"learn":[0.317322944],"iteration":568,"passed_time":13.32134689,"remaining_time":10.09051056}, -{"learn":[0.317228846],"iteration":569,"passed_time":13.34365403,"remaining_time":10.06626532}, -{"learn":[0.3170580473],"iteration":570,"passed_time":13.37570572,"remaining_time":10.04934808}, -{"learn":[0.3167691984],"iteration":571,"passed_time":13.40324414,"remaining_time":10.02900086}, -{"learn":[0.316670053],"iteration":572,"passed_time":13.42788682,"remaining_time":10.00647063}, -{"learn":[0.3164501718],"iteration":573,"passed_time":13.45331304,"remaining_time":9.984514557}, -{"learn":[0.3163287563],"iteration":574,"passed_time":13.49501302,"remaining_time":9.974574844}, -{"learn":[0.3162894601],"iteration":575,"passed_time":13.53471092,"remaining_time":9.963051095}, -{"learn":[0.3162494869],"iteration":576,"passed_time":13.58837703,"remaining_time":9.961669818}, -{"learn":[0.3159951385],"iteration":577,"passed_time":13.63095028,"remaining_time":9.952008685}, -{"learn":[0.3157978717],"iteration":578,"passed_time":13.67218492,"remaining_time":9.941260534}, -{"learn":[0.3155850358],"iteration":579,"passed_time":13.70123406,"remaining_time":9.921583284}, -{"learn":[0.315355402],"iteration":580,"passed_time":13.72422975,"remaining_time":9.897508201}, -{"learn":[0.3150989936],"iteration":581,"passed_time":13.74689945,"remaining_time":9.873202701}, -{"learn":[0.3148114702],"iteration":582,"passed_time":13.76882133,"remaining_time":9.848367913}, -{"learn":[0.3144519215],"iteration":583,"passed_time":13.79434107,"remaining_time":9.826105965}, -{"learn":[0.3143229251],"iteration":584,"passed_time":13.84787179,"remaining_time":9.823703919}, -{"learn":[0.3141904066],"iteration":585,"passed_time":13.90335501,"remaining_time":9.82250678}, -{"learn":[0.3140027965],"iteration":586,"passed_time":13.9489919,"remaining_time":9.814197027}, -{"learn":[0.3138685082],"iteration":587,"passed_time":13.99129849,"remaining_time":9.80342683}, -{"learn":[0.3138181058],"iteration":588,"passed_time":14.03659042,"remaining_time":9.794632705}, -{"learn":[0.313574669],"iteration":589,"passed_time":14.06815424,"remaining_time":9.776174981}, -{"learn":[0.3134898049],"iteration":590,"passed_time":14.09487967,"remaining_time":9.754324512}, -{"learn":[0.313320396],"iteration":591,"passed_time":14.11692573,"remaining_time":9.729232599}, -{"learn":[0.3131676802],"iteration":592,"passed_time":14.13857285,"remaining_time":9.70387715}, -{"learn":[0.3129757867],"iteration":593,"passed_time":14.16077145,"remaining_time":9.678911124}, -{"learn":[0.3127907517],"iteration":594,"passed_time":14.18313665,"remaining_time":9.654067803}, -{"learn":[0.3125289035],"iteration":595,"passed_time":14.20720097,"remaining_time":9.630384553}, -{"learn":[0.3123599621],"iteration":596,"passed_time":14.23064686,"remaining_time":9.606282555}, -{"learn":[0.3121137456],"iteration":597,"passed_time":14.25288883,"remaining_time":9.581373427}, -{"learn":[0.3119284015],"iteration":598,"passed_time":14.27492804,"remaining_time":9.55633747}, -{"learn":[0.3119267487],"iteration":599,"passed_time":14.28632892,"remaining_time":9.52421928}, -{"learn":[0.3119112192],"iteration":600,"passed_time":14.30279762,"remaining_time":9.495534525}, -{"learn":[0.3118470126],"iteration":601,"passed_time":14.32951711,"remaining_time":9.473667455}, -{"learn":[0.3117666572],"iteration":602,"passed_time":14.35212255,"remaining_time":9.449075711}, -{"learn":[0.3116060866],"iteration":603,"passed_time":14.37601067,"remaining_time":9.425331499}, -{"learn":[0.311604484],"iteration":604,"passed_time":14.38875212,"remaining_time":9.394309237}, -{"learn":[0.3113084243],"iteration":605,"passed_time":14.43525,"remaining_time":9.385294556}, -{"learn":[0.3112684311],"iteration":606,"passed_time":14.48716047,"remaining_time":9.379660734}, -{"learn":[0.3111182078],"iteration":607,"passed_time":14.55474728,"remaining_time":9.383981801}, -{"learn":[0.3109941013],"iteration":608,"passed_time":14.60355513,"remaining_time":9.376009941}, -{"learn":[0.3108986608],"iteration":609,"passed_time":14.65277384,"remaining_time":9.368166881}, -{"learn":[0.3107318621],"iteration":610,"passed_time":14.67810413,"remaining_time":9.344979556}, -{"learn":[0.3106806721],"iteration":611,"passed_time":14.70494523,"remaining_time":9.322743053}, -{"learn":[0.3105565129],"iteration":612,"passed_time":14.73133964,"remaining_time":9.300209526}, -{"learn":[0.3103924843],"iteration":613,"passed_time":14.7562304,"remaining_time":9.276718134}, -{"learn":[0.3102082538],"iteration":614,"passed_time":14.78098881,"remaining_time":9.253139335}, -{"learn":[0.3100890351],"iteration":615,"passed_time":14.805187,"remaining_time":9.229207479}, -{"learn":[0.3099299428],"iteration":616,"passed_time":14.83016501,"remaining_time":9.205758831}, -{"learn":[0.3099148853],"iteration":617,"passed_time":14.85097273,"remaining_time":9.179727481}, -{"learn":[0.3098292521],"iteration":618,"passed_time":14.87482513,"remaining_time":9.155587033}, -{"learn":[0.3097022539],"iteration":619,"passed_time":14.89875155,"remaining_time":9.131492883}, -{"learn":[0.3095586079],"iteration":620,"passed_time":14.92966579,"remaining_time":9.111663983}, -{"learn":[0.3095365057],"iteration":621,"passed_time":14.96288268,"remaining_time":9.093198797}, -{"learn":[0.3093867074],"iteration":622,"passed_time":14.98789146,"remaining_time":9.069719231}, -{"learn":[0.3090971237],"iteration":623,"passed_time":15.01706544,"remaining_time":9.048744563}, -{"learn":[0.3090567117],"iteration":624,"passed_time":15.03814037,"remaining_time":9.022884225}, -{"learn":[0.3090514438],"iteration":625,"passed_time":15.05096904,"remaining_time":8.992112496}, -{"learn":[0.3089121979],"iteration":626,"passed_time":15.1048228,"remaining_time":8.985803678}, -{"learn":[0.3088734529],"iteration":627,"passed_time":15.13101518,"remaining_time":8.962958036}, -{"learn":[0.3087798566],"iteration":628,"passed_time":15.15559681,"remaining_time":8.939151693}, -{"learn":[0.3085569569],"iteration":629,"passed_time":15.18628248,"remaining_time":8.918927806}, -{"learn":[0.3083945767],"iteration":630,"passed_time":15.21558256,"remaining_time":8.89786048}, -{"learn":[0.3082636175],"iteration":631,"passed_time":15.24035069,"remaining_time":8.874128248}, -{"learn":[0.308097633],"iteration":632,"passed_time":15.26563185,"remaining_time":8.850690187}, -{"learn":[0.3080161232],"iteration":633,"passed_time":15.2904056,"remaining_time":8.826953388}, -{"learn":[0.3079940498],"iteration":634,"passed_time":15.31462655,"remaining_time":8.802895579}, -{"learn":[0.3077049522],"iteration":635,"passed_time":15.33624358,"remaining_time":8.777346955}, -{"learn":[0.3074875181],"iteration":636,"passed_time":15.35822191,"remaining_time":8.752016568}, -{"learn":[0.3073941113],"iteration":637,"passed_time":15.38096155,"remaining_time":8.727128651}, -{"learn":[0.3070378662],"iteration":638,"passed_time":15.4242628,"remaining_time":8.713863648}, -{"learn":[0.3069235694],"iteration":639,"passed_time":15.45524212,"remaining_time":8.693573694}, -{"learn":[0.3068787888],"iteration":640,"passed_time":15.47926165,"remaining_time":8.669352466}, -{"learn":[0.3067815049],"iteration":641,"passed_time":15.51473893,"remaining_time":8.651521084}, -{"learn":[0.3067274077],"iteration":642,"passed_time":15.5591241,"remaining_time":8.638580567}, -{"learn":[0.3067273505],"iteration":643,"passed_time":15.57439764,"remaining_time":8.609449626}, -{"learn":[0.30654485],"iteration":644,"passed_time":15.60990177,"remaining_time":8.591496323}, -{"learn":[0.306542431],"iteration":645,"passed_time":15.62539633,"remaining_time":8.562523686}, -{"learn":[0.3063441894],"iteration":646,"passed_time":15.66716512,"remaining_time":8.547927802}, -{"learn":[0.3061944627],"iteration":647,"passed_time":15.71421395,"remaining_time":8.536116217}, -{"learn":[0.3061943966],"iteration":648,"passed_time":15.72971142,"remaining_time":8.507132062}, -{"learn":[0.3059553625],"iteration":649,"passed_time":15.75314641,"remaining_time":8.48246345}, -{"learn":[0.3057317972],"iteration":650,"passed_time":15.77560955,"remaining_time":8.457277621}, -{"learn":[0.305636842],"iteration":651,"passed_time":15.79864888,"remaining_time":8.432407685}, -{"learn":[0.3056207008],"iteration":652,"passed_time":15.807586,"remaining_time":8.400049528}, -{"learn":[0.3054612738],"iteration":653,"passed_time":15.82717303,"remaining_time":8.373397353}, -{"learn":[0.3053219515],"iteration":654,"passed_time":15.85644191,"remaining_time":8.35186635}, -{"learn":[0.3053042191],"iteration":655,"passed_time":15.87826828,"remaining_time":8.326408976}, -{"learn":[0.3051397112],"iteration":656,"passed_time":15.9139373,"remaining_time":8.308189489}, -{"learn":[0.3049434285],"iteration":657,"passed_time":15.96952775,"remaining_time":8.300271261}, -{"learn":[0.3048304658],"iteration":658,"passed_time":16.04229694,"remaining_time":8.301097507}, -{"learn":[0.3047096301],"iteration":659,"passed_time":16.09940802,"remaining_time":8.293634435}, -{"learn":[0.3042903415],"iteration":660,"passed_time":16.17347815,"remaining_time":8.29471875}, -{"learn":[0.3042772412],"iteration":661,"passed_time":16.1971499,"remaining_time":8.269843906}, -{"learn":[0.3040841367],"iteration":662,"passed_time":16.23556689,"remaining_time":8.252467636}, -{"learn":[0.3039029953],"iteration":663,"passed_time":16.26662238,"remaining_time":8.231302891}, -{"learn":[0.3036718031],"iteration":664,"passed_time":16.29784551,"remaining_time":8.210192852}, -{"learn":[0.303650484],"iteration":665,"passed_time":16.32503138,"remaining_time":8.18702775}, -{"learn":[0.3035074481],"iteration":666,"passed_time":16.38176119,"remaining_time":8.178600412}, -{"learn":[0.3033167887],"iteration":667,"passed_time":16.45371574,"remaining_time":8.17759525}, -{"learn":[0.3032946087],"iteration":668,"passed_time":16.4777861,"remaining_time":8.152686399}, -{"learn":[0.3032089215],"iteration":669,"passed_time":16.54239358,"remaining_time":8.147746092}, -{"learn":[0.3030821849],"iteration":670,"passed_time":16.56585054,"remaining_time":8.122451308}, -{"learn":[0.3029894163],"iteration":671,"passed_time":16.58837822,"remaining_time":8.096708416}, -{"learn":[0.302865477],"iteration":672,"passed_time":16.6172538,"remaining_time":8.074059426}, -{"learn":[0.3028067159],"iteration":673,"passed_time":16.63609293,"remaining_time":8.046537528}, -{"learn":[0.3027061901],"iteration":674,"passed_time":16.65820596,"remaining_time":8.020617682}, -{"learn":[0.3025646938],"iteration":675,"passed_time":16.68103442,"remaining_time":7.995051998}, -{"learn":[0.3025250377],"iteration":676,"passed_time":16.69379449,"remaining_time":7.964690722}, -{"learn":[0.3020655554],"iteration":677,"passed_time":16.7164889,"remaining_time":7.93909945}, -{"learn":[0.3020534847],"iteration":678,"passed_time":16.72869792,"remaining_time":7.908559695}, -{"learn":[0.3020343145],"iteration":679,"passed_time":16.76349825,"remaining_time":7.888705057}, -{"learn":[0.3018419602],"iteration":680,"passed_time":16.8072208,"remaining_time":7.872985954}, -{"learn":[0.3016898998],"iteration":681,"passed_time":16.85202658,"remaining_time":7.857689812}, -{"learn":[0.3015708555],"iteration":682,"passed_time":16.88419123,"remaining_time":7.836440148}, -{"learn":[0.3014896934],"iteration":683,"passed_time":16.92755692,"remaining_time":7.820333312}, -{"learn":[0.301382652],"iteration":684,"passed_time":16.95983849,"remaining_time":7.799049817}, -{"learn":[0.3010326679],"iteration":685,"passed_time":16.9823736,"remaining_time":7.773273046}, -{"learn":[0.3009148994],"iteration":686,"passed_time":17.00382974,"remaining_time":7.74701413}, -{"learn":[0.30091463],"iteration":687,"passed_time":17.01200093,"remaining_time":7.714744607}, -{"learn":[0.3007108906],"iteration":688,"passed_time":17.03396364,"remaining_time":7.688770234}, -{"learn":[0.3006049621],"iteration":689,"passed_time":17.05610975,"remaining_time":7.662889886}, -{"learn":[0.3004424014],"iteration":690,"passed_time":17.07874149,"remaining_time":7.63723751}, -{"learn":[0.3002521525],"iteration":691,"passed_time":17.10159712,"remaining_time":7.611693515}, -{"learn":[0.3001677248],"iteration":692,"passed_time":17.13033905,"remaining_time":7.588764918}, -{"learn":[0.3000495606],"iteration":693,"passed_time":17.15264985,"remaining_time":7.562983939}, -{"learn":[0.2999076935],"iteration":694,"passed_time":17.17487661,"remaining_time":7.537176065}, -{"learn":[0.2997878011],"iteration":695,"passed_time":17.1986168,"remaining_time":7.512039522}, -{"learn":[0.2997774515],"iteration":696,"passed_time":17.21042258,"remaining_time":7.481718853}, -{"learn":[0.2997265735],"iteration":697,"passed_time":17.23318916,"remaining_time":7.456193591}, -{"learn":[0.2996999851],"iteration":698,"passed_time":17.25516902,"remaining_time":7.430337448}, -{"learn":[0.2995208066],"iteration":699,"passed_time":17.27751275,"remaining_time":7.40464832}, -{"learn":[0.2995205559],"iteration":700,"passed_time":17.28640479,"remaining_time":7.373231143}, -{"learn":[0.2993846391],"iteration":701,"passed_time":17.31035892,"remaining_time":7.348272021}, -{"learn":[0.2991289729],"iteration":702,"passed_time":17.33681112,"remaining_time":7.324371129}, -{"learn":[0.2990709937],"iteration":703,"passed_time":17.36675989,"remaining_time":7.301933138}, -{"learn":[0.2990700247],"iteration":704,"passed_time":17.37528246,"remaining_time":7.270508264}, -{"learn":[0.2989463307],"iteration":705,"passed_time":17.39860223,"remaining_time":7.245310278}, -{"learn":[0.2989462517],"iteration":706,"passed_time":17.4147936,"remaining_time":7.217163403}, -{"learn":[0.2987724441],"iteration":707,"passed_time":17.44933557,"remaining_time":7.196618625}, -{"learn":[0.2987179044],"iteration":708,"passed_time":17.47148817,"remaining_time":7.170949307}, -{"learn":[0.2985139439],"iteration":709,"passed_time":17.49374124,"remaining_time":7.14533093}, -{"learn":[0.2982107603],"iteration":710,"passed_time":17.51577211,"remaining_time":7.119631702}, -{"learn":[0.2981313323],"iteration":711,"passed_time":17.53812766,"remaining_time":7.094074111}, -{"learn":[0.2980878246],"iteration":712,"passed_time":17.56294973,"remaining_time":7.069518333}, -{"learn":[0.297945571],"iteration":713,"passed_time":17.58499817,"remaining_time":7.043850809}, -{"learn":[0.2977036341],"iteration":714,"passed_time":17.60727451,"remaining_time":7.018284247}, -{"learn":[0.2976532538],"iteration":715,"passed_time":17.63636028,"remaining_time":6.99542782}, -{"learn":[0.2972948225],"iteration":716,"passed_time":17.65843273,"remaining_time":6.96978586}, -{"learn":[0.2972072898],"iteration":717,"passed_time":17.68058855,"remaining_time":6.94418659}, -{"learn":[0.2970205352],"iteration":718,"passed_time":17.70485614,"remaining_time":6.919422218}, -{"learn":[0.2968625698],"iteration":719,"passed_time":17.72750556,"remaining_time":6.89402994}, -{"learn":[0.296778922],"iteration":720,"passed_time":17.75015606,"remaining_time":6.868645689}, -{"learn":[0.2965144868],"iteration":721,"passed_time":17.77211874,"remaining_time":6.843004167}, -{"learn":[0.2964393382],"iteration":722,"passed_time":17.79405049,"remaining_time":6.817360975}, -{"learn":[0.2963119084],"iteration":723,"passed_time":17.81623397,"remaining_time":6.791824}, -{"learn":[0.2960547659],"iteration":724,"passed_time":17.83883814,"remaining_time":6.766455845}, -{"learn":[0.2959726674],"iteration":725,"passed_time":17.86237455,"remaining_time":6.741447144}, -{"learn":[0.2959442898],"iteration":726,"passed_time":17.92023066,"remaining_time":6.729330081}, -{"learn":[0.2958761466],"iteration":727,"passed_time":17.93996576,"remaining_time":6.702844349}, -{"learn":[0.2955882368],"iteration":728,"passed_time":17.96248951,"remaining_time":6.677413797}, -{"learn":[0.2955462923],"iteration":729,"passed_time":18.01029763,"remaining_time":6.661342958}, -{"learn":[0.2953304881],"iteration":730,"passed_time":18.03427959,"remaining_time":6.636417524}, -{"learn":[0.2951897941],"iteration":731,"passed_time":18.05763098,"remaining_time":6.6112638}, -{"learn":[0.2950068022],"iteration":732,"passed_time":18.08062816,"remaining_time":6.585985974}, -{"learn":[0.2949951299],"iteration":733,"passed_time":18.10420309,"remaining_time":6.560923737}, -{"learn":[0.2948810476],"iteration":734,"passed_time":18.13520748,"remaining_time":6.538544192}, -{"learn":[0.2948013604],"iteration":735,"passed_time":18.15856612,"remaining_time":6.513398716}, -{"learn":[0.2947457831],"iteration":736,"passed_time":18.17803723,"remaining_time":6.486870815}, -{"learn":[0.2945614394],"iteration":737,"passed_time":18.20246632,"remaining_time":6.462122191}, -{"learn":[0.2942434298],"iteration":738,"passed_time":18.22474259,"remaining_time":6.436614093}, -{"learn":[0.2939751704],"iteration":739,"passed_time":18.24767836,"remaining_time":6.411346451}, -{"learn":[0.2938581582],"iteration":740,"passed_time":18.2701075,"remaining_time":6.38590802}, -{"learn":[0.29382581],"iteration":741,"passed_time":18.27862017,"remaining_time":6.355638818}, -{"learn":[0.2935313901],"iteration":742,"passed_time":18.30044636,"remaining_time":6.330033264}, -{"learn":[0.293385087],"iteration":743,"passed_time":18.32305332,"remaining_time":6.304706517}, -{"learn":[0.2931688515],"iteration":744,"passed_time":18.345594,"remaining_time":6.27936439}, -{"learn":[0.2929784993],"iteration":745,"passed_time":18.37302216,"remaining_time":6.255693871}, -{"learn":[0.2927616087],"iteration":746,"passed_time":18.40180032,"remaining_time":6.232470523}, -{"learn":[0.2927348935],"iteration":747,"passed_time":18.43168092,"remaining_time":6.209603732}, -{"learn":[0.2926524614],"iteration":748,"passed_time":18.45196518,"remaining_time":6.183502349}, -{"learn":[0.292532443],"iteration":749,"passed_time":18.4744705,"remaining_time":6.158156832}, -{"learn":[0.2923772006],"iteration":750,"passed_time":18.4974505,"remaining_time":6.132976263}, -{"learn":[0.292133322],"iteration":751,"passed_time":18.52078053,"remaining_time":6.107916982}, -{"learn":[0.291968671],"iteration":752,"passed_time":18.54324045,"remaining_time":6.082576881}, -{"learn":[0.2918869516],"iteration":753,"passed_time":18.56544318,"remaining_time":6.057160508}, -{"learn":[0.2917246816],"iteration":754,"passed_time":18.58865144,"remaining_time":6.032078943}, -{"learn":[0.2916077821],"iteration":755,"passed_time":18.61393085,"remaining_time":6.007670802}, -{"learn":[0.2914285282],"iteration":756,"passed_time":18.64160854,"remaining_time":5.984030217}, -{"learn":[0.2913445284],"iteration":757,"passed_time":18.66491,"remaining_time":5.958981822}, -{"learn":[0.2913443551],"iteration":758,"passed_time":18.67365163,"remaining_time":5.929314943}, -{"learn":[0.291344066],"iteration":759,"passed_time":18.68183598,"remaining_time":5.899527152}, -{"learn":[0.2911691075],"iteration":760,"passed_time":18.70671,"remaining_time":5.8750377}, -{"learn":[0.2908231947],"iteration":761,"passed_time":18.73052052,"remaining_time":5.85021507}, -{"learn":[0.2907754775],"iteration":762,"passed_time":18.75434069,"remaining_time":5.825398092}, -{"learn":[0.2906135806],"iteration":763,"passed_time":18.77785035,"remaining_time":5.800487806}, -{"learn":[0.2905947266],"iteration":764,"passed_time":18.79727277,"remaining_time":5.774325622}, -{"learn":[0.2905295128],"iteration":765,"passed_time":18.81722706,"remaining_time":5.748343516}, -{"learn":[0.2902453894],"iteration":766,"passed_time":18.8405561,"remaining_time":5.723402309}, -{"learn":[0.2900319175],"iteration":767,"passed_time":18.86818989,"remaining_time":5.699765697}, -{"learn":[0.2899129422],"iteration":768,"passed_time":18.89480903,"remaining_time":5.675813895}, -{"learn":[0.289784147],"iteration":769,"passed_time":18.92259459,"remaining_time":5.65220358}, -{"learn":[0.2896433582],"iteration":770,"passed_time":18.95342224,"remaining_time":5.629485984}, -{"learn":[0.2893137629],"iteration":771,"passed_time":18.98132175,"remaining_time":5.605882591}, -{"learn":[0.2892767962],"iteration":772,"passed_time":19.00473325,"remaining_time":5.580950126}, -{"learn":[0.2890654442],"iteration":773,"passed_time":19.02796904,"remaining_time":5.55597029}, -{"learn":[0.2889086488],"iteration":774,"passed_time":19.05106703,"remaining_time":5.530954945}, -{"learn":[0.2887625489],"iteration":775,"passed_time":19.07288043,"remaining_time":5.505573731}, -{"learn":[0.2886341007],"iteration":776,"passed_time":19.09188604,"remaining_time":5.479395864}, -{"learn":[0.2886019791],"iteration":777,"passed_time":19.11521274,"remaining_time":5.454469444}, -{"learn":[0.2883053437],"iteration":778,"passed_time":19.14616913,"remaining_time":5.431711654}, -{"learn":[0.2881800888],"iteration":779,"passed_time":19.17758908,"remaining_time":5.409063588}, -{"learn":[0.2881493372],"iteration":780,"passed_time":19.2048689,"remaining_time":5.385232125}, -{"learn":[0.2879469616],"iteration":781,"passed_time":19.22949891,"remaining_time":5.360653148}, -{"learn":[0.2878030143],"iteration":782,"passed_time":19.2543558,"remaining_time":5.336136921}, -{"learn":[0.2876184323],"iteration":783,"passed_time":19.27809709,"remaining_time":5.311312464}, -{"learn":[0.2873371785],"iteration":784,"passed_time":19.30222025,"remaining_time":5.286595354}, -{"learn":[0.287291682],"iteration":785,"passed_time":19.32579239,"remaining_time":5.261729735}, -{"learn":[0.2870997336],"iteration":786,"passed_time":19.34894999,"remaining_time":5.236755206}, -{"learn":[0.2869277017],"iteration":787,"passed_time":19.37326393,"remaining_time":5.212096386}, -{"learn":[0.2868849395],"iteration":788,"passed_time":19.40280941,"remaining_time":5.188837498}, -{"learn":[0.2866008202],"iteration":789,"passed_time":19.43469769,"remaining_time":5.166185462}, -{"learn":[0.286433075],"iteration":790,"passed_time":19.46118519,"remaining_time":5.142083065}, -{"learn":[0.2863247094],"iteration":791,"passed_time":19.48432218,"remaining_time":5.117094713}, -{"learn":[0.2861530229],"iteration":792,"passed_time":19.50804413,"remaining_time":5.092263727}, -{"learn":[0.2860601397],"iteration":793,"passed_time":19.53011588,"remaining_time":5.067007394}, -{"learn":[0.285782435],"iteration":794,"passed_time":19.55303951,"remaining_time":5.041978741}, -{"learn":[0.2857395573],"iteration":795,"passed_time":19.57553156,"remaining_time":5.016844771}, -{"learn":[0.2855575819],"iteration":796,"passed_time":19.59854296,"remaining_time":4.991849714}, -{"learn":[0.2855155269],"iteration":797,"passed_time":19.62208312,"remaining_time":4.966993471}, -{"learn":[0.2853027357],"iteration":798,"passed_time":19.65210334,"remaining_time":4.943770678}, -{"learn":[0.2852479317],"iteration":799,"passed_time":19.67522216,"remaining_time":4.918805541}, -{"learn":[0.2851592302],"iteration":800,"passed_time":19.69927286,"remaining_time":4.894076529}, -{"learn":[0.2851054653],"iteration":801,"passed_time":19.72196036,"remaining_time":4.869012657}, -{"learn":[0.2850244642],"iteration":802,"passed_time":19.74401728,"remaining_time":4.843800004}, -{"learn":[0.2847988254],"iteration":803,"passed_time":19.76599931,"remaining_time":4.818576947}, -{"learn":[0.2847954492],"iteration":804,"passed_time":19.77443812,"remaining_time":4.790081285}, -{"learn":[0.2847668538],"iteration":805,"passed_time":19.79611254,"remaining_time":4.764821133}, -{"learn":[0.2846572393],"iteration":806,"passed_time":19.81859879,"remaining_time":4.739764022}, -{"learn":[0.2843730264],"iteration":807,"passed_time":19.84128682,"remaining_time":4.714761224}, -{"learn":[0.284141588],"iteration":808,"passed_time":19.86445555,"remaining_time":4.689877639}, -{"learn":[0.284041018],"iteration":809,"passed_time":19.89360124,"remaining_time":4.66640029}, -{"learn":[0.2839261452],"iteration":810,"passed_time":19.91740236,"remaining_time":4.641663434}, -{"learn":[0.2837666765],"iteration":811,"passed_time":19.94034852,"remaining_time":4.616730937}, -{"learn":[0.2836468321],"iteration":812,"passed_time":19.97762223,"remaining_time":4.595098841}, -{"learn":[0.2835959553],"iteration":813,"passed_time":20.00746692,"remaining_time":4.571730771}, -{"learn":[0.2834490287],"iteration":814,"passed_time":20.0425443,"remaining_time":4.549534595}, -{"learn":[0.2833510414],"iteration":815,"passed_time":20.08029393,"remaining_time":4.527909416}, -{"learn":[0.2833281488],"iteration":816,"passed_time":20.13046868,"remaining_time":4.509027868}, -{"learn":[0.2832314365],"iteration":817,"passed_time":20.18125584,"remaining_time":4.490206068}, -{"learn":[0.2831363442],"iteration":818,"passed_time":20.21374897,"remaining_time":4.467263204}, -{"learn":[0.2830386545],"iteration":819,"passed_time":20.24440593,"remaining_time":4.443893986}, -{"learn":[0.2829967032],"iteration":820,"passed_time":20.26934245,"remaining_time":4.419259804}, -{"learn":[0.2828641845],"iteration":821,"passed_time":20.29211314,"remaining_time":4.394155886}, -{"learn":[0.2825780004],"iteration":822,"passed_time":20.31456744,"remaining_time":4.368989596}, -{"learn":[0.2823101112],"iteration":823,"passed_time":20.33763218,"remaining_time":4.343960272}, -{"learn":[0.2821905518],"iteration":824,"passed_time":20.3598163,"remaining_time":4.318748912}, -{"learn":[0.2819471832],"iteration":825,"passed_time":20.38282979,"remaining_time":4.293719593}, -{"learn":[0.2819286265],"iteration":826,"passed_time":20.41034151,"remaining_time":4.269636131}, -{"learn":[0.2818280875],"iteration":827,"passed_time":20.45157014,"remaining_time":4.248393797}, -{"learn":[0.2817546833],"iteration":828,"passed_time":20.48226,"remaining_time":4.224929385}, -{"learn":[0.281587275],"iteration":829,"passed_time":20.50552826,"remaining_time":4.199927474}, -{"learn":[0.2814154303],"iteration":830,"passed_time":20.52883315,"remaining_time":4.174937188}, -{"learn":[0.2813141668],"iteration":831,"passed_time":20.55206209,"remaining_time":4.149935615}, -{"learn":[0.2812636016],"iteration":832,"passed_time":20.57503672,"remaining_time":4.124887314}, -{"learn":[0.2812172885],"iteration":833,"passed_time":20.59771147,"remaining_time":4.099784297}, -{"learn":[0.281044403],"iteration":834,"passed_time":20.62116367,"remaining_time":4.074840726}, -{"learn":[0.2809039898],"iteration":835,"passed_time":20.6444309,"remaining_time":4.049864436}, -{"learn":[0.2807492094],"iteration":836,"passed_time":20.67501646,"remaining_time":4.026317424}, -{"learn":[0.2807239878],"iteration":837,"passed_time":20.70039035,"remaining_time":4.001746106}, -{"learn":[0.2804031359],"iteration":838,"passed_time":20.7230494,"remaining_time":3.976651911}, -{"learn":[0.2803187933],"iteration":839,"passed_time":20.74560852,"remaining_time":3.951544481}, -{"learn":[0.280178431],"iteration":840,"passed_time":20.7676303,"remaining_time":3.92634152}, -{"learn":[0.2800356414],"iteration":841,"passed_time":20.78986737,"remaining_time":3.901186513}, -{"learn":[0.2798041757],"iteration":842,"passed_time":20.82095241,"remaining_time":3.877686274}, -{"learn":[0.2796980093],"iteration":843,"passed_time":20.86209174,"remaining_time":3.856026435}, -{"learn":[0.2795734447],"iteration":844,"passed_time":20.91418815,"remaining_time":3.83633037}, -{"learn":[0.2794519833],"iteration":845,"passed_time":20.9700609,"remaining_time":3.817245129}, -{"learn":[0.2793843487],"iteration":846,"passed_time":21.03050779,"remaining_time":3.798899282}, -{"learn":[0.2792873292],"iteration":847,"passed_time":21.07558948,"remaining_time":3.7777}, -{"learn":[0.2790298494],"iteration":848,"passed_time":21.12625627,"remaining_time":3.757437806}, -{"learn":[0.2788323685],"iteration":849,"passed_time":21.16095811,"remaining_time":3.734286725}, -{"learn":[0.2786864684],"iteration":850,"passed_time":21.19017393,"remaining_time":3.710147963}, -{"learn":[0.2785577462],"iteration":851,"passed_time":21.21701221,"remaining_time":3.685584281}, -{"learn":[0.2783806677],"iteration":852,"passed_time":21.25896675,"remaining_time":3.663620296}, -{"learn":[0.2783359299],"iteration":853,"passed_time":21.30383455,"remaining_time":3.642107547}, -{"learn":[0.2779284052],"iteration":854,"passed_time":21.35587999,"remaining_time":3.621757424}, -{"learn":[0.2778033989],"iteration":855,"passed_time":21.40426189,"remaining_time":3.600716954}, -{"learn":[0.2776226122],"iteration":856,"passed_time":21.46367464,"remaining_time":3.581453294}, -{"learn":[0.2775176091],"iteration":857,"passed_time":21.52034093,"remaining_time":3.561641505}, -{"learn":[0.277464614],"iteration":858,"passed_time":21.56305994,"remaining_time":3.539454542}, -{"learn":[0.2773883128],"iteration":859,"passed_time":21.60634761,"remaining_time":3.517312402}, -{"learn":[0.2772957947],"iteration":860,"passed_time":21.65155055,"remaining_time":3.495430344}, -{"learn":[0.27707483],"iteration":861,"passed_time":21.70220186,"remaining_time":3.474366423}, -{"learn":[0.2770458448],"iteration":862,"passed_time":21.7451042,"remaining_time":3.452003796}, -{"learn":[0.2770211473],"iteration":863,"passed_time":21.81058221,"remaining_time":3.4331472}, -{"learn":[0.2769134335],"iteration":864,"passed_time":21.86328773,"remaining_time":3.412189415}, -{"learn":[0.2767272068],"iteration":865,"passed_time":21.91124204,"remaining_time":3.390423133}, -{"learn":[0.2766651275],"iteration":866,"passed_time":21.95803491,"remaining_time":3.368418273}, -{"learn":[0.2766236015],"iteration":867,"passed_time":21.98865411,"remaining_time":3.343896707}, -{"learn":[0.2764190352],"iteration":868,"passed_time":22.01628927,"remaining_time":3.318911271}, -{"learn":[0.2763464641],"iteration":869,"passed_time":22.03879351,"remaining_time":3.293153053}, -{"learn":[0.2762459842],"iteration":870,"passed_time":22.06084269,"remaining_time":3.267334911}, -{"learn":[0.2761180515],"iteration":871,"passed_time":22.08344645,"remaining_time":3.241606818}, -{"learn":[0.275946872],"iteration":872,"passed_time":22.10540595,"remaining_time":3.21579216}, -{"learn":[0.2757959937],"iteration":873,"passed_time":22.1273718,"remaining_time":3.189987238}, -{"learn":[0.2757647864],"iteration":874,"passed_time":22.14955984,"remaining_time":3.164222834}, -{"learn":[0.2756470463],"iteration":875,"passed_time":22.17206941,"remaining_time":3.138512109}, -{"learn":[0.2755577091],"iteration":876,"passed_time":22.20870126,"remaining_time":3.114789344}, -{"learn":[0.2754184544],"iteration":877,"passed_time":22.25209122,"remaining_time":3.091976229}, -{"learn":[0.2753339669],"iteration":878,"passed_time":22.29594659,"remaining_time":3.069180361}, -{"learn":[0.2752650527],"iteration":879,"passed_time":22.34520085,"remaining_time":3.047072843}, -{"learn":[0.2751829758],"iteration":880,"passed_time":22.39111612,"remaining_time":3.024452688}, -{"learn":[0.2749553951],"iteration":881,"passed_time":22.45076853,"remaining_time":3.003617558}, -{"learn":[0.2746921572],"iteration":882,"passed_time":22.50653576,"remaining_time":2.98217971}, -{"learn":[0.274531533],"iteration":883,"passed_time":22.549468,"remaining_time":2.958979963}, -{"learn":[0.2744750271],"iteration":884,"passed_time":22.57161604,"remaining_time":2.933034853}, -{"learn":[0.2744017506],"iteration":885,"passed_time":22.59489076,"remaining_time":2.907243281}, -{"learn":[0.2742392046],"iteration":886,"passed_time":22.61704765,"remaining_time":2.881314976}, -{"learn":[0.2740790607],"iteration":887,"passed_time":22.64893968,"remaining_time":2.856623022}, -{"learn":[0.2740407752],"iteration":888,"passed_time":22.70215534,"remaining_time":2.834577326}, -{"learn":[0.2738901483],"iteration":889,"passed_time":22.7535678,"remaining_time":2.812238717}, -{"learn":[0.2737557],"iteration":890,"passed_time":22.7960782,"remaining_time":2.788745818}, -{"learn":[0.2734666852],"iteration":891,"passed_time":22.83855164,"remaining_time":2.765205804}, -{"learn":[0.2732677571],"iteration":892,"passed_time":22.88274713,"remaining_time":2.741829724}, -{"learn":[0.2731920043],"iteration":893,"passed_time":22.97414922,"remaining_time":2.72400427}, -{"learn":[0.2729943916],"iteration":894,"passed_time":23.02020561,"remaining_time":2.700694513}, -{"learn":[0.2728667147],"iteration":895,"passed_time":23.06679197,"remaining_time":2.677395496}, -{"learn":[0.2728023199],"iteration":896,"passed_time":23.08897489,"remaining_time":2.651242378}, -{"learn":[0.2726450733],"iteration":897,"passed_time":23.11081782,"remaining_time":2.625059485}, -{"learn":[0.2724540231],"iteration":898,"passed_time":23.13305855,"remaining_time":2.598930939}, -{"learn":[0.2722533675],"iteration":899,"passed_time":23.15498608,"remaining_time":2.572776231}, -{"learn":[0.2719798723],"iteration":900,"passed_time":23.17690447,"remaining_time":2.546629903}, -{"learn":[0.271838961],"iteration":901,"passed_time":23.20607422,"remaining_time":2.521280791}, -{"learn":[0.2716784004],"iteration":902,"passed_time":23.23319485,"remaining_time":2.495703102}, -{"learn":[0.2715997004],"iteration":903,"passed_time":23.26018112,"remaining_time":2.47010773}, -{"learn":[0.2715553961],"iteration":904,"passed_time":23.28532586,"remaining_time":2.444315975}, -{"learn":[0.2715040967],"iteration":905,"passed_time":23.30905326,"remaining_time":2.418378594}, -{"learn":[0.2714110852],"iteration":906,"passed_time":23.33292333,"remaining_time":2.392460717}, -{"learn":[0.2711783584],"iteration":907,"passed_time":23.35614585,"remaining_time":2.366481738}, -{"learn":[0.2709994568],"iteration":908,"passed_time":23.3780827,"remaining_time":2.340380117}, -{"learn":[0.2709026458],"iteration":909,"passed_time":23.40132538,"remaining_time":2.314416795}, -{"learn":[0.2707555722],"iteration":910,"passed_time":23.42400284,"remaining_time":2.288404229}, -{"learn":[0.2704601695],"iteration":911,"passed_time":23.44978174,"remaining_time":2.262698238}, -{"learn":[0.2702425665],"iteration":912,"passed_time":23.47564167,"remaining_time":2.236999808}, -{"learn":[0.2701770836],"iteration":913,"passed_time":23.50186451,"remaining_time":2.211335172}, -{"learn":[0.2699971732],"iteration":914,"passed_time":23.52737442,"remaining_time":2.185603088}, -{"learn":[0.269885267],"iteration":915,"passed_time":23.5500863,"remaining_time":2.159614901}, -{"learn":[0.2697787171],"iteration":916,"passed_time":23.57260904,"remaining_time":2.133616739}, -{"learn":[0.2697367678],"iteration":917,"passed_time":23.59423385,"remaining_time":2.107545943}, -{"learn":[0.2697244921],"iteration":918,"passed_time":23.61617665,"remaining_time":2.08151285}, -{"learn":[0.2695088772],"iteration":919,"passed_time":23.63857522,"remaining_time":2.05552828}, -{"learn":[0.2692360607],"iteration":920,"passed_time":23.66064219,"remaining_time":2.029523055}, -{"learn":[0.2691868859],"iteration":921,"passed_time":23.70105795,"remaining_time":2.005078655}, -{"learn":[0.2689761885],"iteration":922,"passed_time":23.74595053,"remaining_time":1.980973121}, -{"learn":[0.2687792851],"iteration":923,"passed_time":23.78731312,"remaining_time":1.956532248}, -{"learn":[0.2683329367],"iteration":924,"passed_time":23.82670762,"remaining_time":1.931895212}, -{"learn":[0.2682383468],"iteration":925,"passed_time":23.8676536,"remaining_time":1.907350288}, -{"learn":[0.2681411189],"iteration":926,"passed_time":23.90665807,"remaining_time":1.882617086}, -{"learn":[0.2680166243],"iteration":927,"passed_time":23.95383044,"remaining_time":1.858486844}, -{"learn":[0.2680097861],"iteration":928,"passed_time":24.00201139,"remaining_time":1.834384078}, -{"learn":[0.2678649617],"iteration":929,"passed_time":24.03147583,"remaining_time":1.808820762}, -{"learn":[0.2677926982],"iteration":930,"passed_time":24.05396793,"remaining_time":1.782732317}, -{"learn":[0.2676177519],"iteration":931,"passed_time":24.07625836,"remaining_time":1.756636876}, -{"learn":[0.2675419733],"iteration":932,"passed_time":24.09823464,"remaining_time":1.730527032}, -{"learn":[0.2674892708],"iteration":933,"passed_time":24.12017091,"remaining_time":1.704423212}, -{"learn":[0.2673888832],"iteration":934,"passed_time":24.14221881,"remaining_time":1.678336067}, -{"learn":[0.2673408241],"iteration":935,"passed_time":24.16428228,"remaining_time":1.652258618}, -{"learn":[0.267061597],"iteration":936,"passed_time":24.18717108,"remaining_time":1.626245228}, -{"learn":[0.2670483357],"iteration":937,"passed_time":24.21444774,"remaining_time":1.600528529}, -{"learn":[0.2669986935],"iteration":938,"passed_time":24.23981304,"remaining_time":1.574684341}, -{"learn":[0.2667914988],"iteration":939,"passed_time":24.2623561,"remaining_time":1.548661028}, -{"learn":[0.2666629717],"iteration":940,"passed_time":24.28508323,"remaining_time":1.522656653}, -{"learn":[0.2663673411],"iteration":941,"passed_time":24.30729083,"remaining_time":1.496627249}, -{"learn":[0.2662679127],"iteration":942,"passed_time":24.32898627,"remaining_time":1.470574992}, -{"learn":[0.2661806153],"iteration":943,"passed_time":24.35133577,"remaining_time":1.444570766}, -{"learn":[0.2660864679],"iteration":944,"passed_time":24.37363009,"remaining_time":1.418571063}, -{"learn":[0.2660772833],"iteration":945,"passed_time":24.39239275,"remaining_time":1.392377599}, -{"learn":[0.2659919549],"iteration":946,"passed_time":24.4160891,"remaining_time":1.366475948}, -{"learn":[0.2659294851],"iteration":947,"passed_time":24.43827206,"remaining_time":1.340495936}, -{"learn":[0.2658864129],"iteration":948,"passed_time":24.46472254,"remaining_time":1.314753266}, -{"learn":[0.2656973273],"iteration":949,"passed_time":24.49066288,"remaining_time":1.288982257}, -{"learn":[0.2654822842],"iteration":950,"passed_time":24.51928759,"remaining_time":1.263349203}, -{"learn":[0.2654357361],"iteration":951,"passed_time":24.54243954,"remaining_time":1.237433926}, -{"learn":[0.2652483245],"iteration":952,"passed_time":24.56490013,"remaining_time":1.211490353}, -{"learn":[0.2650786501],"iteration":953,"passed_time":24.58736673,"remaining_time":1.185554371}, -{"learn":[0.2650437914],"iteration":954,"passed_time":24.60931258,"remaining_time":1.159601116}, -{"learn":[0.2647589672],"iteration":955,"passed_time":24.63138292,"remaining_time":1.133661975}, -{"learn":[0.2645760187],"iteration":956,"passed_time":24.65376702,"remaining_time":1.107745018}, -{"learn":[0.2644273667],"iteration":957,"passed_time":24.67566451,"remaining_time":1.081814102}, -{"learn":[0.2642487937],"iteration":958,"passed_time":24.69985831,"remaining_time":1.055989771}, -{"learn":[0.2641295931],"iteration":959,"passed_time":24.72576284,"remaining_time":1.030240118}, -{"learn":[0.2639643656],"iteration":960,"passed_time":24.75146344,"remaining_time":1.004481867}, -{"learn":[0.2638271273],"iteration":961,"passed_time":24.77349924,"remaining_time":0.9785789721}, -{"learn":[0.26378499],"iteration":962,"passed_time":24.79605048,"remaining_time":0.9527039126}, -{"learn":[0.263585605],"iteration":963,"passed_time":24.81817395,"remaining_time":0.926819774}, -{"learn":[0.2635169052],"iteration":964,"passed_time":24.84010583,"remaining_time":0.9009364807}, -{"learn":[0.2634345598],"iteration":965,"passed_time":24.8624533,"remaining_time":0.8750759961}, -{"learn":[0.2634097593],"iteration":966,"passed_time":24.88446723,"remaining_time":0.8492113947}, -{"learn":[0.2633306114],"iteration":967,"passed_time":24.90657225,"remaining_time":0.8233577603}, -{"learn":[0.2631360168],"iteration":968,"passed_time":24.92874625,"remaining_time":0.79751407}, -{"learn":[0.2629773219],"iteration":969,"passed_time":24.95092926,"remaining_time":0.7716782246}, -{"learn":[0.262887109],"iteration":970,"passed_time":24.9825894,"remaining_time":0.7461329482}, -{"learn":[0.2627283493],"iteration":971,"passed_time":25.00857418,"remaining_time":0.720411602}, -{"learn":[0.2626493335],"iteration":972,"passed_time":25.03449893,"remaining_time":0.6946880484}, -{"learn":[0.2625417584],"iteration":973,"passed_time":25.0570851,"remaining_time":0.6688749616}, -{"learn":[0.2623745457],"iteration":974,"passed_time":25.08006808,"remaining_time":0.6430786686}, -{"learn":[0.2622252779],"iteration":975,"passed_time":25.10275279,"remaining_time":0.6172808064}, -{"learn":[0.2620765279],"iteration":976,"passed_time":25.12650391,"remaining_time":0.5915144215}, -{"learn":[0.2619056227],"iteration":977,"passed_time":25.14859496,"remaining_time":0.565714815}, -{"learn":[0.2616868552],"iteration":978,"passed_time":25.17038647,"remaining_time":0.5399163594}, -{"learn":[0.2614966561],"iteration":979,"passed_time":25.19430345,"remaining_time":0.5141694582}, -{"learn":[0.2614164281],"iteration":980,"passed_time":25.21690348,"remaining_time":0.488400781}, -{"learn":[0.2613355646],"iteration":981,"passed_time":25.24687944,"remaining_time":0.4627737576}, -{"learn":[0.2611604482],"iteration":982,"passed_time":25.26973736,"remaining_time":0.4370147865}, -{"learn":[0.2609467509],"iteration":983,"passed_time":25.29197863,"remaining_time":0.4112516851}, -{"learn":[0.2608803914],"iteration":984,"passed_time":25.31431985,"remaining_time":0.3854972567}, -{"learn":[0.2608064874],"iteration":985,"passed_time":25.33675271,"remaining_time":0.3597510527}, -{"learn":[0.2607424461],"iteration":986,"passed_time":25.35896906,"remaining_time":0.334008711}, -{"learn":[0.2604634089],"iteration":987,"passed_time":25.38110387,"remaining_time":0.3082725167}, -{"learn":[0.2603511649],"iteration":988,"passed_time":25.40489471,"remaining_time":0.282562024}, -{"learn":[0.2603052916],"iteration":989,"passed_time":25.42704056,"remaining_time":0.2568387935}, -{"learn":[0.2601502245],"iteration":990,"passed_time":25.45103872,"remaining_time":0.231139605}, -{"learn":[0.259927874],"iteration":991,"passed_time":25.47547957,"remaining_time":0.2054474159}, -{"learn":[0.2597611063],"iteration":992,"passed_time":25.50295153,"remaining_time":0.1797791145}, -{"learn":[0.2597041835],"iteration":993,"passed_time":25.52553775,"remaining_time":0.1540776926}, -{"learn":[0.2594450403],"iteration":994,"passed_time":25.55414859,"remaining_time":0.128412807}, -{"learn":[0.2593932196],"iteration":995,"passed_time":25.57650936,"remaining_time":0.1027169051}, -{"learn":[0.2592866892],"iteration":996,"passed_time":25.59858627,"remaining_time":0.07702683932}, -{"learn":[0.2591544901],"iteration":997,"passed_time":25.62038117,"remaining_time":0.05134344924}, -{"learn":[0.2591143866],"iteration":998,"passed_time":25.64281049,"remaining_time":0.02566847897}, -{"learn":[0.2589307024],"iteration":999,"passed_time":25.66502601,"remaining_time":0} -]} \ No newline at end of file diff --git a/metagpt/roles/catboost_info/learn/events.out.tfevents b/metagpt/roles/catboost_info/learn/events.out.tfevents deleted file mode 100644 index 47650f04ff5c490dc79edd3488548c212b0c2dce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54870 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 Date: Thu, 14 Dec 2023 15:49:01 +0800 Subject: [PATCH 06/23] update --- .gitignore | 1 + config/config.yaml | 98 ---------------------------------------------- 2 files changed, 1 insertion(+), 98 deletions(-) delete mode 100644 config/config.yaml diff --git a/.gitignore b/.gitignore index f2ccde1d1..76283319f 100644 --- a/.gitignore +++ b/.gitignore @@ -168,3 +168,4 @@ output.wav metagpt/roles/idea_agent.py .aider* /tests/metagpt/actions/check_data.py +/config/config.yaml diff --git a/config/config.yaml b/config/config.yaml deleted file mode 100644 index 694251f17..000000000 --- a/config/config.yaml +++ /dev/null @@ -1,98 +0,0 @@ -# DO NOT MODIFY THIS FILE, create a new key.yaml, define OPENAI_API_KEY. -# The configuration of key.yaml has a higher priority and will not enter git - -#### if OpenAI -## The official OPENAI_API_BASE is https://api.openai.com/v1 -## If the official OPENAI_API_BASE is not available, we recommend using the [openai-forward](https://github.com/beidongjiedeguang/openai-forward). -## Or, you can configure OPENAI_PROXY to access official OPENAI_API_BASE. -#OPENAI_API_BASE: "https://api.openai.com/v1" -#OPENAI_PROXY: "http://127.0.0.1:8118" -#OPENAI_API_KEY: "YOUR_API_KEY" # set the value to sk-xxx if you host the openai interface for open llm model -OPENAI_API_MODEL: "gpt-4" -MAX_TOKENS: 1500 -RPM: 10 - -#### if Spark -#SPARK_APPID : "YOUR_APPID" -#SPARK_API_SECRET : "YOUR_APISecret" -#SPARK_API_KEY : "YOUR_APIKey" -#DOMAIN : "generalv2" -#SPARK_URL : "ws://spark-api.xf-yun.com/v2.1/chat" - -#### if Anthropic -#Anthropic_API_KEY: "YOUR_API_KEY" - -#### if AZURE, check https://github.com/openai/openai-cookbook/blob/main/examples/azure/chat.ipynb -#### You can use ENGINE or DEPLOYMENT mode -OPENAI_API_TYPE: "azure" -OPENAI_API_BASE: "https://deepwisdom.openai.azure.com/" -OPENAI_API_KEY: "02ae6058d09849c691176befeae2107c" -#OPENAI_API_VERSION: "2023-05-15" -OPENAI_API_VERSION: "2023-07-01-preview" -DEPLOYMENT_ID: "GPT-4" -OPENAI_API_ENGINE: "gpt-4" - -#### if zhipuai from `https://open.bigmodel.cn`. You can set here or export API_KEY="YOUR_API_KEY" -# ZHIPUAI_API_KEY: "YOUR_API_KEY" - -#### for Search - -## Supported values: serpapi/google/serper/ddg -#SEARCH_ENGINE: serpapi - -## Visit https://serpapi.com/ to get key. -#SERPAPI_API_KEY: "YOUR_API_KEY" - -## Visit https://console.cloud.google.com/apis/credentials to get key. -#GOOGLE_API_KEY: "YOUR_API_KEY" -## Visit https://programmablesearchengine.google.com/controlpanel/create to get id. -#GOOGLE_CSE_ID: "YOUR_CSE_ID" - -## Visit https://serper.dev/ to get key. -#SERPER_API_KEY: "YOUR_API_KEY" - -#### for web access - -## Supported values: playwright/selenium -#WEB_BROWSER_ENGINE: playwright - -## Supported values: chromium/firefox/webkit, visit https://playwright.dev/python/docs/api/class-browsertype -##PLAYWRIGHT_BROWSER_TYPE: chromium - -## Supported values: chrome/firefox/edge/ie, visit https://www.selenium.dev/documentation/webdriver/browsers/ -# SELENIUM_BROWSER_TYPE: chrome - -#### for TTS - -#AZURE_TTS_SUBSCRIPTION_KEY: "YOUR_API_KEY" -#AZURE_TTS_REGION: "eastus" - -#### for Stable Diffusion -## Use SD service, based on https://github.com/AUTOMATIC1111/stable-diffusion-webui -SD_URL: "YOUR_SD_URL" -SD_T2I_API: "/sdapi/v1/txt2img" - -#### for Execution -#LONG_TERM_MEMORY: false - -#### for Mermaid CLI -## If you installed mmdc (Mermaid CLI) only for metagpt then enable the following configuration. -#PUPPETEER_CONFIG: "./config/puppeteer-config.json" -#MMDC: "./node_modules/.bin/mmdc" - - -### for calc_usage -# CALC_USAGE: false - -### for Research -MODEL_FOR_RESEARCHER_SUMMARY: gpt-3.5-turbo -MODEL_FOR_RESEARCHER_REPORT: gpt-3.5-turbo-16k - -### choose the engine for mermaid conversion, -# default is nodejs, you can change it to playwright,pyppeteer or ink -# MERMAID_ENGINE: nodejs - -### browser path for pyppeteer engine, support Chrome, Chromium,MS Edge -#PYPPETEER_EXECUTABLE_PATH: "/usr/bin/google-chrome-stable" - -PROMPT_FORMAT: json #json or markdown \ No newline at end of file From 5ba3fe9be8530c34dc325ad3c9c910cbba9ed908 Mon Sep 17 00:00:00 2001 From: stellahsr Date: Thu, 14 Dec 2023 15:52:20 +0800 Subject: [PATCH 07/23] update: use default WriteCodeWithTools --- metagpt/actions/write_analysis_code.py | 25 -------- metagpt/roles/ml_engineer.py | 87 +++++++++++++------------- 2 files changed, 42 insertions(+), 70 deletions(-) diff --git a/metagpt/actions/write_analysis_code.py b/metagpt/actions/write_analysis_code.py index 1cfc28811..136a4956f 100644 --- a/metagpt/actions/write_analysis_code.py +++ b/metagpt/actions/write_analysis_code.py @@ -202,32 +202,7 @@ class WriteCodeWithTools(BaseWriteAnalysisCode): module_name=module_name, tool_catalog=tool_catalog, ) - code_steps_ = eval(code_steps) - print(code_steps_) - new_code = "" - tool_context = "" - for idx, (step_id, step_instruction) in enumerate(code_steps_.items()): - prompt = TOOL_USAGE_PROMPT.format( - user_requirement=plan.goal, - history_code=code_context, - current_task=plan.current_task.instruction, - column_info=column_info, - special_prompt=special_prompt, - code_steps=step_instruction, - module_name=module_name, - tool_catalog=tool_catalog, - ) - - tool_config = create_func_config(CODE_GENERATOR_WITH_TOOLS) - - rsp = await self.llm.aask_code(prompt, **tool_config) - logger.info(f"rsp is: {rsp}") - new_code = new_code + "\n\n" + rsp["code"] - code_context = code_context + "\n\n" + new_code - tool_context = tool_context + "\n\n" + prompt - context = [Message(content=tool_context, role="user")] - return context, new_code else: diff --git a/metagpt/roles/ml_engineer.py b/metagpt/roles/ml_engineer.py index fa006b061..b38c752a4 100644 --- a/metagpt/roles/ml_engineer.py +++ b/metagpt/roles/ml_engineer.py @@ -1,4 +1,4 @@ -from typing import List +from typing import List import json from datetime import datetime @@ -42,24 +42,24 @@ class UpdateDataColumns(Action): class MLEngineer(Role): def __init__( - self, name="ABC", profile="MLEngineer", goal="", auto_run: bool = False + self, name="ABC", profile="MLEngineer", goal="", auto_run: bool = False ): super().__init__(name=name, profile=profile, goal=goal) self._set_react_mode(react_mode="plan_and_act") self._watch([DownloadData, SubmitResult]) - + self.plan = Plan(goal=goal) self.use_tools = False self.use_code_steps = False self.execute_code = ExecutePyCode() self.auto_run = auto_run self.data_desc = {} - + # memory for working on each task, discarded each time a task is done self.working_memory = Memory() - + async def _plan_and_act(self): - + ### Actions in a multi-agent multi-turn setting ### memories = self.get_memories() if memories: @@ -69,29 +69,29 @@ class MLEngineer(Role): elif latest_event == SubmitResult: # self reflect on previous plan outcomes and think about how to improve the plan, add to working memory await self._reflect() - + # get feedback for improvement from human, add to working memory await self._ask_review(trigger=ReviewConst.TASK_REVIEW_TRIGGER) - + ### Common Procedure in both single- and multi-agent setting ### # create initial plan and update until confirmation await self._update_plan() - + while self.plan.current_task: task = self.plan.current_task logger.info(f"ready to take on task {task}") - + # take on current task code, result, success = await self._write_and_exec_code() - + # ask for acceptance, users can other refuse and change tasks in the plan review, task_result_confirmed = await self._ask_review(trigger=ReviewConst.TASK_REVIEW_TRIGGER) - + if self.auto_run: # if human confirms the task result, then we deem the task completed, regardless of whether the code run succeeds; # if auto mode, then the code run has to succeed for the task to be considered completed task_result_confirmed = success - + if task_result_confirmed: # tick off this task and record progress task.code = code @@ -100,12 +100,13 @@ class MLEngineer(Role): self.working_memory.clear() if self.use_tools: - success, new_code = await self._update_data_columns() + success, new_code = await self._update_data_columns() if success: task.code = task.code + "\n\n" + new_code - + confirmed_and_more = (ReviewConst.CONTINUE_WORD[0] in review.lower() - and review.lower() not in ReviewConst.CONTINUE_WORD[0]) # "confirm, ... (more content, such as changing downstream tasks)" + and review.lower() not in ReviewConst.CONTINUE_WORD[ + 0]) # "confirm, ... (more content, such as changing downstream tasks)" if confirmed_and_more: self.working_memory.add(Message(content=review, role="user", cause_by=AskReview)) await self._update_plan(review) @@ -114,23 +115,23 @@ class MLEngineer(Role): # Ask the Role to redo this task with help of review feedback, # useful when the code run is successful but the procedure or result is not what we want continue - + else: # update plan according to user's feedback and to take on changed tasks await self._update_plan(review) completed_plan_memory = self.get_useful_memories() # completed plan as a outcome self._rc.memory.add(completed_plan_memory[0]) # add to persistent memory - + summary = await SummarizeAnalysis().run(self.plan) rsp = Message(content=summary, cause_by=SummarizeAnalysis) self._rc.memory.add(rsp) - + # save code using datetime.now or keywords related to the goal of your project (plan.goal). project_record = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") save_code_file(name=project_record, code_context=self.execute_code.nb, file_format="ipynb") return rsp - + async def _update_data_columns(self): rsp = await UpdateDataColumns().run(self.plan) is_update, code = rsp["is_update"], rsp["code"] @@ -147,23 +148,19 @@ class MLEngineer(Role): if self.use_code_steps else "" ) - + counter = 0 success = False debug_context = [] - + while not success and counter < max_retry: context = self.get_useful_memories() - # print("*" * 10) - # print(context) - # print("*" * 10) - # breakpoint() if counter > 0 and self.use_tools: code = await DebugCode().run( plan=self.plan.current_task.instruction, - code=code, - runtime_result=self.working_memory.get(), + code=code, + runtime_result=self.working_memory.get(), context=debug_context ) logger.info(f"new code \n{code}") @@ -185,30 +182,30 @@ class MLEngineer(Role): ) debug_context = tool_context cause_by = WriteCodeWithTools - + self.working_memory.add( Message(content=code, role="assistant", cause_by=cause_by) ) - + result, success = await self.execute_code.run(code) print(result) self.working_memory.add( Message(content=result, role="user", cause_by=ExecutePyCode) ) - + if "!pip" in code: success = False - + counter += 1 - + if not success and counter >= max_retry: logger.info("coding failed!") review, _ = await self._ask_review(auto_run=False, trigger=ReviewConst.CODE_REVIEW_TRIGGER) if ReviewConst.CHANGE_WORD[0] in review: counter = 0 # redo the task again with help of human suggestions - + return code, result, success - + async def _ask_review(self, auto_run: bool = None, trigger: str = ReviewConst.TASK_REVIEW_TRIGGER): auto_run = auto_run or self.auto_run if not auto_run: @@ -218,7 +215,7 @@ class MLEngineer(Role): self.working_memory.add(Message(content=review, role="user", cause_by=AskReview)) return review, confirmed return "", True - + async def _update_plan(self, review: str = "", max_tasks: int = 3, max_retries: int = 3): plan_confirmed = False while not plan_confirmed: @@ -229,7 +226,7 @@ class MLEngineer(Role): self.working_memory.add( Message(content=rsp, role="assistant", cause_by=WritePlan) ) - + # precheck plan before asking reviews is_plan_valid, error = precheck_update_plan_from_rsp(rsp, self.plan) if not is_plan_valid and max_retries > 0: @@ -238,11 +235,11 @@ class MLEngineer(Role): self.working_memory.add(Message(content=error_msg, role="assistant", cause_by=WritePlan)) max_retries -= 1 continue - + _, plan_confirmed = await self._ask_review(trigger=ReviewConst.TASK_REVIEW_TRIGGER) - + update_plan_from_rsp(rsp, self.plan) - + self.working_memory.clear() async def _reflect(self): @@ -254,7 +251,7 @@ class MLEngineer(Role): reflection = await Reflect().run(context=context) self.working_memory.add(Message(content=reflection, role="assistant")) self.working_memory.add(Message(content=Reflect.REWRITE_PLAN_INSTRUCTION, role="user")) - + def get_useful_memories(self, task_exclude_field=None) -> List[Message]: """find useful memories only to reduce context length and improve performance""" # TODO dataset description , code steps @@ -271,9 +268,9 @@ class MLEngineer(Role): user_requirement=user_requirement, data_desc=data_desc, tasks=tasks, current_task=current_task ) context_msg = [Message(content=context, role="user")] - - return context_msg + self.get_working_memories() + return context_msg + self.get_working_memories() + def get_working_memories(self) -> List[Message]: return self.working_memory.get() @@ -298,7 +295,6 @@ if __name__ == "__main__": # data_path = f"{DATA_PATH}/santander-customer-transaction-prediction" # requirement = f"This is a customers financial dataset. Your goal is to predict which customers will make a specific transaction in the future. The target column is target. Perform data analysis, data preprocessing, feature engineering, and modeling to predict the target. Report F1 Score on the eval data. Train data path: '{data_path}/split_train.csv', eval data path: '{data_path}/split_eval.csv' ." - save_dir = "" save_dir = DATA_PATH / "save" / "2023-12-14_15-11-40" @@ -365,7 +361,8 @@ if __name__ == "__main__": role = MLEngineer(goal=requirement, auto_run=auto_run) role.plan = Plan(**plan) role.execute_code = ExecutePyCode(nb) - import pdb;pdb.set_trace() + import pdb; + pdb.set_trace() else: logger.info("Run from scratch") role = MLEngineer(goal=requirement, auto_run=auto_run) From 82ccdde687ff55734bfe16353d1511ea34c3f4ed Mon Sep 17 00:00:00 2001 From: stellahsr Date: Thu, 14 Dec 2023 17:18:35 +0800 Subject: [PATCH 08/23] use tools --- metagpt/roles/ml_engineer.py | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/metagpt/roles/ml_engineer.py b/metagpt/roles/ml_engineer.py index b38c752a4..bd46ae79a 100644 --- a/metagpt/roles/ml_engineer.py +++ b/metagpt/roles/ml_engineer.py @@ -49,8 +49,8 @@ class MLEngineer(Role): self._watch([DownloadData, SubmitResult]) self.plan = Plan(goal=goal) - self.use_tools = False - self.use_code_steps = False + self.use_tools = True + self.use_code_steps = True self.execute_code = ExecutePyCode() self.auto_run = auto_run self.data_desc = {} @@ -101,8 +101,8 @@ class MLEngineer(Role): if self.use_tools: success, new_code = await self._update_data_columns() - if success: - task.code = task.code + "\n\n" + new_code + if success: + task.code = task.code + "\n\n" + new_code confirmed_and_more = (ReviewConst.CONTINUE_WORD[0] in review.lower() and review.lower() not in ReviewConst.CONTINUE_WORD[ @@ -245,9 +245,7 @@ class MLEngineer(Role): async def _reflect(self): context = self.get_memories() context = "\n".join([str(msg) for msg in context]) - # print("*" * 10) - # print(context) - # print("*" * 10) + reflection = await Reflect().run(context=context) self.working_memory.add(Message(content=reflection, role="assistant")) self.working_memory.add(Message(content=Reflect.REWRITE_PLAN_INSTRUCTION, role="user")) @@ -296,7 +294,7 @@ if __name__ == "__main__": # requirement = f"This is a customers financial dataset. Your goal is to predict which customers will make a specific transaction in the future. The target column is target. Perform data analysis, data preprocessing, feature engineering, and modeling to predict the target. Report F1 Score on the eval data. Train data path: '{data_path}/split_train.csv', eval data path: '{data_path}/split_eval.csv' ." save_dir = "" - save_dir = DATA_PATH / "save" / "2023-12-14_15-11-40" + # save_dir = DATA_PATH / "save" / "2023-12-14_16-58-03" def load_history(save_dir: str = save_dir): @@ -328,13 +326,14 @@ if __name__ == "__main__": Returns: Path: The path to the saved history directory. """ - save_path = Path(save_dir) if save_dir else DATA_PATH / "save" / datetime.now().strftime( + # save_path = Path(save_dir) if save_dir else DATA_PATH / "save" / datetime.now().strftime( + # '%Y-%m-%d_%H-%M-%S') + save_path = DATA_PATH / "save" / datetime.now().strftime( '%Y-%m-%d_%H-%M-%S') - # overwrite + # overwrite exist trajectory save_path.mkdir(parents=True, exist_ok=True) plan = role.plan.dict() - logger.info(f"Plan is {plan}") with open(save_path / "plan.json", "w", encoding="utf-8") as plan_file: json.dump(plan, plan_file, indent=4, ensure_ascii=False) @@ -361,8 +360,7 @@ if __name__ == "__main__": role = MLEngineer(goal=requirement, auto_run=auto_run) role.plan = Plan(**plan) role.execute_code = ExecutePyCode(nb) - import pdb; - pdb.set_trace() + else: logger.info("Run from scratch") role = MLEngineer(goal=requirement, auto_run=auto_run) From b5f3034cbb0e2d40032951c00d5344e18dedc66c Mon Sep 17 00:00:00 2001 From: stellahsr Date: Thu, 14 Dec 2023 17:19:03 +0800 Subject: [PATCH 09/23] add check --- metagpt/actions/write_analysis_code.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/metagpt/actions/write_analysis_code.py b/metagpt/actions/write_analysis_code.py index 136a4956f..dda6c66cd 100644 --- a/metagpt/actions/write_analysis_code.py +++ b/metagpt/actions/write_analysis_code.py @@ -107,7 +107,8 @@ class WriteCodeWithTools(BaseWriteAnalysisCode): if self.schema_path is not None: self._load_tools(schema_path) - + logger.info(f"available_tools: {len(self.available_tools)}") + def _load_tools(self, schema_path): """Load tools from yaml file""" yml_files = schema_path.glob("*.yml") @@ -202,7 +203,7 @@ class WriteCodeWithTools(BaseWriteAnalysisCode): module_name=module_name, tool_catalog=tool_catalog, ) - + else: From c91503cf655c9a0044f9ffba6e2f92df32bd6c39 Mon Sep 17 00:00:00 2001 From: stellahsr Date: Thu, 14 Dec 2023 17:30:01 +0800 Subject: [PATCH 10/23] rm comments --- .gitignore | 2 -- metagpt/roles/ml_engineer.py | 16 ---------------- 2 files changed, 18 deletions(-) diff --git a/.gitignore b/.gitignore index 76283319f..d01469a36 100644 --- a/.gitignore +++ b/.gitignore @@ -167,5 +167,3 @@ tmp output.wav metagpt/roles/idea_agent.py .aider* -/tests/metagpt/actions/check_data.py -/config/config.yaml diff --git a/metagpt/roles/ml_engineer.py b/metagpt/roles/ml_engineer.py index bd46ae79a..cd2104c4b 100644 --- a/metagpt/roles/ml_engineer.py +++ b/metagpt/roles/ml_engineer.py @@ -274,29 +274,13 @@ class MLEngineer(Role): if __name__ == "__main__": - requirement = "Run data analysis on sklearn Iris dataset, include a plot" - # requirement = "Run data analysis on sklearn Diabetes dataset, include a plot" - # requirement = "Run data analysis on sklearn Wine recognition dataset, include a plot, and train a model to predict wine class (20% as validation), and show validation accuracy" - # requirement = "Run data analysis on sklearn Wisconsin Breast Cancer dataset, include a plot, train a model to predict targets (20% as validation), and show validation accuracy" - # requirement = "Run EDA and visualization on this dataset, train a model to predict survival, report metrics on validation set (20%), dataset: workspace/titanic/train.csv" - - # requirement = "Perform data analysis on the provided data. Train a model to predict the target variable Survived. Include data preprocessing, feature engineering, and modeling in your pipeline. The metric is accuracy." - - # data_path = f"{DATA_PATH}/titanic" - # requirement = f"This is a titanic passenger survival dataset, your goal is to predict passenger survival outcome. The target column is Survived. Perform data analysis, data preprocessing, feature engineering, and modeling to predict the target. Report accuracy on the eval data. Train data path: '{data_path}/split_train.csv', eval data path: '{data_path}/split_eval.csv'." - # requirement = f"Run data analysis on sklearn Wine recognition dataset, include a plot, and train a model to predict wine class (20% as validation), and show validation accuracy" - # data_path = f"{DATA_PATH}/icr-identify-age-related-conditions" - # requirement = f"This is a medical dataset with over fifty anonymized health characteristics linked to three age-related conditions. Your goal is to predict whether a subject has or has not been diagnosed with one of these conditions.The target column is Class. Perform data analysis, data preprocessing, feature engineering, and modeling to predict the target. Report f1 score on the eval data. Train data path: {data_path}/split_train.csv, eval data path: {data_path}/split_eval.csv." data_path = f"{DATA_PATH}/house-prices-advanced-regression-techniques" requirement = f"This is a house price dataset, your goal is to predict the sale price of a property based on its features. The target column is SalePrice. Perform data analysis, data preprocessing, feature engineering, and modeling to predict the target. Report RMSE between the logarithm of the predicted value and the logarithm of the observed sales price on the eval data. Train data path: '{data_path}/split_train.csv', eval data path: '{data_path}/split_eval.csv'." - # data_path = f"{DATA_PATH}/santander-customer-transaction-prediction" - # requirement = f"This is a customers financial dataset. Your goal is to predict which customers will make a specific transaction in the future. The target column is target. Perform data analysis, data preprocessing, feature engineering, and modeling to predict the target. Report F1 Score on the eval data. Train data path: '{data_path}/split_train.csv', eval data path: '{data_path}/split_eval.csv' ." save_dir = "" # save_dir = DATA_PATH / "save" / "2023-12-14_16-58-03" - def load_history(save_dir: str = save_dir): """ Load history from the specified save directory. From 4953929025e669aacc7aa2852d717df168e76655 Mon Sep 17 00:00:00 2001 From: stellahsr Date: Thu, 14 Dec 2023 21:44:18 +0800 Subject: [PATCH 11/23] add --- metagpt/actions/write_analysis_code.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/metagpt/actions/write_analysis_code.py b/metagpt/actions/write_analysis_code.py index dda6c66cd..abfecbbc1 100644 --- a/metagpt/actions/write_analysis_code.py +++ b/metagpt/actions/write_analysis_code.py @@ -193,16 +193,16 @@ class WriteCodeWithTools(BaseWriteAnalysisCode): module_name = ML_MODULE_MAP[task_type] - prompt = TOOL_USAGE_PROMPT.format( - user_requirement=plan.goal, - history_code=code_context, - current_task=plan.current_task.instruction, - column_info=column_info, - special_prompt=special_prompt, - code_steps=code_steps, - module_name=module_name, - tool_catalog=tool_catalog, - ) + prompt = TOOL_USAGE_PROMPT.format( + user_requirement=plan.goal, + history_code=code_context, + current_task=plan.current_task.instruction, + column_info=column_info, + special_prompt=special_prompt, + code_steps=code_steps, + module_name=module_name, + tool_catalog=tool_catalog, + ) From cf6577334c7bb72089ff25a2e4d6707300f05267 Mon Sep 17 00:00:00 2001 From: stellahsr Date: Thu, 14 Dec 2023 21:46:19 +0800 Subject: [PATCH 12/23] update --- metagpt/actions/write_analysis_code.py | 103 ++++++++++++------------- 1 file changed, 49 insertions(+), 54 deletions(-) diff --git a/metagpt/actions/write_analysis_code.py b/metagpt/actions/write_analysis_code.py index abfecbbc1..6970fb4f0 100644 --- a/metagpt/actions/write_analysis_code.py +++ b/metagpt/actions/write_analysis_code.py @@ -24,9 +24,9 @@ from metagpt.utils.common import create_func_config, remove_comments class BaseWriteAnalysisCode(Action): - DEFAULT_SYSTEM_MSG = """You are Code Interpreter, a world-class programmer that can complete any goal by executing code. Strictly follow the plan and generate code step by step. Each step of the code will be executed on the user's machine, and the user will provide the code execution results to you.""" # prompt reference: https://github.com/KillianLucas/open-interpreter/blob/v0.1.4/interpreter/system_message.txt - REUSE_CODE_INSTRUCTION = """ATTENTION: DONT include codes from previous tasks in your current code block, include new codes only, DONT repeat codes!""" - + DEFAULT_SYSTEM_MSG = """You are Code Interpreter, a world-class programmer that can complete any goal by executing code. Strictly follow the plan and generate code step by step. Each step of the code will be executed on the user's machine, and the user will provide the code execution results to you.**Notice: The code for the next step depends on the code for the previous step. Must reuse variables in the lastest other code directly, dont creat it again, it is very import for you. Use !pip install in a standalone block to install missing packages.**""" # prompt reference: https://github.com/KillianLucas/open-interpreter/blob/v0.1.4/interpreter/system_message.txt + # REUSE_CODE_INSTRUCTION = """ATTENTION: DONT include codes from previous tasks in your current code block, include new codes only, DONT repeat codes!""" + def process_msg(self, prompt: Union[str, List[Dict], Message, List[Message]], system_msg: str = None): default_system_msg = system_msg or self.DEFAULT_SYSTEM_MSG # 全部转成list @@ -45,23 +45,23 @@ class BaseWriteAnalysisCode(Action): messages.append(p.to_dict()) elif isinstance(p.content, dict) and "code" in p.content: messages.append(p.content["code"]) - + # 添加默认的提示词 if ( - default_system_msg not in messages[0]["content"] - and messages[0]["role"] != "system" + default_system_msg not in messages[0]["content"] + and messages[0]["role"] != "system" ): messages.insert(0, {"role": "system", "content": default_system_msg}) elif ( - default_system_msg not in messages[0]["content"] - and messages[0]["role"] == "system" + default_system_msg not in messages[0]["content"] + and messages[0]["role"] == "system" ): messages[0] = { "role": "system", "content": messages[0]["content"] + default_system_msg, } return messages - + async def run( self, context: List[Message], plan: Plan = None, code_steps: str = "" ) -> str: @@ -79,19 +79,18 @@ class BaseWriteAnalysisCode(Action): class WriteCodeByGenerate(BaseWriteAnalysisCode): """Write code fully by generation""" - + def __init__(self, name: str = "", context=None, llm=None) -> str: super().__init__(name, context, llm) - + async def run( - self, - context: [List[Message]], - plan: Plan = None, - code_steps: str = "", - system_msg: str = None, - **kwargs, + self, + context: [List[Message]], + plan: Plan = None, + system_msg: str = None, + **kwargs, ) -> str: - context.append(Message(content=self.REUSE_CODE_INSTRUCTION, role="user")) + # context.append(Message(content=self.REUSE_CODE_INSTRUCTION, role="user")) prompt = self.process_msg(context, system_msg) code_content = await self.llm.aask_code(prompt, **kwargs) return code_content["code"] @@ -99,16 +98,15 @@ class WriteCodeByGenerate(BaseWriteAnalysisCode): class WriteCodeWithTools(BaseWriteAnalysisCode): """Write code with help of local available tools. Choose tools first, then generate code to use the tools""" - + def __init__(self, name: str = "", context=None, llm=None, schema_path=None): super().__init__(name, context, llm) self.schema_path = schema_path self.available_tools = {} - + if self.schema_path is not None: self._load_tools(schema_path) - logger.info(f"available_tools: {len(self.available_tools)}") - + def _load_tools(self, schema_path): """Load tools from yaml file""" yml_files = schema_path.glob("*.yml") @@ -116,7 +114,7 @@ class WriteCodeWithTools(BaseWriteAnalysisCode): module = yml_file.stem with open(yml_file, "r", encoding="utf-8") as f: self.available_tools[module] = yaml.safe_load(f) - + def _parse_recommend_tools(self, module: str, recommend_tools: list) -> dict: """ Parses and validates a list of recommended tools, and retrieves their schema from registry. @@ -133,15 +131,15 @@ class WriteCodeWithTools(BaseWriteAnalysisCode): for tool in recommend_tools: if tool in available_tools: valid_tools.append(tool) - + tool_catalog = {tool: self.available_tools[module][tool] for tool in valid_tools} return tool_catalog - + async def _tool_recommendation( - self, - task: str, - code_steps: str, - available_tools: dict, + self, + task: str, + code_steps: str, + available_tools: dict, ) -> list: """ Recommend tools for the specified task. @@ -163,26 +161,26 @@ class WriteCodeWithTools(BaseWriteAnalysisCode): rsp = await self.llm.aask_code(prompt, **tool_config) recommend_tools = rsp["recommend_tools"] return recommend_tools - + async def run( - self, - context: List[Message], - plan: Plan = None, - code_steps: str = "", - column_info: str = "", - **kwargs, + self, + context: List[Message], + plan: Plan = None, + column_info: str = "", + **kwargs, ) -> Tuple[List[Message], str]: task_type = plan.current_task.task_type available_tools = self.available_tools.get(task_type, {}) special_prompt = ML_SPECIFIC_PROMPT.get(task_type, "") - + code_steps = plan.current_task.code_steps + finished_tasks = plan.get_finished_tasks() code_context = [remove_comments(task.code) for task in finished_tasks] code_context = "\n\n".join(code_context) - + if len(available_tools) > 0: available_tools = {k: v["description"] for k, v in available_tools.items()} - + recommend_tools = await self._tool_recommendation( plan.current_task.instruction, code_steps, @@ -190,22 +188,19 @@ class WriteCodeWithTools(BaseWriteAnalysisCode): ) tool_catalog = self._parse_recommend_tools(task_type, recommend_tools) logger.info(f"Recommended tools: \n{recommend_tools}") - + module_name = ML_MODULE_MAP[task_type] - - prompt = TOOL_USAGE_PROMPT.format( - user_requirement=plan.goal, - history_code=code_context, - current_task=plan.current_task.instruction, - column_info=column_info, - special_prompt=special_prompt, - code_steps=code_steps, - module_name=module_name, - tool_catalog=tool_catalog, - ) - - + prompt = TOOL_USAGE_PROMPT.format( + user_requirement=plan.goal, + history_code=code_context, + current_task=plan.current_task.instruction, + column_info=column_info, + special_prompt=special_prompt, + code_steps=code_steps, + module_name=module_name, + tool_catalog=tool_catalog, + ) else: prompt = GENERATE_CODE_PROMPT.format( user_requirement=plan.goal, @@ -215,7 +210,7 @@ class WriteCodeWithTools(BaseWriteAnalysisCode): special_prompt=special_prompt, code_steps=code_steps, ) - + tool_config = create_func_config(CODE_GENERATOR_WITH_TOOLS) rsp = await self.llm.aask_code(prompt, **tool_config) context = [Message(content=prompt, role="user")] From 6a527f214a1ebe944823aadbc9f1bcfbaa3e6287 Mon Sep 17 00:00:00 2001 From: stellahsr Date: Fri, 15 Dec 2023 00:35:44 +0800 Subject: [PATCH 13/23] update: use utils/save_code_file --- metagpt/roles/ml_engineer.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/metagpt/roles/ml_engineer.py b/metagpt/roles/ml_engineer.py index d9a5027af..f7538ae2e 100644 --- a/metagpt/roles/ml_engineer.py +++ b/metagpt/roles/ml_engineer.py @@ -295,8 +295,6 @@ if __name__ == "__main__": requirement = f"This is a house price dataset, your goal is to predict the sale price of a property based on its features. The target column is SalePrice. Perform data analysis, data preprocessing, feature engineering, and modeling to predict the target. Report RMSE between the logarithm of the predicted value and the logarithm of the observed sales price on the eval data. Train data path: '{data_path}/split_train.csv', eval data path: '{data_path}/split_eval.csv'." save_dir = "" - - # save_dir = DATA_PATH / "output" / "2023-12-14_20-40-34" def load_history(save_dir: str = save_dir): From a42c4144a11058f3d44c2f8f154437de449cd506 Mon Sep 17 00:00:00 2001 From: stellahsr Date: Fri, 15 Dec 2023 00:37:01 +0800 Subject: [PATCH 14/23] iterative step to code --- metagpt/actions/write_analysis_code.py | 46 ++++++++++++++++++++------ 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/metagpt/actions/write_analysis_code.py b/metagpt/actions/write_analysis_code.py index 6970fb4f0..0d548b806 100644 --- a/metagpt/actions/write_analysis_code.py +++ b/metagpt/actions/write_analysis_code.py @@ -191,16 +191,42 @@ class WriteCodeWithTools(BaseWriteAnalysisCode): module_name = ML_MODULE_MAP[task_type] - prompt = TOOL_USAGE_PROMPT.format( - user_requirement=plan.goal, - history_code=code_context, - current_task=plan.current_task.instruction, - column_info=column_info, - special_prompt=special_prompt, - code_steps=code_steps, - module_name=module_name, - tool_catalog=tool_catalog, - ) + # prompt = TOOL_USAGE_PROMPT.format( + # user_requirement=plan.goal, + # history_code=code_context, + # current_task=plan.current_task.instruction, + # column_info=column_info, + # special_prompt=special_prompt, + # code_steps=code_steps, + # module_name=module_name, + # tool_catalog=tool_catalog, + # ) + code_steps_ = eval(code_steps) + print(code_steps_) + + new_code = "" + tool_context = "" + for idx, (step_id, step_instruction) in enumerate(code_steps_.items()): + prompt = TOOL_USAGE_PROMPT.format( + user_requirement=plan.goal, + history_code=code_context, + current_task=plan.current_task.instruction, + column_info=column_info, + special_prompt=special_prompt, + code_steps=step_instruction, + module_name=module_name, + tool_catalog=tool_catalog, + ) + + tool_config = create_func_config(CODE_GENERATOR_WITH_TOOLS) + + rsp = await self.llm.aask_code(prompt, **tool_config) + logger.info(f"rsp is: {rsp}") + new_code = new_code + "\n\n" + rsp["code"] + code_context = code_context + "\n\n" + new_code + tool_context = tool_context + "\n\n" + prompt + context = [Message(content=tool_context, role="user")] + return context, new_code else: prompt = GENERATE_CODE_PROMPT.format( user_requirement=plan.goal, From 6957c2df65f514e25e35f7ad3e89b9edf3a89041 Mon Sep 17 00:00:00 2001 From: stellahsr Date: Fri, 15 Dec 2023 00:41:13 +0800 Subject: [PATCH 15/23] revert to default --- metagpt/actions/write_analysis_code.py | 72 +++++++++++++------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/metagpt/actions/write_analysis_code.py b/metagpt/actions/write_analysis_code.py index 0d548b806..29e5397e3 100644 --- a/metagpt/actions/write_analysis_code.py +++ b/metagpt/actions/write_analysis_code.py @@ -191,42 +191,42 @@ class WriteCodeWithTools(BaseWriteAnalysisCode): module_name = ML_MODULE_MAP[task_type] - # prompt = TOOL_USAGE_PROMPT.format( - # user_requirement=plan.goal, - # history_code=code_context, - # current_task=plan.current_task.instruction, - # column_info=column_info, - # special_prompt=special_prompt, - # code_steps=code_steps, - # module_name=module_name, - # tool_catalog=tool_catalog, - # ) - code_steps_ = eval(code_steps) - print(code_steps_) - - new_code = "" - tool_context = "" - for idx, (step_id, step_instruction) in enumerate(code_steps_.items()): - prompt = TOOL_USAGE_PROMPT.format( - user_requirement=plan.goal, - history_code=code_context, - current_task=plan.current_task.instruction, - column_info=column_info, - special_prompt=special_prompt, - code_steps=step_instruction, - module_name=module_name, - tool_catalog=tool_catalog, - ) - - tool_config = create_func_config(CODE_GENERATOR_WITH_TOOLS) - - rsp = await self.llm.aask_code(prompt, **tool_config) - logger.info(f"rsp is: {rsp}") - new_code = new_code + "\n\n" + rsp["code"] - code_context = code_context + "\n\n" + new_code - tool_context = tool_context + "\n\n" + prompt - context = [Message(content=tool_context, role="user")] - return context, new_code + prompt = TOOL_USAGE_PROMPT.format( + user_requirement=plan.goal, + history_code=code_context, + current_task=plan.current_task.instruction, + column_info=column_info, + special_prompt=special_prompt, + code_steps=code_steps, + module_name=module_name, + tool_catalog=tool_catalog, + ) + # code_steps_ = eval(code_steps) + # print(code_steps_) + # + # new_code = "" + # tool_context = "" + # for idx, (step_id, step_instruction) in enumerate(code_steps_.items()): + # prompt = TOOL_USAGE_PROMPT.format( + # user_requirement=plan.goal, + # history_code=code_context, + # current_task=plan.current_task.instruction, + # column_info=column_info, + # special_prompt=special_prompt, + # code_steps=step_instruction, + # module_name=module_name, + # tool_catalog=tool_catalog, + # ) + # + # tool_config = create_func_config(CODE_GENERATOR_WITH_TOOLS) + # + # rsp = await self.llm.aask_code(prompt, **tool_config) + # logger.info(f"rsp is: {rsp}") + # new_code = new_code + "\n\n" + rsp["code"] + # code_context = code_context + "\n\n" + new_code + # tool_context = tool_context + "\n\n" + prompt + # context = [Message(content=tool_context, role="user")] + # return context, new_code else: prompt = GENERATE_CODE_PROMPT.format( user_requirement=plan.goal, From 9ea745553c964c5559083ead545c8dac805ea12d Mon Sep 17 00:00:00 2001 From: stellahsr Date: Fri, 15 Dec 2023 10:22:50 +0800 Subject: [PATCH 16/23] update: iterative step to generate code --- metagpt/actions/write_analysis_code.py | 74 +++++++++++++------------- 1 file changed, 38 insertions(+), 36 deletions(-) diff --git a/metagpt/actions/write_analysis_code.py b/metagpt/actions/write_analysis_code.py index 29e5397e3..cce36d8c9 100644 --- a/metagpt/actions/write_analysis_code.py +++ b/metagpt/actions/write_analysis_code.py @@ -191,42 +191,44 @@ class WriteCodeWithTools(BaseWriteAnalysisCode): module_name = ML_MODULE_MAP[task_type] - prompt = TOOL_USAGE_PROMPT.format( - user_requirement=plan.goal, - history_code=code_context, - current_task=plan.current_task.instruction, - column_info=column_info, - special_prompt=special_prompt, - code_steps=code_steps, - module_name=module_name, - tool_catalog=tool_catalog, - ) - # code_steps_ = eval(code_steps) - # print(code_steps_) - # - # new_code = "" - # tool_context = "" - # for idx, (step_id, step_instruction) in enumerate(code_steps_.items()): - # prompt = TOOL_USAGE_PROMPT.format( - # user_requirement=plan.goal, - # history_code=code_context, - # current_task=plan.current_task.instruction, - # column_info=column_info, - # special_prompt=special_prompt, - # code_steps=step_instruction, - # module_name=module_name, - # tool_catalog=tool_catalog, - # ) - # - # tool_config = create_func_config(CODE_GENERATOR_WITH_TOOLS) - # - # rsp = await self.llm.aask_code(prompt, **tool_config) - # logger.info(f"rsp is: {rsp}") - # new_code = new_code + "\n\n" + rsp["code"] - # code_context = code_context + "\n\n" + new_code - # tool_context = tool_context + "\n\n" + prompt - # context = [Message(content=tool_context, role="user")] - # return context, new_code + # prompt = TOOL_USAGE_PROMPT.format( + # user_requirement=plan.goal, + # history_code=code_context, + # current_task=plan.current_task.instruction, + # column_info=column_info, + # special_prompt=special_prompt, + # code_steps=code_steps, + # module_name=module_name, + # tool_catalog=tool_catalog, + # ) + + code_steps_ = eval(code_steps) + print(code_steps_) + + new_code = "" + tool_context = "" + for idx, (step_id, step_instruction) in enumerate(code_steps_.items()): + prompt = TOOL_USAGE_PROMPT.format( + user_requirement=plan.goal, + history_code=code_context, + current_task=plan.current_task.instruction, + column_info=column_info, + special_prompt=special_prompt, + code_steps=step_instruction, + module_name=module_name, + tool_catalog=tool_catalog, + ) + + tool_config = create_func_config(CODE_GENERATOR_WITH_TOOLS) + + rsp = await self.llm.aask_code(prompt, **tool_config) + logger.info(f"rsp is: {rsp}") + new_code = new_code + "\n\n" + rsp["code"] + code_context = code_context + "\n\n" + new_code + tool_context = tool_context + "\n\n" + prompt + context = [Message(content=tool_context, role="user")] + return context, new_code + else: prompt = GENERATE_CODE_PROMPT.format( user_requirement=plan.goal, From a723068f9f685241e32199c01be93a3758885d68 Mon Sep 17 00:00:00 2001 From: stellahsr Date: Fri, 15 Dec 2023 10:26:29 +0800 Subject: [PATCH 17/23] add --- config/config.yaml | 97 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 config/config.yaml diff --git a/config/config.yaml b/config/config.yaml new file mode 100644 index 000000000..17605307a --- /dev/null +++ b/config/config.yaml @@ -0,0 +1,97 @@ +# DO NOT MODIFY THIS FILE, create a new key.yaml, define OPENAI_API_KEY. +# The configuration of key.yaml has a higher priority and will not enter git + +#### if OpenAI +## The official OPENAI_API_BASE is https://api.openai.com/v1 +## If the official OPENAI_API_BASE is not available, we recommend using the [openai-forward](https://github.com/beidongjiedeguang/openai-forward). +## Or, you can configure OPENAI_PROXY to access official OPENAI_API_BASE. +OPENAI_API_BASE: "https://api.openai.com/v1" +#OPENAI_PROXY: "http://127.0.0.1:8118" +#OPENAI_API_KEY: "YOUR_API_KEY" # set the value to sk-xxx if you host the openai interface for open llm model +OPENAI_API_MODEL: "gpt-4" +MAX_TOKENS: 1500 +RPM: 10 + +#### if Spark +#SPARK_APPID : "YOUR_APPID" +#SPARK_API_SECRET : "YOUR_APISecret" +#SPARK_API_KEY : "YOUR_APIKey" +#DOMAIN : "generalv2" +#SPARK_URL : "ws://spark-api.xf-yun.com/v2.1/chat" + +#### if Anthropic +#Anthropic_API_KEY: "YOUR_API_KEY" + +#### if AZURE, check https://github.com/openai/openai-cookbook/blob/main/examples/azure/chat.ipynb +#### You can use ENGINE or DEPLOYMENT mode +#OPENAI_API_TYPE: "azure" +#OPENAI_API_BASE: "YOUR_AZURE_ENDPOINT" +#OPENAI_API_KEY: "YOUR_AZURE_API_KEY" +#OPENAI_API_VERSION: "YOUR_AZURE_API_VERSION" +#DEPLOYMENT_NAME: "YOUR_DEPLOYMENT_NAME" +#DEPLOYMENT_ID: "YOUR_DEPLOYMENT_ID" + +#### if zhipuai from `https://open.bigmodel.cn`. You can set here or export API_KEY="YOUR_API_KEY" +# ZHIPUAI_API_KEY: "YOUR_API_KEY" + +#### for Search + +## Supported values: serpapi/google/serper/ddg +#SEARCH_ENGINE: serpapi + +## Visit https://serpapi.com/ to get key. +#SERPAPI_API_KEY: "YOUR_API_KEY" + +## Visit https://console.cloud.google.com/apis/credentials to get key. +#GOOGLE_API_KEY: "YOUR_API_KEY" +## Visit https://programmablesearchengine.google.com/controlpanel/create to get id. +#GOOGLE_CSE_ID: "YOUR_CSE_ID" + +## Visit https://serper.dev/ to get key. +#SERPER_API_KEY: "YOUR_API_KEY" + +#### for web access + +## Supported values: playwright/selenium +#WEB_BROWSER_ENGINE: playwright + +## Supported values: chromium/firefox/webkit, visit https://playwright.dev/python/docs/api/class-browsertype +##PLAYWRIGHT_BROWSER_TYPE: chromium + +## Supported values: chrome/firefox/edge/ie, visit https://www.selenium.dev/documentation/webdriver/browsers/ +# SELENIUM_BROWSER_TYPE: chrome + +#### for TTS + +#AZURE_TTS_SUBSCRIPTION_KEY: "YOUR_API_KEY" +#AZURE_TTS_REGION: "eastus" + +#### for Stable Diffusion +## Use SD service, based on https://github.com/AUTOMATIC1111/stable-diffusion-webui +SD_URL: "YOUR_SD_URL" +SD_T2I_API: "/sdapi/v1/txt2img" + +#### for Execution +#LONG_TERM_MEMORY: false + +#### for Mermaid CLI +## If you installed mmdc (Mermaid CLI) only for metagpt then enable the following configuration. +#PUPPETEER_CONFIG: "./config/puppeteer-config.json" +#MMDC: "./node_modules/.bin/mmdc" + + +### for calc_usage +# CALC_USAGE: false + +### for Research +MODEL_FOR_RESEARCHER_SUMMARY: gpt-3.5-turbo +MODEL_FOR_RESEARCHER_REPORT: gpt-3.5-turbo-16k + +### choose the engine for mermaid conversion, +# default is nodejs, you can change it to playwright,pyppeteer or ink +# MERMAID_ENGINE: nodejs + +### browser path for pyppeteer engine, support Chrome, Chromium,MS Edge +#PYPPETEER_EXECUTABLE_PATH: "/usr/bin/google-chrome-stable" + +PROMPT_FORMAT: json #json or markdown \ No newline at end of file From 51ef51d516ee7674a56a5a35348f9e01d4b561ee Mon Sep 17 00:00:00 2001 From: stellahsr Date: Fri, 15 Dec 2023 10:27:28 +0800 Subject: [PATCH 18/23] revert --- metagpt/actions/write_analysis_code.py | 72 +++++++++++++------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/metagpt/actions/write_analysis_code.py b/metagpt/actions/write_analysis_code.py index cce36d8c9..34b605ea9 100644 --- a/metagpt/actions/write_analysis_code.py +++ b/metagpt/actions/write_analysis_code.py @@ -191,43 +191,43 @@ class WriteCodeWithTools(BaseWriteAnalysisCode): module_name = ML_MODULE_MAP[task_type] - # prompt = TOOL_USAGE_PROMPT.format( - # user_requirement=plan.goal, - # history_code=code_context, - # current_task=plan.current_task.instruction, - # column_info=column_info, - # special_prompt=special_prompt, - # code_steps=code_steps, - # module_name=module_name, - # tool_catalog=tool_catalog, - # ) + prompt = TOOL_USAGE_PROMPT.format( + user_requirement=plan.goal, + history_code=code_context, + current_task=plan.current_task.instruction, + column_info=column_info, + special_prompt=special_prompt, + code_steps=code_steps, + module_name=module_name, + tool_catalog=tool_catalog, + ) - code_steps_ = eval(code_steps) - print(code_steps_) - - new_code = "" - tool_context = "" - for idx, (step_id, step_instruction) in enumerate(code_steps_.items()): - prompt = TOOL_USAGE_PROMPT.format( - user_requirement=plan.goal, - history_code=code_context, - current_task=plan.current_task.instruction, - column_info=column_info, - special_prompt=special_prompt, - code_steps=step_instruction, - module_name=module_name, - tool_catalog=tool_catalog, - ) - - tool_config = create_func_config(CODE_GENERATOR_WITH_TOOLS) - - rsp = await self.llm.aask_code(prompt, **tool_config) - logger.info(f"rsp is: {rsp}") - new_code = new_code + "\n\n" + rsp["code"] - code_context = code_context + "\n\n" + new_code - tool_context = tool_context + "\n\n" + prompt - context = [Message(content=tool_context, role="user")] - return context, new_code + # code_steps_ = eval(code_steps) + # print(code_steps_) + # + # new_code = "" + # tool_context = "" + # for idx, (step_id, step_instruction) in enumerate(code_steps_.items()): + # prompt = TOOL_USAGE_PROMPT.format( + # user_requirement=plan.goal, + # history_code=code_context, + # current_task=plan.current_task.instruction, + # column_info=column_info, + # special_prompt=special_prompt, + # code_steps=step_instruction, + # module_name=module_name, + # tool_catalog=tool_catalog, + # ) + # + # tool_config = create_func_config(CODE_GENERATOR_WITH_TOOLS) + # + # rsp = await self.llm.aask_code(prompt, **tool_config) + # logger.info(f"rsp is: {rsp}") + # new_code = new_code + "\n\n" + rsp["code"] + # code_context = code_context + "\n\n" + new_code + # tool_context = tool_context + "\n\n" + prompt + # context = [Message(content=tool_context, role="user")] + # return context, new_code else: prompt = GENERATE_CODE_PROMPT.format( From 5db006334219a5d3d858d6c2ff9ab27461746765 Mon Sep 17 00:00:00 2001 From: mannaandpoem <1580466765@qq.com> Date: Tue, 19 Dec 2023 12:57:45 +0800 Subject: [PATCH 19/23] Add ml_engineer_simple.py for ablation experiments --- metagpt/roles/ml_engineer_simple.py | 148 ++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 metagpt/roles/ml_engineer_simple.py diff --git a/metagpt/roles/ml_engineer_simple.py b/metagpt/roles/ml_engineer_simple.py new file mode 100644 index 000000000..e66770211 --- /dev/null +++ b/metagpt/roles/ml_engineer_simple.py @@ -0,0 +1,148 @@ +import re +from typing import List +import json +from datetime import datetime + +import fire + +from metagpt.roles import Role +from metagpt.schema import Message +from metagpt.memory import Memory +from metagpt.logs import logger +from metagpt.actions.write_analysis_code import WriteCodeByGenerate +from metagpt.actions.ml_da_action import AskReview, ReviewConst +from metagpt.actions.execute_code import ExecutePyCode +from metagpt.roles.kaggle_manager import DownloadData +from metagpt.utils.save_code import save_code_file + +STRUCTURAL_CONTEXT_SIMPLE = """ +## User Requirement +{user_requirement} +## Data Description +{data_desc} +""" + +JUDGE_PROMPT_TEMPLATE = """ +# User Requirement +{user_requirement} +----- +# Context +{context} +----- +# State +Output "Ture" or "False". Judging from the code perspective, whether the user's needs have been completely fulfilled. +===== +# Finally output State, Thought and Next Action separately in one sentence +State: +Thought: +Next Action: +""" + + +class MLEngineerSimple(Role): + def __init__( + self, name="ABC", profile="MLEngineerSimple", goal="", auto_run: bool = False + ): + super().__init__(name=name, profile=profile, goal=goal) + self._set_react_mode(react_mode="react") + self._watch([DownloadData]) + self._init_actions([WriteCodeByGenerate, ExecutePyCode]) + + self.goal = goal + self.data_desc = "" + self.use_tools = False + self.use_code_steps = False + self.execute_code = ExecutePyCode() + self.auto_run = auto_run + + # memory for working on each task, discarded each time a task is done + self.working_memory = Memory() + + async def _act(self): + memories = self.get_memories() + if memories: + latest_event = memories[-1].cause_by + if latest_event == DownloadData: + self.data_desc = memories[-1].content + + await self._act_no_plan() + + # save code using datetime.now or keywords related to the goal of your project (plan.goal). + project_record = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") + save_code_file(name=project_record, code_context=self.execute_code.nb, file_format="ipynb") + + async def _act_no_plan(self, max_retry: int = 20): + counter = 0 + state = False + while not state and counter < max_retry: + context = self.get_useful_memories() + print(f"memories数量:{len(context)}") + # print("===\n" +str(context) + "\n===") + code = await WriteCodeByGenerate().run( + context=context, temperature=0.0 + ) + cause_by = WriteCodeByGenerate + self.working_memory.add( + Message(content=code, role="assistant", cause_by=cause_by) + ) + + result, success = await self.execute_code.run(code) + print(result) + self.working_memory.add( + Message(content=result, role="user", cause_by=ExecutePyCode) + ) + + if "!pip" in code: + success = False + + counter += 1 + + if not success and counter >= max_retry: + logger.info("coding failed!") + review, _ = await self._ask_review(auto_run=False, trigger=ReviewConst.CODE_REVIEW_TRIGGER) + if ReviewConst.CHANGE_WORD[0] in review: + counter = 0 # redo the task again with help of human suggestions + + completed_plan_memory = self.get_useful_memories() # completed plan as a outcome + self._rc.memory.add(completed_plan_memory[0]) # add to persistent memory + prompt = JUDGE_PROMPT_TEMPLATE.format(user_requirement=self.goal, context=completed_plan_memory) + rsp = await self._llm.aask(prompt) + self.working_memory.add( + Message(content=rsp, role="system") + ) + + matches = re.findall(r'\b(True|False)\b', rsp) + state = False if 'False' in matches else True + + async def _ask_review(self, auto_run: bool = None, trigger: str = ReviewConst.TASK_REVIEW_TRIGGER): + auto_run = auto_run or self.auto_run + if not auto_run: + context = self.get_useful_memories() + review, confirmed = await AskReview().run(context=context[-5:], trigger=trigger) + if not confirmed: + self.working_memory.add(Message(content=review, role="user", cause_by=AskReview)) + return review, confirmed + return "", True + + def get_useful_memories(self) -> List[Message]: + """find useful memories only to reduce context length and improve performance""" + user_requirement = self.goal + context = STRUCTURAL_CONTEXT_SIMPLE.format( + user_requirement=user_requirement, data_desc=self.data_desc + ) + context_msg = [Message(content=context, role="user")] + + return context_msg + self.get_working_memories() + + def get_working_memories(self, num=6) -> List[Message]: + return self.working_memory.get(num) # 默认为6 + + +if __name__ == "__main__": + requirement = "Run data analysis on sklearn Iris dataset, include a plot" + + async def main(requirement: str = requirement, auto_run: bool = True): + role = MLEngineerSimple(goal=requirement, auto_run=auto_run) + await role.run(requirement) + + fire.Fire(main) From 0f3c0c21e5996f5f28cd26e98fdb3b65da249df8 Mon Sep 17 00:00:00 2001 From: mannaandpoem <1580466765@qq.com> Date: Tue, 19 Dec 2023 18:50:49 +0800 Subject: [PATCH 20/23] update JUDGE_PROMPT_TEMPLATE in ml_engineer_simple.py --- metagpt/roles/ml_engineer_simple.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/metagpt/roles/ml_engineer_simple.py b/metagpt/roles/ml_engineer_simple.py index e66770211..cc7d8fc97 100644 --- a/metagpt/roles/ml_engineer_simple.py +++ b/metagpt/roles/ml_engineer_simple.py @@ -32,10 +32,10 @@ JUDGE_PROMPT_TEMPLATE = """ # State Output "Ture" or "False". Judging from the code perspective, whether the user's needs have been completely fulfilled. ===== -# Finally output State, Thought and Next Action separately in one sentence +# Output State("Ture" or "False") firstly, then output Thought and Next Steps for the code requirements based on the context respectively in one sentence State: Thought: -Next Action: +Next Steps: """ @@ -132,10 +132,10 @@ class MLEngineerSimple(Role): ) context_msg = [Message(content=context, role="user")] - return context_msg + self.get_working_memories() + return context_msg + self.get_working_memories(6) - def get_working_memories(self, num=6) -> List[Message]: - return self.working_memory.get(num) # 默认为6 + def get_working_memories(self, num=0) -> List[Message]: + return self.working_memory.get(num) # 默认为6 if __name__ == "__main__": From a0d2f9b6caaf4ecb5cbc2152a02cedc84060de03 Mon Sep 17 00:00:00 2001 From: stellahsr Date: Wed, 20 Dec 2023 11:14:59 +0800 Subject: [PATCH 21/23] update: rm async, mv to utils --- metagpt/roles/ml_engineer.py | 48 ++--------------------------- metagpt/utils/recovery_util.py | 56 ++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 45 deletions(-) create mode 100644 metagpt/utils/recovery_util.py diff --git a/metagpt/roles/ml_engineer.py b/metagpt/roles/ml_engineer.py index f7538ae2e..16ffe69db 100644 --- a/metagpt/roles/ml_engineer.py +++ b/metagpt/roles/ml_engineer.py @@ -3,8 +3,7 @@ import json from datetime import datetime import fire -import nbformat -from pathlib import Path + from metagpt.actions import Action from metagpt.actions.debug_code import DebugCode @@ -27,7 +26,7 @@ from metagpt.roles.kaggle_manager import DownloadData, SubmitResult from metagpt.schema import Message, Plan from metagpt.utils.common import remove_comments, create_func_config from metagpt.utils.save_code import save_code_file - +from metagpt.utils.recovery_util import save_history, load_history class UpdateDataColumns(Action): async def run(self, plan: Plan = None) -> dict: @@ -297,49 +296,8 @@ if __name__ == "__main__": save_dir = "" # save_dir = DATA_PATH / "output" / "2023-12-14_20-40-34" - def load_history(save_dir: str = save_dir): - """ - Load history from the specified save directory. - - Args: - save_dir (str): The directory from which to load the history. - - Returns: - Tuple: A tuple containing the loaded plan and notebook. - """ - - plan_path = Path(save_dir) / "plan.json" - nb_path = Path(save_dir) / "history_nb" / "code.ipynb" - plan = json.load(open(plan_path, "r", encoding="utf-8")) - nb = nbformat.read(open(nb_path, "r", encoding="utf-8"), as_version=nbformat.NO_CONVERT) - return plan, nb - async def save_history(role: Role = MLEngineer, save_dir: str = save_dir): - """ - Save history to the specified directory. - - Args: - role (Role): The role containing the plan and execute_code attributes. - save_dir (str): The directory to save the history. - - Returns: - Path: The path to the saved history directory. - """ - record_time = datetime.now().strftime('%Y-%m-%d_%H-%M-%S') - save_path = DATA_PATH / "output" / f"{record_time}" - - # overwrite exist trajectory - save_path.mkdir(parents=True, exist_ok=True) - - plan = role.plan.dict() - - with open(save_path / "plan.json", "w", encoding="utf-8") as plan_file: - json.dump(plan, plan_file, indent=4, ensure_ascii=False) - - save_code_file(name=Path(record_time) / "history_nb", code_context=role.execute_code.nb, file_format="ipynb") - return save_path - async def main(requirement: str = requirement, auto_run: bool = True, save_dir: str = save_dir): """ @@ -368,7 +326,7 @@ if __name__ == "__main__": await role.run(requirement) except Exception as e: - save_path = await save_history(role, save_dir) + save_path = save_history(role, save_dir) logger.exception(f"An error occurred: {e}, save trajectory here: {save_path}") diff --git a/metagpt/utils/recovery_util.py b/metagpt/utils/recovery_util.py new file mode 100644 index 000000000..ef4f0aca7 --- /dev/null +++ b/metagpt/utils/recovery_util.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +# @Date : 12/20/2023 11:07 AM +# @Author : stellahong (stellahong@fuzhi.ai) +# @Desc : +import nbformat +from pathlib import Path +import json +from datetime import datetime + +from metagpt.roles.role import Role +from metagpt.roles.ml_engineer import MLEngineer +from metagpt.const import DATA_PATH +from metagpt.utils.save_code import save_code_file + +def load_history(save_dir: str = ""): + """ + Load history from the specified save directory. + + Args: + save_dir (str): The directory from which to load the history. + + Returns: + Tuple: A tuple containing the loaded plan and notebook. + """ + + plan_path = Path(save_dir) / "plan.json" + nb_path = Path(save_dir) / "history_nb" / "code.ipynb" + plan = json.load(open(plan_path, "r", encoding="utf-8")) + nb = nbformat.read(open(nb_path, "r", encoding="utf-8"), as_version=nbformat.NO_CONVERT) + return plan, nb + + +def save_history(role: Role = MLEngineer, save_dir: str = ""): + """ + Save history to the specified directory. + + Args: + role (Role): The role containing the plan and execute_code attributes. + save_dir (str): The directory to save the history. + + Returns: + Path: The path to the saved history directory. + """ + record_time = datetime.now().strftime('%Y-%m-%d_%H-%M-%S') + save_path = DATA_PATH / "output" / f"{record_time}" + + # overwrite exist trajectory + save_path.mkdir(parents=True, exist_ok=True) + + plan = role.plan.dict() + + with open(save_path / "plan.json", "w", encoding="utf-8") as plan_file: + json.dump(plan, plan_file, indent=4, ensure_ascii=False) + + save_code_file(name=Path(record_time) / "history_nb", code_context=role.execute_code.nb, file_format="ipynb") + return save_path \ No newline at end of file From 0c42d55d64b1aa155a584c3feb26641bff5ae067 Mon Sep 17 00:00:00 2001 From: stellahsr Date: Wed, 20 Dec 2023 11:16:44 +0800 Subject: [PATCH 22/23] rm comments --- metagpt/actions/write_analysis_code.py | 28 +------------------------- 1 file changed, 1 insertion(+), 27 deletions(-) diff --git a/metagpt/actions/write_analysis_code.py b/metagpt/actions/write_analysis_code.py index 34b605ea9..ecbb68122 100644 --- a/metagpt/actions/write_analysis_code.py +++ b/metagpt/actions/write_analysis_code.py @@ -202,33 +202,7 @@ class WriteCodeWithTools(BaseWriteAnalysisCode): tool_catalog=tool_catalog, ) - # code_steps_ = eval(code_steps) - # print(code_steps_) - # - # new_code = "" - # tool_context = "" - # for idx, (step_id, step_instruction) in enumerate(code_steps_.items()): - # prompt = TOOL_USAGE_PROMPT.format( - # user_requirement=plan.goal, - # history_code=code_context, - # current_task=plan.current_task.instruction, - # column_info=column_info, - # special_prompt=special_prompt, - # code_steps=step_instruction, - # module_name=module_name, - # tool_catalog=tool_catalog, - # ) - # - # tool_config = create_func_config(CODE_GENERATOR_WITH_TOOLS) - # - # rsp = await self.llm.aask_code(prompt, **tool_config) - # logger.info(f"rsp is: {rsp}") - # new_code = new_code + "\n\n" + rsp["code"] - # code_context = code_context + "\n\n" + new_code - # tool_context = tool_context + "\n\n" + prompt - # context = [Message(content=tool_context, role="user")] - # return context, new_code - + else: prompt = GENERATE_CODE_PROMPT.format( user_requirement=plan.goal, From 48ef61c6e42c65aa38a5c4466c24191912198c4e Mon Sep 17 00:00:00 2001 From: stellahsr Date: Wed, 20 Dec 2023 14:46:29 +0800 Subject: [PATCH 23/23] change format --- metagpt/roles/ml_engineer.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/metagpt/roles/ml_engineer.py b/metagpt/roles/ml_engineer.py index 16ffe69db..33b570d1a 100644 --- a/metagpt/roles/ml_engineer.py +++ b/metagpt/roles/ml_engineer.py @@ -4,7 +4,6 @@ from datetime import datetime import fire - from metagpt.actions import Action from metagpt.actions.debug_code import DebugCode from metagpt.actions.execute_code import ExecutePyCode @@ -28,6 +27,7 @@ from metagpt.utils.common import remove_comments, create_func_config from metagpt.utils.save_code import save_code_file from metagpt.utils.recovery_util import save_history, load_history + class UpdateDataColumns(Action): async def run(self, plan: Plan = None) -> dict: finished_tasks = plan.get_finished_tasks() @@ -41,7 +41,7 @@ class UpdateDataColumns(Action): class MLEngineer(Role): def __init__( - self, name="ABC", profile="MLEngineer", goal="", auto_run: bool = False + self, name="ABC", profile="MLEngineer", goal="", auto_run: bool = False ): super().__init__(name=name, profile=profile, goal=goal) self._set_react_mode(react_mode="plan_and_act") @@ -104,8 +104,7 @@ class MLEngineer(Role): task.code = task.code + "\n\n" + new_code confirmed_and_more = (ReviewConst.CONTINUE_WORD[0] in review.lower() - and review.lower() not in ReviewConst.CONTINUE_WORD[ - 0]) # "confirm, ... (more content, such as changing downstream tasks)" + and review.lower() not in ReviewConst.CONTINUE_WORD[0]) # "confirm, ... (more content, such as changing downstream tasks)" if confirmed_and_more: self.working_memory.add(Message(content=review, role="user", cause_by=AskReview)) await self._update_plan(review) @@ -294,11 +293,10 @@ if __name__ == "__main__": requirement = f"This is a house price dataset, your goal is to predict the sale price of a property based on its features. The target column is SalePrice. Perform data analysis, data preprocessing, feature engineering, and modeling to predict the target. Report RMSE between the logarithm of the predicted value and the logarithm of the observed sales price on the eval data. Train data path: '{data_path}/split_train.csv', eval data path: '{data_path}/split_eval.csv'." save_dir = "" + + # save_dir = DATA_PATH / "output" / "2023-12-14_20-40-34" - - - async def main(requirement: str = requirement, auto_run: bool = True, save_dir: str = save_dir): """ The main function to run the MLEngineer with optional history loading.