File size: 6,241 Bytes
17a7095 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
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():
# config = Config(
# retries = {
# 'max_attempts': 3,
# 'mode': 'standard'
# },
# read_timeout=120, # Increase the timeout if needed
# connect_timeout=120
# )
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
# number of input parameters for model is missing.
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'],
# 'name': db_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']})
# {'name': db_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'],
# "model_id": model['id'],
# "interval": model['interval']
})
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['dataset']['name'] + "__" + boundary['targetColumn']['name']
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 |