From f73c6fc0df9db8cf5b78151f3b9fb20a2625e58c Mon Sep 17 00:00:00 2001 From: i23_moririn2528 Date: Tue, 15 Aug 2023 11:38:17 +0900 Subject: [PATCH 1/6] update api for preferential optimization --- optuna_dashboard/_serializer.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/optuna_dashboard/_serializer.py b/optuna_dashboard/_serializer.py index 7fae23ea..04190f59 100644 --- a/optuna_dashboard/_serializer.py +++ b/optuna_dashboard/_serializer.py @@ -15,6 +15,7 @@ from . import _note as note from ._form_widget import get_form_widgets_json from ._named_objectives import get_objective_names from .artifact._backend import list_trial_artifacts +from .preferential._study import _SYSTEM_ATTR_PREFERENTIAL_STUDY if TYPE_CHECKING: @@ -143,6 +144,7 @@ def serialize_study_detail( serialized["union_user_attrs"] = [{"key": a[0], "sortable": a[1]} for a in union_user_attrs] serialized["has_intermediate_values"] = has_intermediate_values serialized["note"] = note.get_note_from_system_attrs(system_attrs, None) + serialized["is_preferential"] = system_attrs.get(_SYSTEM_ATTR_PREFERENTIAL_STUDY, False) objective_names = get_objective_names(system_attrs) if objective_names: serialized["objective_names"] = objective_names From 853dc7bb159cd1c21013a3032e5c42de08677f2f Mon Sep 17 00:00:00 2001 From: c-bata Date: Wed, 16 Aug 2023 10:43:46 +0900 Subject: [PATCH 2/6] Rewrite test_serializers in pytest-based style --- python_tests/test_serializers.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/python_tests/test_serializers.py b/python_tests/test_serializers.py index 4ea8c9bd..12181538 100644 --- a/python_tests/test_serializers.py +++ b/python_tests/test_serializers.py @@ -5,15 +5,15 @@ from unittest import TestCase from optuna_dashboard._serializer import serialize_attrs -class SerializeAttrsTestCase(TestCase): - def test_serialize_bytes(self) -> None: - serialized = serialize_attrs({"bytes": b"This is a bytes object."}) - self.assertEqual(serialized[0]["value"], "") +def test_serialize_bytes() -> None: + serialized = serialize_attrs({"bytes": b"This is a bytes object."}) + assert serialized[0]["value"] == "" - def test_serialize_dict(self) -> None: - serialized = serialize_attrs( - { - "key": {"foo": "bar"}, - } - ) - self.assertLessEqual(len(serialized), 1) + +def test_serialize_dict() -> None: + serialized = serialize_attrs( + { + "key": {"foo": "bar"}, + } + ) + assert len(serialized) <= 1 From 2597a508857d478790db36733c7ff7a283543ac2 Mon Sep 17 00:00:00 2001 From: c-bata Date: Wed, 16 Aug 2023 11:06:18 +0900 Subject: [PATCH 3/6] Add serializers tests for is_preferential attr --- python_tests/test_serializers.py | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/python_tests/test_serializers.py b/python_tests/test_serializers.py index 12181538..c8ffe8c7 100644 --- a/python_tests/test_serializers.py +++ b/python_tests/test_serializers.py @@ -1,8 +1,11 @@ from __future__ import annotations -from unittest import TestCase - +import optuna from optuna_dashboard._serializer import serialize_attrs +from optuna_dashboard._serializer import serialize_study_detail +from optuna_dashboard.preferential import create_study + +from optuna_dashboard._storage import get_study_summaries def test_serialize_bytes() -> None: @@ -17,3 +20,25 @@ def test_serialize_dict() -> None: } ) assert len(serialized) <= 1 + + +def test_get_study_detail_is_preferential() -> None: + storage = optuna.storages.InMemoryStorage() + study = create_study(storage=storage) + study_summaries = get_study_summaries(storage) + assert len(study_summaries) == 1 + + study_summary = study_summaries[0] + study_detail = serialize_study_detail(study_summary, [], study.trials, [], [], [], False) + assert study_detail["is_preferential"] + + +def test_get_study_detail_is_not_preferential() -> None: + storage = optuna.storages.InMemoryStorage() + study = optuna.create_study(storage=storage) + study_summaries = get_study_summaries(storage) + assert len(study_summaries) == 1 + + study_summary = study_summaries[0] + study_detail = serialize_study_detail(study_summary, [], study.trials, [], [], [], False) + assert not study_detail["is_preferential"] From 63471a786877535298fbc865daca4a97a1401aef Mon Sep 17 00:00:00 2001 From: c-bata Date: Wed, 16 Aug 2023 13:12:09 +0900 Subject: [PATCH 4/6] Fix lint errors --- python_tests/test_serializers.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/python_tests/test_serializers.py b/python_tests/test_serializers.py index c8ffe8c7..7a038b08 100644 --- a/python_tests/test_serializers.py +++ b/python_tests/test_serializers.py @@ -3,9 +3,8 @@ from __future__ import annotations import optuna from optuna_dashboard._serializer import serialize_attrs from optuna_dashboard._serializer import serialize_study_detail -from optuna_dashboard.preferential import create_study - from optuna_dashboard._storage import get_study_summaries +from optuna_dashboard.preferential import create_study def test_serialize_bytes() -> None: From 10e6ab3d40a8819b258fb3187ad379f3fd0908bb Mon Sep 17 00:00:00 2001 From: c-bata Date: Wed, 16 Aug 2023 14:57:41 +0900 Subject: [PATCH 5/6] Clear in memory cache every after api calls in unit tests --- python_tests/wsgi_client.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/python_tests/wsgi_client.py b/python_tests/wsgi_client.py index 3a6b078e..970cea28 100644 --- a/python_tests/wsgi_client.py +++ b/python_tests/wsgi_client.py @@ -7,11 +7,21 @@ from typing import Union from bottle import Bottle +from optuna_dashboard._storage import trials_cache +from optuna_dashboard._storage import trials_cache_lock +from optuna_dashboard._storage import trials_last_fetched_at + if typing.TYPE_CHECKING: from _typeshed.wsgi import WSGIEnvironment +def clear_inmemory_cache() -> None: + with trials_cache_lock: + trials_cache.clear() + trials_last_fetched_at.clear() + + def create_wsgi_env( path: str, method: str, @@ -66,6 +76,8 @@ def send_request( headers = headers or {} queries = queries or {} env = create_wsgi_env(path, method, content_type, bytes_body, queries, headers) + + clear_inmemory_cache() response_body = b"" iterable_body = app(env, start_response) for b in iterable_body: From 4f99c7a1a0c5b43a713d524decf4090790c8d36f Mon Sep 17 00:00:00 2001 From: c-bata Date: Wed, 16 Aug 2023 15:00:19 +0900 Subject: [PATCH 6/6] Fix isort error --- python_tests/wsgi_client.py | 1 - 1 file changed, 1 deletion(-) diff --git a/python_tests/wsgi_client.py b/python_tests/wsgi_client.py index 970cea28..84fe8aac 100644 --- a/python_tests/wsgi_client.py +++ b/python_tests/wsgi_client.py @@ -6,7 +6,6 @@ from typing import Optional from typing import Union from bottle import Bottle - from optuna_dashboard._storage import trials_cache from optuna_dashboard._storage import trials_cache_lock from optuna_dashboard._storage import trials_last_fetched_at