Skip to content

Commit

Permalink
Merge pull request #109 from NextCenturyCorporation/development
Browse files Browse the repository at this point in the history
Dev to main
  • Loading branch information
nextcen-dgemoets authored Oct 25, 2024
2 parents 134d0ae + c8bd8b5 commit 96e939f
Show file tree
Hide file tree
Showing 6 changed files with 157 additions and 35 deletions.
23 changes: 18 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,9 @@ The following properties can be configured:
- `SCENARIO_DIRECTORY`
- default is `swagger_server/itm/data/%(EVALUATION_TYPE)s/scenarios/`
- `SOARTECH_URL`
- default is `http://10.216.38.125:8084`
- default is `http://10.216.38.25:8084`
- `ADEPT_URL`
- default is `http://10.216.38.70:8080`
- default is `http://10.216.38.101:8080`
- `SAVE_HISTORY`
- default is `True`
- `HISTORY_DIRECTORY`
Expand All @@ -49,6 +49,7 @@ The following properties can be configured:
- default is `True`
- `HISTORY_S3_BUCKET`
- default is `itm-ui-assets`
- A variety of ADEPT and SoarTech properties for filenames, scenario IDs, and alignment target IDs

*NOTE:* the trailing **`s`** in `.../data/%(EVALUATION_TYPE)s/...` is needed for string interpolation to work properly.

Expand All @@ -63,12 +64,24 @@ Please note:
3. Use `eval` for evaluation scenarios and `train` for training scenarios; and
4. The `id` should be derived from the scenario ID in the YAML file, although it isn't required, e.g., `qol`, `MJ2`, `urban`, etc.

## Usage
To run the server, please execute the following from the root directory:

## Installation and Usage
To install the server, run:
```
pip3 install -r requirements.txt
python -m swagger_server
```

To run the server, please execute from the root directory with the following usage:
```
usage: python -m swagger_server [-h] [-c CONFIG_GROUP] [-p PORT]
Specify Config Group, will default to the DEFAULT group
options:
-h, --help show this help message and exit
-c CONFIG_GROUP, --config_group CONFIG_GROUP
Specify the configuration group in config.ini used to launch the Swagger server (default = DEFAULT)
-p PORT, --port PORT Specify the port the Swagger server will listen on (default = 8080)
```

You can browse the API at:
Expand Down
35 changes: 31 additions & 4 deletions swagger_server/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,46 @@

import connexion
import os
import argparse
import builtins
import sys
from swagger_server import config_util

from swagger_server import encoder

PORT = os.getenv("TA3_PORT")

if (PORT is None or PORT == ""):
PORT = 8080

def main():
def main(args):

itm_port = PORT if args.port == None else args.port
itm_kwargs = {'title': 'ITM TA3 API'}

builtins.config_group = args.config_group

app = connexion.App(__name__, specification_dir='../swagger/')
app.app.json_encoder = encoder.JSONEncoder
app.add_api('swagger.yaml', arguments={'title': 'ITM TA3 API'}, pythonic_params=True)
app.run(port=PORT)
app.add_api('swagger.yaml', arguments=itm_kwargs, pythonic_params=True)
app.run(port=itm_port)


if __name__ == '__main__':
main()

parser = argparse.ArgumentParser(description='Specify Config Group, will default to the DEFAULT group', usage='python -m swagger_server [-h] -c CONFIG_GROUP -p PORT')
parser.add_argument('-c', '--config_group', dest='config_group', type=str, default="DEFAULT", help='Specify the configuration group in config.ini used to launch the Swagger server (default = DEFAULT)')
parser.add_argument('-p', '--port', dest='port', type=int, default=None, help='Specify the port the Swagger server will listen on (default = 8080)')
args = parser.parse_args()

#Checking for config_group in config.ini
config_util.check_ini()
config = config_util.read_ini()[0]
if args.config_group not in config:
print("The Config Group `" + args.config_group + "` does not exist in config.ini.")
sys.exit()

print("Swagger server launching with the `" + args.config_group + "` group (from config.ini)")


main(args)
77 changes: 76 additions & 1 deletion swagger_server/config.ini.template
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ SCENARIO_DIRECTORY=swagger_server/itm/data/%(EVALUATION_TYPE)s/scenarios/
; SOARTECH_URL=https://darpaitm.caci.com/soartech

; Prod Default URLs (use on production AWS only)
SOARTECH_URL=http://10.216.38.125:8084
SOARTECH_URL=http://10.216.38.25:8084
ADEPT_URL=http://10.216.38.101:8080

SAVE_HISTORY=True
Expand Down Expand Up @@ -118,3 +118,78 @@ ADEPT_IO_ALIGNMENT_TARGETS=ADEPT-DryRun-Ingroup Bias-0.0,
ADEPT-DryRun-Ingroup Bias-0.8,
ADEPT-DryRun-Ingroup Bias-0.9,
ADEPT-DryRun-Ingroup Bias-1.0


[GROUP_TARGET]

EVALUATION_TYPE=dryrun
SCENARIO_DIRECTORY=swagger_server/itm/data/%(EVALUATION_TYPE)s/scenarios/

; Local Default URLs
; ADEPT_URL=http://localhost:8081
; SOARTECH_URL=http://localhost:8084

; AWS TA1 Default URLs (access Prod AWS servers locally)
; ADEPT_URL=https://darpaitm.caci.com/adept
; SOARTECH_URL=https://darpaitm.caci.com/soartech

; Prod Default URLs (use on production AWS only)
SOARTECH_URL=http://10.216.38.25:8084
ADEPT_URL=http://10.216.38.101:8080

SAVE_HISTORY=True
SAVE_HISTORY_TO_S3=True
; This applies to `soartech` and `adept` non-training sessions
ALWAYS_CONNECT_TO_TA1=True

HISTORY_DIRECTORY=itm_history_output
HISTORY_S3_BUCKET=itm-ui-assets

EVAL_NAME=Dry Run Evaluation
EVAL_NUMBER=4

SOARTECH_EVAL_FILENAMES=dryrun-soartech-eval-qol1.yaml,
dryrun-soartech-eval-qol2.yaml,
dryrun-soartech-eval-qol3.yaml,
dryrun-soartech-eval-vol1.yaml,
dryrun-soartech-eval-vol2.yaml,
dryrun-soartech-eval-vol3.yaml

SOARTECH_TRAIN_FILENAMES=dryrun-soartech-train-qol1.yaml,
dryrun-soartech-train-qol2.yaml,
dryrun-soartech-train-vol1.yaml,
dryrun-soartech-train-vol2.yaml

SOARTECH_EVAL_QOL_SCENARIOS=qol-dre-1-eval,qol-dre-2-eval,qol-dre-3-eval
SOARTECH_EVAL_VOL_SCENARIOS=vol-dre-1-eval,vol-dre-2-eval,vol-dre-3-eval

SOARTECH_TRAIN_QOL_SCENARIOS=qol-dre-1-train,qol-dre-2-train
SOARTECH_TRAIN_VOL_SCENARIOS=vol-dre-1-train,vol-dre-2-train

SOARTECH_QOL_ALIGNMENT_TARGETS=qol-group-target-dre-1,
qol-group-target-dre-2

SOARTECH_VOL_ALIGNMENT_TARGETS=vol-group-target-dre-1,
vol-group-target-dre-2

ADEPT_EVAL_FILENAMES=dryrun-adept-eval-MJ2.yaml,
dryrun-adept-eval-MJ4.yaml,
dryrun-adept-eval-MJ5.yaml

ADEPT_TRAIN_FILENAMES=dryrun-adept-train-MJ1.yaml,
dryrun-adept-train-MJ3.yaml,
dryrun-adept-train-IO1.yaml,
dryrun-adept-train-IO2.yaml,
dryrun-adept-train-IO3.yaml

ADEPT_EVAL_MJ_SCENARIOS=DryRunEval-MJ2-eval,DryRunEval-MJ4-eval,DryRunEval-MJ5-eval
ADEPT_EVAL_IO_SCENARIOS=DryRunEval-MJ2-eval,DryRunEval-MJ4-eval,DryRunEval-MJ5-eval

ADEPT_TRAIN_MJ_SCENARIOS=DryRunEval.MJ1,DryRunEval.MJ3
ADEPT_TRAIN_IO_SCENARIOS=DryRunEval.IO1,DryRunEval.IO2,DryRunEval.IO3

ADEPT_MJ_ALIGNMENT_TARGETS=ADEPT-DryRun-Moral judgement-Group-Low,
ADEPT-DryRun-Moral judgement-Group-High

ADEPT_IO_ALIGNMENT_TARGETS=ADEPT-DryRun-Ingroup Bias-Group-Low,
ADEPT-DryRun-Ingroup Bias-Group-High
8 changes: 5 additions & 3 deletions swagger_server/itm/itm_history.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import os
import time
import datetime
import builtins

from botocore.exceptions import ClientError
from typing import Union
Expand All @@ -17,12 +18,13 @@ def __init__(self, config):
"""
Initialize an instance of ITMHistory.
"""
config_group = builtins.config_group
self.history = []
self.filepath = config["DEFAULT"]["HISTORY_DIRECTORY"] + os.sep
self.filepath = config[config_group]["HISTORY_DIRECTORY"] + os.sep
self.save_history_bucket = config["DEFAULT"]["HISTORY_S3_BUCKET"]
self.evaluation_info = {
"evalName": config['DEFAULT']['EVAL_NAME'],
"evalNumber": config['DEFAULT']['EVAL_NUMBER'],
"evalName": config[config_group]['EVAL_NAME'],
"evalNumber": config[config_group]['EVAL_NUMBER'],
"created" : str(datetime.datetime.now())
}

Expand Down
42 changes: 22 additions & 20 deletions swagger_server/itm/itm_session.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import random
import os
import logging
import builtins
from datetime import datetime
from typing import List
from copy import deepcopy
Expand All @@ -29,28 +30,29 @@ class ITMSession:
"""
config_util.check_ini()
config = config_util.read_ini()[0]
config_group = builtins.config_group

# Class variables
EVALUATION_TYPE = config['DEFAULT']['EVALUATION_TYPE']
EVALUATION_NAME = config['DEFAULT']['EVAL_NAME']
EVALUATION_NUMBER = config['DEFAULT']['EVAL_NUMBER']
SCENARIO_DIRECTORY = config['DEFAULT']['SCENARIO_DIRECTORY']
SOARTECH_EVAL_FILENAMES = config['DEFAULT']['SOARTECH_EVAL_FILENAMES'].replace('\n','').split(',')
SOARTECH_TRAIN_FILENAMES = config['DEFAULT']['SOARTECH_TRAIN_FILENAMES'].replace('\n','').split(',')
SOARTECH_EVAL_QOL_SCENARIOS = config['DEFAULT']['SOARTECH_EVAL_QOL_SCENARIOS'].replace('\n','').split(',')
SOARTECH_EVAL_VOL_SCENARIOS = config['DEFAULT']['SOARTECH_EVAL_VOL_SCENARIOS'].replace('\n','').split(',')
SOARTECH_TRAIN_QOL_SCENARIOS = config['DEFAULT']['SOARTECH_TRAIN_QOL_SCENARIOS'].replace('\n','').split(',')
SOARTECH_TRAIN_VOL_SCENARIOS = config['DEFAULT']['SOARTECH_TRAIN_VOL_SCENARIOS'].replace('\n','').split(',')
SOARTECH_QOL_ALIGNMENT_TARGETS = config['DEFAULT']['SOARTECH_QOL_ALIGNMENT_TARGETS'].replace('\n','').split(',')
SOARTECH_VOL_ALIGNMENT_TARGETS = config['DEFAULT']['SOARTECH_VOL_ALIGNMENT_TARGETS'].replace('\n','').split(',')
ADEPT_EVAL_FILENAMES = config['DEFAULT']['ADEPT_EVAL_FILENAMES'].replace('\n','').split(',')
ADEPT_TRAIN_FILENAMES = config['DEFAULT']['ADEPT_TRAIN_FILENAMES'].replace('\n','').split(',')
ADEPT_EVAL_MJ_SCENARIOS = config['DEFAULT']['ADEPT_EVAL_MJ_SCENARIOS'].replace('\n','').split(',')
ADEPT_EVAL_IO_SCENARIOS = config['DEFAULT']['ADEPT_EVAL_IO_SCENARIOS'].replace('\n','').split(',')
ADEPT_TRAIN_MJ_SCENARIOS = config['DEFAULT']['ADEPT_TRAIN_MJ_SCENARIOS'].replace('\n','').split(',')
ADEPT_TRAIN_IO_SCENARIOS = config['DEFAULT']['ADEPT_TRAIN_IO_SCENARIOS'].replace('\n','').split(',')
ADEPT_MJ_ALIGNMENT_TARGETS = config['DEFAULT']['ADEPT_MJ_ALIGNMENT_TARGETS'].replace('\n','').split(',')
ADEPT_IO_ALIGNMENT_TARGETS = config['DEFAULT']['ADEPT_IO_ALIGNMENT_TARGETS'].replace('\n','').split(',')
EVALUATION_TYPE = config[config_group]['EVALUATION_TYPE']
EVALUATION_NAME = config[config_group]['EVAL_NAME']
EVALUATION_NUMBER = config[config_group]['EVAL_NUMBER']
SCENARIO_DIRECTORY = config[config_group]['SCENARIO_DIRECTORY']
SOARTECH_EVAL_FILENAMES = config[config_group]['SOARTECH_EVAL_FILENAMES'].replace('\n','').split(',')
SOARTECH_TRAIN_FILENAMES = config[config_group]['SOARTECH_TRAIN_FILENAMES'].replace('\n','').split(',')
SOARTECH_EVAL_QOL_SCENARIOS = config[config_group]['SOARTECH_EVAL_QOL_SCENARIOS'].replace('\n','').split(',')
SOARTECH_EVAL_VOL_SCENARIOS = config[config_group]['SOARTECH_EVAL_VOL_SCENARIOS'].replace('\n','').split(',')
SOARTECH_TRAIN_QOL_SCENARIOS = config[config_group]['SOARTECH_TRAIN_QOL_SCENARIOS'].replace('\n','').split(',')
SOARTECH_TRAIN_VOL_SCENARIOS = config[config_group]['SOARTECH_TRAIN_VOL_SCENARIOS'].replace('\n','').split(',')
SOARTECH_QOL_ALIGNMENT_TARGETS = config[config_group]['SOARTECH_QOL_ALIGNMENT_TARGETS'].replace('\n','').split(',')
SOARTECH_VOL_ALIGNMENT_TARGETS = config[config_group]['SOARTECH_VOL_ALIGNMENT_TARGETS'].replace('\n','').split(',')
ADEPT_EVAL_FILENAMES = config[config_group]['ADEPT_EVAL_FILENAMES'].replace('\n','').split(',')
ADEPT_TRAIN_FILENAMES = config[config_group]['ADEPT_TRAIN_FILENAMES'].replace('\n','').split(',')
ADEPT_EVAL_MJ_SCENARIOS = config[config_group]['ADEPT_EVAL_MJ_SCENARIOS'].replace('\n','').split(',')
ADEPT_EVAL_IO_SCENARIOS = config[config_group]['ADEPT_EVAL_IO_SCENARIOS'].replace('\n','').split(',')
ADEPT_TRAIN_MJ_SCENARIOS = config[config_group]['ADEPT_TRAIN_MJ_SCENARIOS'].replace('\n','').split(',')
ADEPT_TRAIN_IO_SCENARIOS = config[config_group]['ADEPT_TRAIN_IO_SCENARIOS'].replace('\n','').split(',')
ADEPT_MJ_ALIGNMENT_TARGETS = config[config_group]['ADEPT_MJ_ALIGNMENT_TARGETS'].replace('\n','').split(',')
ADEPT_IO_ALIGNMENT_TARGETS = config[config_group]['ADEPT_IO_ALIGNMENT_TARGETS'].replace('\n','').split(',')

local_alignment_targets = {} # alignment_targets baked into server, for use when not connecting to TA1
alignment_data = {} # maps ta1_name to list alignment_targets, used whether connecting to TA1 or not
Expand Down
7 changes: 5 additions & 2 deletions swagger_server/itm/itm_ta1_controller.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import requests
import json
import urllib
import builtins
from swagger_server.models.probe_response import ProbeResponse # noqa: F401,E501
from swagger_server.models.alignment_results import AlignmentResults # noqa: F401,E501
from swagger_server.models.alignment_target import AlignmentTarget # noqa: F401,E501
Expand All @@ -12,8 +13,10 @@
class ITMTa1Controller:
config_util.check_ini()
config = config_util.read_ini()[0]
ADEPT_URL = config['DEFAULT']['ADEPT_URL']
SOARTECH_URL = config['DEFAULT']['SOARTECH_URL']
config_group = builtins.config_group

ADEPT_URL = config[config_group]['ADEPT_URL']
SOARTECH_URL = config[config_group]['SOARTECH_URL']

def __init__(self, alignment_target_id, scene_type, alignment_target = None):
self.session_id = ''
Expand Down

0 comments on commit 96e939f

Please sign in to comment.