From 42e1a4add3ccfc6b5d2b35f7fafd90cc8b60d7fd Mon Sep 17 00:00:00 2001 From: dvanaken Date: Mon, 9 Dec 2019 19:43:49 +0100 Subject: [PATCH] Make constants editable --- server/website/website/settings/constants.py | 6 +++++ server/website/website/tasks/async_tasks.py | 8 +++--- server/website/website/urls.py | 2 ++ server/website/website/utils.py | 19 ++++++++++---- server/website/website/views.py | 27 ++++++++++++++++++++ 5 files changed, 53 insertions(+), 9 deletions(-) diff --git a/server/website/website/settings/constants.py b/server/website/website/settings/constants.py index 9abfc34..5eadb90 100644 --- a/server/website/website/settings/constants.py +++ b/server/website/website/settings/constants.py @@ -45,6 +45,12 @@ BATCH_SIZE = 3000 # Threads for TensorFlow config NUM_THREADS = 4 +# Value of beta for UCB +UCB_BETA = 'get_beta_td' + +# Name of the GPR model to use (GPFLOW only) +GPR_MODEL_NAME = 'BasicGP' + # ---GRADIENT DESCENT CONSTANTS--- # the maximum iterations of gradient descent MAX_ITER = 500 diff --git a/server/website/website/tasks/async_tasks.py b/server/website/website/tasks/async_tasks.py index 1e74eaa..38c2c86 100644 --- a/server/website/website/tasks/async_tasks.py +++ b/server/website/website/tasks/async_tasks.py @@ -42,7 +42,8 @@ from website.settings import (USE_GPFLOW, DEFAULT_LENGTH_SCALE, DEFAULT_MAGNITUD ACTOR_HIDDEN_SIZES, CRITIC_HIDDEN_SIZES, DNN_TRAIN_ITER, DNN_EXPLORE, DNN_EXPLORE_ITER, DNN_NOISE_SCALE_BEGIN, DNN_NOISE_SCALE_END, - DNN_DEBUG, DNN_DEBUG_INTERVAL, GPR_DEBUG) + DNN_DEBUG, DNN_DEBUG_INTERVAL, GPR_DEBUG, UCB_BETA, + GPR_MODEL_NAME) from website.settings import INIT_FLIP_PROB, FLIP_PROB_DECAY from website.types import VarType @@ -660,13 +661,12 @@ def configuration_recommendation(recommendation_input): opt_kwargs['maxiter'] = MAX_ITER opt_kwargs['bounds'] = [X_min, X_max] opt_kwargs['debug'] = GPR_DEBUG - ucb_beta = 'get_beta_td' - opt_kwargs['ucb_beta'] = ucb.get_ucb_beta(ucb_beta, scale=DEFAULT_UCB_SCALE, + opt_kwargs['ucb_beta'] = ucb.get_ucb_beta(UCB_BETA, scale=DEFAULT_UCB_SCALE, t=i + 1., ndim=X_scaled.shape[1]) tf.reset_default_graph() graph = tf.get_default_graph() gpflow.reset_default_session(graph=graph) - m = gpr_models.create_model('BasicGP', X=X_scaled, y=y_scaled, **model_kwargs) + m = gpr_models.create_model(GPR_MODEL_NAME, X=X_scaled, y=y_scaled, **model_kwargs) res = tf_optimize(m.model, X_samples, **opt_kwargs) else: model = GPRGD(length_scale=DEFAULT_LENGTH_SCALE, diff --git a/server/website/website/urls.py b/server/website/website/urls.py index a5de75b..7a4c38b 100644 --- a/server/website/website/urls.py +++ b/server/website/website/urls.py @@ -73,6 +73,8 @@ urlpatterns = [ url(r'^edit/session/', website_views.alt_create_or_edit_session, name='backdoor_edit_session'), url(r'^create/user/', website_views.alt_create_user, name='backdoor_create_user'), url(r'^delete/user/', website_views.alt_delete_user, name='backdoor_delete_user'), + url(r'^info/(?P[0-9a-zA-Z]+)', website_views.alt_get_info, name="backdoor_info"), + url(r'^set_constant/(?P[0-9a-zA-Z_]+)', website_views.alt_set_constant, name="backdoor_set_constant"), # train ddpg with results in the given session url(r'^train_ddpg/sessions/(?P[0-9]+)$', website_views.train_ddpg_loops, name='train_ddpg_loops'), diff --git a/server/website/website/utils.py b/server/website/website/utils.py index 7544ecd..b32fa09 100644 --- a/server/website/website/utils.py +++ b/server/website/website/utils.py @@ -342,6 +342,19 @@ class LabelUtil(object): return style_labels +def set_constant(name, value): + getattr(constants, name) # Throw exception if not a valid option + setattr(constants, name, value) + + +def get_constants(): + constants_dict = OrderedDict() + for name, value in sorted(constants.__dict__.items()): + if not name.startswith('_') and name == name.upper(): + constants_dict[name] = value + return constants_dict + + def dump_debug_info(session, pretty_print=False): files = {} @@ -418,11 +431,7 @@ def dump_debug_info(session, pretty_print=False): files['logs/{}.log'.format(logger_name)] = log_values # Save settings - constants_dict = OrderedDict() - for name, value in sorted(constants.__dict__.items()): - if not name.startswith('_') and name == name.upper(): - constants_dict[name] = value - files['constants.json'] = constants_dict + files['constants.json'] = get_constants() timestamp = datetime.datetime.now().strftime("%Y%m%d-%H%M%S") root = 'debug_{}'.format(timestamp) diff --git a/server/website/website/views.py b/server/website/website/views.py index 8eac683..219fc5d 100644 --- a/server/website/website/views.py +++ b/server/website/website/views.py @@ -1129,6 +1129,33 @@ def train_ddpg_loops(request, session_id): # pylint: disable=unused-argument return HttpResponse() +@csrf_exempt +def alt_get_info(request, name): + # Backdoor method for getting basic info + if name == 'constants': + info = utils.get_constants() + return HttpResponse(JSONUtil.dumps(info)) + else: + LOG.warning("Invalid name for info request: %s", name) + return HttpResponse("Invalid name for info request: {}".format(name), status=400) + + +@csrf_exempt +def alt_set_constant(request, name): + # Sets a constant defined in settings/constants.py + LOG.info('POST: %s', request.POST) + LOG.info('POST.lists(): %s', request.POST.lists()) + value = request.POST['value'] + LOG.info('name: %s, value: %s, type: %s', name, value, type(value)) + #data = {k: v[0] for k, v in request.POST.lists()} + try: + utils.set_constant(name, value) + except AttributeError as e: + LOG.warning(e) + return HttpResponse(e, status=400) + return HttpResponse("Successfully updated {} to '{}'".format(name, value)) + + @csrf_exempt def alt_create_user(request): response = dict(created=False, error=None, user=None)