| import os |
| from langchain_aws import ChatBedrock |
| import boto3 |
|
|
| from dotenv import load_dotenv |
| from pathlib import Path |
| from stable_baselines3.common.evaluation import evaluate_policy |
| from stable_baselines3 import PPO |
| from rl_environment import GeneralizedRLEnvironment |
|
|
| env_path = Path('.') / '.env' |
| load_dotenv(dotenv_path=env_path) |
|
|
| model_id = "us.anthropic.claude-3-5-haiku-20241022-v1:0" |
| region_name = os.environ.get("BEDROCK_MODEL_REGION", "us-east-1") |
|
|
| def get_llm(): |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| bedrock_client = boto3.client('bedrock-runtime', region_name=region_name) |
| llm = ChatBedrock( |
| client=bedrock_client, |
| model_id=model_id, |
| region_name=region_name, |
| model_kwargs={"temperature": 0.1} |
| ) |
| print("get_llm | region_name:", region_name) |
| return llm |
|
|
| |
| def process_input_json(observable_factors, constant_factor, model_selection, actions, boundaries): |
| processed_json = { |
| "state": { |
| "observable_factors": [], |
| "constant_factors": {}, |
| "model_predictions": [] |
| }, |
| "actions": { |
| "action_space": [], |
| "RL_boundaries": {} |
| }, |
| "rl_agent": "", |
| "environment": { |
| "step": [], |
| "reward": [] |
| } |
| } |
|
|
| for data in observable_factors.get('dataAccess', []): |
| db_name = data['label'] |
|
|
| for column in data.get('children', []): |
| processed_json['state']['observable_factors'].append({'name': column['label'], |
| |
| 'type': column['metadata']['DataType']}) |
|
|
| for data in observable_factors.get('workspace', []): |
| db_name = data['label'] |
|
|
| for column in data.get('children', []): |
| processed_json['state']['observable_factors'].append( |
| {'name': column['label'], 'type': column['metadata']['DataType']}) |
| |
|
|
| for constant in constant_factor: |
| processed_json['state']['constant_factors'][constant['name'].replace( |
| " ", "_")] = constant['value'] |
|
|
| for model in model_selection: |
| for target in model.get('targetColumns', []): |
| processed_json['state']['model_predictions'].append({"name": target, |
| "model_type": model['modelType'], |
| "number_of_values_to_derive": model['forecastHorizon'], |
| |
| |
| }) |
|
|
| for action in actions: |
| my_obj = {"name": action['actionName'].replace(" ", "_"), |
| "type": action['dataType'], |
| } |
|
|
| if 'values' in action: |
| my_obj['my_list'] = action['values'] |
|
|
| processed_json['actions']['action_space'].append(my_obj) |
|
|
| starting_values = {} |
| for boundary in boundaries: |
| |
| name = boundary['targetColumn']['name'] |
| processed_json['actions']['RL_boundaries'][name] = [ |
| boundary['lowerLimit'], boundary['upperLimit']] |
|
|
| if boundary['startingValue']: |
| starting_values[name] = boundary['startingValue'] |
|
|
| print("STARTING VALUES", starting_values) |
| for indx, obs in enumerate(processed_json['state']['observable_factors']): |
| print(obs['name']) |
| if obs['name'] in starting_values: |
| print("YES") |
| processed_json['state']['observable_factors'][indx]['starting_value'] = starting_values[obs['name']] |
|
|
| return processed_json |
|
|
| def evalute_final_json(json: dict): |
| env2 = GeneralizedRLEnvironment(json) |
| model = PPO("MlpPolicy", env2, verbose=1) |
| mean_reward, std_reward = evaluate_policy(model, env2, n_eval_episodes=1) |
|
|
| return mean_reward, std_reward |
|
|
| def get_variables_and_boundaries(json: dict): |
| details = """ |
| | Variable Name | Type | Number of Values in List | Values of list | Lower Limit | Upper Limit | |
| | --- | --- | --- | --- | --- | --- |""" |
| |
| row_details = "| {variable_name} | {type} | {number_of_values} | {values_of_list} | {lower_limit} | {upper_limit} |" |
|
|
| for obs in json['state']['observable_factors']: |
| details += "\n" + row_details.format(variable_name=obs['name'], type=obs['type'], number_of_values="N/A",values_of_list = "N/A", lower_limit=json['actions']['RL_boundaries'][obs['name']][0], upper_limit=json['actions']['RL_boundaries'][obs['name']][1]) |
| |
| for constant in json['state']['constant_factors']: |
| details += "\n" + row_details.format(variable_name=constant, type="double", number_of_values="N/A",values_of_list = "N/A", lower_limit="N/A", upper_limit="N/A") |
| |
| for model in json['state']['model_predictions']: |
| details += "\n" + row_details.format(variable_name=model['name'], type='list' if model['model_type'] == 'Train-Time-Series' else 'double', number_of_values=model['number_of_values_to_derive'] if model['model_type'] == 'Train-Time-Series' else 'N/A',values_of_list = "N/A", lower_limit=json['actions']['RL_boundaries'][model['name']][0], upper_limit=json['actions']['RL_boundaries'][model['name']][1]) |
| |
| for action in json['actions']['action_space']: |
| details += "\n" + row_details.format(variable_name=action['name'], type=action['type'], number_of_values="N/A",values_of_list = action['my_list'] if 'my_list' in action else "N/A", lower_limit=json['actions']['RL_boundaries'][action['name']][0], upper_limit=json['actions']['RL_boundaries'][action['name']][1]) |
| |
| return details |