From f3b74c03df0a25e053b7aea35843dc374880f770 Mon Sep 17 00:00:00 2001 From: Federico Negri Date: Mon, 4 Dec 2023 18:20:20 +0100 Subject: [PATCH 01/19] draft --- ansys/rep/client/rms/api/rms_api.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/ansys/rep/client/rms/api/rms_api.py b/ansys/rep/client/rms/api/rms_api.py index 7f0c74ec4..103ed16e9 100644 --- a/ansys/rep/client/rms/api/rms_api.py +++ b/ansys/rep/client/rms/api/rms_api.py @@ -3,6 +3,7 @@ from ansys.rep.client.client import Client from ansys.rep.client.rms.models import ( + Cluster, ComputeResourceSet, EvaluatorConfiguration, EvaluatorConfigurationUpdate, @@ -143,3 +144,15 @@ def get_compute_resource_set(self, id, as_object=True) -> ComputeResourceSet: as_object, from_collection=True, ) + + def get_compute_resurce_set_cluster_info(self, id, as_object=True) -> Cluster: + """Returns cluster info of a compute resource set.""" + + clusters = get_objects( + self.client.session, + self.url, + ComputeResourceSet, + as_object, + crs_id=id, + ) + return clusters[0] From 3a5155c182df6161d6b8784cd261662076fa0dc4 Mon Sep 17 00:00:00 2001 From: Federico Negri Date: Thu, 14 Dec 2023 07:12:17 +0100 Subject: [PATCH 02/19] Start renaming package and some doc --- .github/workflows/ci_cd.yml | 6 ++--- README.rst | 6 ++--- doc/source/conf.py | 41 +++++++++++++++-------------------- doc/source/examples/index.rst | 2 +- doc/source/index.rst | 4 ++-- doc/source/install.rst | 2 +- doc/source/quickstart.rst | 2 +- prepare_documentation.py | 2 +- setup.py | 6 ++--- 9 files changed, 33 insertions(+), 38 deletions(-) diff --git a/.github/workflows/ci_cd.yml b/.github/workflows/ci_cd.yml index e113a49d3..05da537cc 100644 --- a/.github/workflows/ci_cd.yml +++ b/.github/workflows/ci_cd.yml @@ -170,7 +170,7 @@ jobs: python -m pip install -r requirements/requirements_build.txt python -m build venv wheel python -m twine check dist/* - version=$(ls dist | grep rep_client | grep -E -o "[0-9]+.[0-9]+.[a-z0-9]+") + version=$(ls dist | grep pyhps | grep -E -o "[0-9]+.[0-9]+.[a-z0-9]+") echo "version=$version" >> $GITHUB_OUTPUT #- name: Upload to private PyPi # if: github.ref == 'refs/heads/main' @@ -183,7 +183,7 @@ jobs: - name: Upload artifact uses: actions/upload-artifact@v3 with: - name: pyrep-package + name: ansys-pyhps-package path: | dist/*.whl retention-days: 5 @@ -196,7 +196,7 @@ jobs: steps: - uses: actions/download-artifact@v3 with: - name: pyrep-package + name: ansys-pyhps-package path: /tmp/artifacts - name: List artifacts diff --git a/README.rst b/README.rst index 09d806410..56fc3c6a1 100644 --- a/README.rst +++ b/README.rst @@ -1,4 +1,4 @@ -PyREP +PyHPS ===== |pyansys| |python| |pypi| |GH-CI| |codecov| |MIT| |black| @@ -36,14 +36,14 @@ A Python client for Ansys REP - Remote Execution Platform How to install -------------- -In order to install PyREP, make sure you +In order to install PyHPS, make sure you have the latest version of `pip`_. To do so, run: .. code:: bash python -m pip install -U pip -Then, as long as PyREP is a private pyAnsys module not published to pypi yet, you can execute: +Then, as long as PyHPS is a private pyAnsys module not published to pypi yet, you can execute: .. code:: bash diff --git a/doc/source/conf.py b/doc/source/conf.py index d41fc8b6f..6b56c9ac0 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -137,7 +137,7 @@ } # A shorter title for the navigation bar. Default is the same as html_title. -html_short_title = html_title = "PyREP" +html_short_title = html_title = "PyHPS" # The name of an image file (relative to this directory) to place at the top # of the sidebar. @@ -180,8 +180,8 @@ latex_documents = [ ( "index", - "ansys-rep-client.tex", - "REP Python Client Documentation", + "ansys-pyhps.tex", + "Ansys HPS Python Client Documentation", author, "manual", ), @@ -212,9 +212,7 @@ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). -man_pages = [ - ("index", "ansys-rep-client", "REP Python Client Documentation", ["ANSYS Switzerland Gmbh"], 1) -] +man_pages = [("index", "ansys-pyhps", "Ansys HPS Python Client Documentation", ["ANSYS, Inc."], 1)] # If true, show URL addresses after external links. # man_show_urls = False @@ -225,17 +223,17 @@ # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) -texinfo_documents = [ - ( - "index", - "ansys-rep-client", - "REP Python Client Documentation", - "ANSYS Switzerland Gmbh", - "DCP", - "One line description of project.", - "Miscellaneous", - ), -] +# texinfo_documents = [ +# ( +# "index", +# "ansys-pyhps", +# "Ansys HPS Python Client Documentation", +# "ANSYS, Inc.", +# "JMS", +# "One line description of project.", +# "Miscellaneous", +# ), +# ] # Documents to append as an appendix to all manuals. # texinfo_appendices = [] @@ -280,13 +278,10 @@ extlinks = { "ansys_rep_help": ( + # """https://ansyshelp.ansys.com/account/ + # secured?returnurl=/Views/Secured/corp/v231/en/rep_ug/%s.html""", """https://ansyshelp.ansys.com/account/ - secured?returnurl=/Views/Secured/corp/v231/en/rep_ug/%s.html""", + secured?returnurl=/Views/Secured/corp/v231/en/rep_ug/%s.html""" # todo "ANSYS Help - ", ), - "ansys_dcs_tutorial": ( - """https://ansyshelp.ansys.com/account/ - secured?returnurl=/Views/Secured/corp/v231/en/dcs_tut/%s.html""", - "REP Tutorial - ", - ), } diff --git a/doc/source/examples/index.rst b/doc/source/examples/index.rst index dce29c28a..c0dc3c55e 100644 --- a/doc/source/examples/index.rst +++ b/doc/source/examples/index.rst @@ -3,7 +3,7 @@ Examples ======== -Here you can find some examples showing how to interact with a REP server in Python using the ``ansys-rep-client``. +Here you can find some examples showing how to interact with a REP server in Python using the ``ansys-pyhps``. Examples consist of a Python script plus some data files (e.g. solver input files). Many of the Python scripts can be executed with the following command line arguments: diff --git a/doc/source/index.rst b/doc/source/index.rst index bbec0103f..083d504b5 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -1,4 +1,4 @@ -PyREP Documentation |version| +PyHPS Documentation |version| ================================= .. toctree:: @@ -16,7 +16,7 @@ Introduction Ansys Remote Execution Platform (REP) is a family of applications that enables you to distribute, manage and solve simulations on a variety of compute resources. -``ansys-rep-client`` brings Ansys REP to your Python application. +``ansys-pyhps`` brings Ansys REP to your Python application. Wrapping around the REP REST APIs, it allows you to: * create new projects and modify existing ones diff --git a/doc/source/install.rst b/doc/source/install.rst index 3c3f70b37..a1a636b1f 100644 --- a/doc/source/install.rst +++ b/doc/source/install.rst @@ -20,7 +20,7 @@ Additionally, make sure you have ``pip`` available. You can check this by runnin If pip isn't already installed, please refer to the `Installing Packages Tutorial `_ from the Python Packaging Authority. -As long as PyREP is a private PyAnsys package not published to PyPI yet, you can execute +As long as PyHPS is a private PyAnsys package not published to PyPI yet, you can execute .. code:: diff --git a/doc/source/quickstart.rst b/doc/source/quickstart.rst index 977d1adec..117aff3e2 100644 --- a/doc/source/quickstart.rst +++ b/doc/source/quickstart.rst @@ -9,7 +9,7 @@ while detailed documentation can be found in the :ref:`Code Documentation `_ for instructions. -- A Python shell with ``ansys-rep-client`` installed. If you haven't installed it yet, please refer to the :ref:`Installation ` guide. +- A Python shell with ``ansys-pyhps`` installed. If you haven't installed it yet, please refer to the :ref:`Installation ` guide. Connect to a REP Server diff --git a/prepare_documentation.py b/prepare_documentation.py index 082ee67a3..75b87150c 100644 --- a/prepare_documentation.py +++ b/prepare_documentation.py @@ -94,7 +94,7 @@ def generate_openapi_specs(): ma_plugin = MarshmallowPlugin() spec = APISpec( - title="pyrep", + title="pyhps", version=__version__, openapi_version="3.0", plugins=[ma_plugin], diff --git a/setup.py b/setup.py index 70f0978f8..b586230b0 100644 --- a/setup.py +++ b/setup.py @@ -7,11 +7,11 @@ # to get the package version. root = os.path.abspath(os.path.dirname(__file__)) about = {} -with open(os.path.join(root, "ansys", "rep", "client", "__version__.py"), "r") as f: +with open(os.path.join(root, "ansys", "hps", "client", "__version__.py"), "r") as f: exec(f.read(), about) setup( - name="ansys-rep-client", + name="ansys-pyhps", version=about["__version__"], url=about["__url__"], author="ANSYS, Inc.", @@ -26,7 +26,7 @@ ], license="MIT", license_file="LICENSE", - description="A python client for Ansys REP - Remote Execution Platform", + description="A python client for Ansys HPC Platform Services", long_description=open("README.rst").read(), long_description_content_type="text/x-rst", install_requires=[ From eb780e86e45db0c4b23876c774a2249606efd424 Mon Sep 17 00:00:00 2001 From: Federico Negri Date: Thu, 14 Dec 2023 07:18:49 +0100 Subject: [PATCH 03/19] Rename ansys/rep folder to ansys/hps --- .flake8 | 2 +- .pre-commit-config.yaml | 6 +++--- README.rst | 2 +- ansys/{rep => hps}/client/__init__.py | 0 ansys/{rep => hps}/client/__version__.py | 0 ansys/{rep => hps}/client/auth/__init__.py | 0 ansys/{rep => hps}/client/auth/api/__init__.py | 0 ansys/{rep => hps}/client/auth/api/auth_api.py | 0 ansys/{rep => hps}/client/auth/authenticate.py | 0 ansys/{rep => hps}/client/auth/resource/__init__.py | 0 ansys/{rep => hps}/client/auth/resource/user.py | 0 ansys/{rep => hps}/client/auth/schema/__init__.py | 0 ansys/{rep => hps}/client/auth/schema/user.py | 3 +-- ansys/{rep => hps}/client/client.py | 0 ansys/{rep => hps}/client/common/__init__.py | 0 ansys/{rep => hps}/client/common/base_resource.py | 0 ansys/{rep => hps}/client/common/base_schema.py | 0 ansys/{rep => hps}/client/common/restricted_value.py | 0 ansys/{rep => hps}/client/connection.py | 0 ansys/{rep => hps}/client/exceptions.py | 0 ansys/{rep => hps}/client/jms/__init__.py | 0 ansys/{rep => hps}/client/jms/api/__init__.py | 0 ansys/{rep => hps}/client/jms/api/base.py | 5 ++--- ansys/{rep => hps}/client/jms/api/jms_api.py | 5 ++--- ansys/{rep => hps}/client/jms/api/project_api.py | 3 +-- ansys/{rep => hps}/client/jms/keys.py | 0 ansys/{rep => hps}/client/jms/resource/.gitignore | 0 ansys/{rep => hps}/client/jms/resource/__init__.py | 0 ansys/{rep => hps}/client/jms/resource/algorithm.py | 0 ansys/{rep => hps}/client/jms/resource/evaluator.py | 0 ansys/{rep => hps}/client/jms/resource/file.py | 0 .../{rep => hps}/client/jms/resource/fitness_definition.py | 0 ansys/{rep => hps}/client/jms/resource/job.py | 0 ansys/{rep => hps}/client/jms/resource/job_definition.py | 0 ansys/{rep => hps}/client/jms/resource/license_context.py | 0 ansys/{rep => hps}/client/jms/resource/operation.py | 0 .../client/jms/resource/parameter_definition.py | 0 ansys/{rep => hps}/client/jms/resource/parameter_mapping.py | 0 ansys/{rep => hps}/client/jms/resource/permission.py | 0 ansys/{rep => hps}/client/jms/resource/project.py | 0 ansys/{rep => hps}/client/jms/resource/selection.py | 0 ansys/{rep => hps}/client/jms/resource/task.py | 0 ansys/{rep => hps}/client/jms/resource/task_definition.py | 0 .../client/jms/resource/task_definition_template.py | 0 ansys/{rep => hps}/client/jms/schema/__init__.py | 0 ansys/{rep => hps}/client/jms/schema/algorithm.py | 3 +-- ansys/{rep => hps}/client/jms/schema/evaluator.py | 3 +-- ansys/{rep => hps}/client/jms/schema/file.py | 3 +-- ansys/{rep => hps}/client/jms/schema/fitness_definition.py | 3 +-- ansys/{rep => hps}/client/jms/schema/job.py | 3 +-- ansys/{rep => hps}/client/jms/schema/job_definition.py | 3 +-- ansys/{rep => hps}/client/jms/schema/license_context.py | 3 +-- ansys/{rep => hps}/client/jms/schema/object_reference.py | 0 ansys/{rep => hps}/client/jms/schema/operation.py | 3 +-- .../{rep => hps}/client/jms/schema/parameter_definition.py | 3 +-- ansys/{rep => hps}/client/jms/schema/parameter_mapping.py | 3 +-- ansys/{rep => hps}/client/jms/schema/permission.py | 3 +-- ansys/{rep => hps}/client/jms/schema/project.py | 3 +-- ansys/{rep => hps}/client/jms/schema/selection.py | 3 +-- ansys/{rep => hps}/client/jms/schema/task.py | 3 +-- ansys/{rep => hps}/client/jms/schema/task_definition.py | 3 +-- .../client/jms/schema/task_definition_template.py | 3 +-- ansys/{rep => hps}/client/rms/__init__.py | 0 ansys/{rep => hps}/client/rms/api/base.py | 3 +-- ansys/{rep => hps}/client/rms/api/rms_api.py | 0 ansys/{rep => hps}/client/rms/models.py | 0 ansys/{rep => hps}/client/warnings.py | 0 67 files changed, 28 insertions(+), 49 deletions(-) rename ansys/{rep => hps}/client/__init__.py (100%) rename ansys/{rep => hps}/client/__version__.py (100%) rename ansys/{rep => hps}/client/auth/__init__.py (100%) rename ansys/{rep => hps}/client/auth/api/__init__.py (100%) rename ansys/{rep => hps}/client/auth/api/auth_api.py (100%) rename ansys/{rep => hps}/client/auth/authenticate.py (100%) rename ansys/{rep => hps}/client/auth/resource/__init__.py (100%) rename ansys/{rep => hps}/client/auth/resource/user.py (100%) rename ansys/{rep => hps}/client/auth/schema/__init__.py (100%) rename ansys/{rep => hps}/client/auth/schema/user.py (99%) rename ansys/{rep => hps}/client/client.py (100%) rename ansys/{rep => hps}/client/common/__init__.py (100%) rename ansys/{rep => hps}/client/common/base_resource.py (100%) rename ansys/{rep => hps}/client/common/base_schema.py (100%) rename ansys/{rep => hps}/client/common/restricted_value.py (100%) rename ansys/{rep => hps}/client/connection.py (100%) rename ansys/{rep => hps}/client/exceptions.py (100%) rename ansys/{rep => hps}/client/jms/__init__.py (100%) rename ansys/{rep => hps}/client/jms/api/__init__.py (100%) rename ansys/{rep => hps}/client/jms/api/base.py (98%) rename ansys/{rep => hps}/client/jms/api/jms_api.py (99%) rename ansys/{rep => hps}/client/jms/api/project_api.py (99%) rename ansys/{rep => hps}/client/jms/keys.py (100%) rename ansys/{rep => hps}/client/jms/resource/.gitignore (100%) rename ansys/{rep => hps}/client/jms/resource/__init__.py (100%) rename ansys/{rep => hps}/client/jms/resource/algorithm.py (100%) rename ansys/{rep => hps}/client/jms/resource/evaluator.py (100%) rename ansys/{rep => hps}/client/jms/resource/file.py (100%) rename ansys/{rep => hps}/client/jms/resource/fitness_definition.py (100%) rename ansys/{rep => hps}/client/jms/resource/job.py (100%) rename ansys/{rep => hps}/client/jms/resource/job_definition.py (100%) rename ansys/{rep => hps}/client/jms/resource/license_context.py (100%) rename ansys/{rep => hps}/client/jms/resource/operation.py (100%) rename ansys/{rep => hps}/client/jms/resource/parameter_definition.py (100%) rename ansys/{rep => hps}/client/jms/resource/parameter_mapping.py (100%) rename ansys/{rep => hps}/client/jms/resource/permission.py (100%) rename ansys/{rep => hps}/client/jms/resource/project.py (100%) rename ansys/{rep => hps}/client/jms/resource/selection.py (100%) rename ansys/{rep => hps}/client/jms/resource/task.py (100%) rename ansys/{rep => hps}/client/jms/resource/task_definition.py (100%) rename ansys/{rep => hps}/client/jms/resource/task_definition_template.py (100%) rename ansys/{rep => hps}/client/jms/schema/__init__.py (100%) rename ansys/{rep => hps}/client/jms/schema/algorithm.py (99%) rename ansys/{rep => hps}/client/jms/schema/evaluator.py (99%) rename ansys/{rep => hps}/client/jms/schema/file.py (99%) rename ansys/{rep => hps}/client/jms/schema/fitness_definition.py (99%) rename ansys/{rep => hps}/client/jms/schema/job.py (99%) rename ansys/{rep => hps}/client/jms/schema/job_definition.py (99%) rename ansys/{rep => hps}/client/jms/schema/license_context.py (99%) rename ansys/{rep => hps}/client/jms/schema/object_reference.py (100%) rename ansys/{rep => hps}/client/jms/schema/operation.py (99%) rename ansys/{rep => hps}/client/jms/schema/parameter_definition.py (99%) rename ansys/{rep => hps}/client/jms/schema/parameter_mapping.py (99%) rename ansys/{rep => hps}/client/jms/schema/permission.py (99%) rename ansys/{rep => hps}/client/jms/schema/project.py (99%) rename ansys/{rep => hps}/client/jms/schema/selection.py (99%) rename ansys/{rep => hps}/client/jms/schema/task.py (99%) rename ansys/{rep => hps}/client/jms/schema/task_definition.py (99%) rename ansys/{rep => hps}/client/jms/schema/task_definition_template.py (99%) rename ansys/{rep => hps}/client/rms/__init__.py (100%) rename ansys/{rep => hps}/client/rms/api/base.py (99%) rename ansys/{rep => hps}/client/rms/api/rms_api.py (100%) rename ansys/{rep => hps}/client/rms/models.py (100%) rename ansys/{rep => hps}/client/warnings.py (100%) diff --git a/.flake8 b/.flake8 index ddc305f39..ec4bca299 100644 --- a/.flake8 +++ b/.flake8 @@ -1,5 +1,5 @@ [flake8] -exclude = venv, __init__.py, doc/_build, .venv, ansys/rep/client/rms/models.py +exclude = venv, __init__.py, doc/_build, .venv, ansys/hps/client/rms/models.py select = W191, W291, W293, W391, E115, E117, E122, E124, E125, E225, E231, E301, E303, E501, F401, F403, N801, N802, N803, N804, N805, N806, N807, N815, N816 count = True max-complexity = 10 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b74cf7ce7..c8b7a571e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,19 +4,19 @@ repos: rev: 22.3.0 hooks: - id: black - exclude: ^(ansys/rep/client/jms/resource/|ansys/rep/client/auth/resource/|ansys/rep/client/rms/models.py) + exclude: ^(ansys/hps/client/jms/resource/|ansys/hps/client/auth/resource/|ansys/hps/client/rms/models.py) - repo: https://github.com/pycqa/isort rev: 5.11.5 hooks: - id: isort - exclude: ^(ansys/rep/client/jms/resource/|ansys/rep/client/auth/resource/) + exclude: ^(ansys/hps/client/jms/resource/|ansys/hps/client/auth/resource/) - repo: https://github.com/PyCQA/flake8 rev: 5.0.4 hooks: - id: flake8 - exclude: ^(ansys/rep/client/jms/resource/|ansys/rep/client/auth/resource/) + exclude: ^(ansys/hps/client/jms/resource/|ansys/hps/client/auth/resource/) - repo: https://github.com/codespell-project/codespell rev: v2.1.0 diff --git a/README.rst b/README.rst index 56fc3c6a1..53aae8dc4 100644 --- a/README.rst +++ b/README.rst @@ -175,7 +175,7 @@ Then, run the datamodel generator: .. code:: bash - datamodel-codegen --input .\rms_openapi.json --input-file-type openapi --output ansys/rep/client/rms/models.py --output-model-type pydantic_v2.BaseModel + datamodel-codegen --input .\rms_openapi.json --input-file-type openapi --output ansys/hps/client/rms/models.py --output-model-type pydantic_v2.BaseModel .. LINKS AND REFERENCES .. _black: https://github.com/psf/black diff --git a/ansys/rep/client/__init__.py b/ansys/hps/client/__init__.py similarity index 100% rename from ansys/rep/client/__init__.py rename to ansys/hps/client/__init__.py diff --git a/ansys/rep/client/__version__.py b/ansys/hps/client/__version__.py similarity index 100% rename from ansys/rep/client/__version__.py rename to ansys/hps/client/__version__.py diff --git a/ansys/rep/client/auth/__init__.py b/ansys/hps/client/auth/__init__.py similarity index 100% rename from ansys/rep/client/auth/__init__.py rename to ansys/hps/client/auth/__init__.py diff --git a/ansys/rep/client/auth/api/__init__.py b/ansys/hps/client/auth/api/__init__.py similarity index 100% rename from ansys/rep/client/auth/api/__init__.py rename to ansys/hps/client/auth/api/__init__.py diff --git a/ansys/rep/client/auth/api/auth_api.py b/ansys/hps/client/auth/api/auth_api.py similarity index 100% rename from ansys/rep/client/auth/api/auth_api.py rename to ansys/hps/client/auth/api/auth_api.py diff --git a/ansys/rep/client/auth/authenticate.py b/ansys/hps/client/auth/authenticate.py similarity index 100% rename from ansys/rep/client/auth/authenticate.py rename to ansys/hps/client/auth/authenticate.py diff --git a/ansys/rep/client/auth/resource/__init__.py b/ansys/hps/client/auth/resource/__init__.py similarity index 100% rename from ansys/rep/client/auth/resource/__init__.py rename to ansys/hps/client/auth/resource/__init__.py diff --git a/ansys/rep/client/auth/resource/user.py b/ansys/hps/client/auth/resource/user.py similarity index 100% rename from ansys/rep/client/auth/resource/user.py rename to ansys/hps/client/auth/resource/user.py diff --git a/ansys/rep/client/auth/schema/__init__.py b/ansys/hps/client/auth/schema/__init__.py similarity index 100% rename from ansys/rep/client/auth/schema/__init__.py rename to ansys/hps/client/auth/schema/__init__.py diff --git a/ansys/rep/client/auth/schema/user.py b/ansys/hps/client/auth/schema/user.py similarity index 99% rename from ansys/rep/client/auth/schema/user.py rename to ansys/hps/client/auth/schema/user.py index f2a9f7839..869abf6bb 100644 --- a/ansys/rep/client/auth/schema/user.py +++ b/ansys/hps/client/auth/schema/user.py @@ -6,9 +6,8 @@ # Author(s): F.Negri # ---------------------------------------------------------- -from marshmallow import fields - from ansys.rep.client.common.base_schema import BaseSchema +from marshmallow import fields class UserSchema(BaseSchema): diff --git a/ansys/rep/client/client.py b/ansys/hps/client/client.py similarity index 100% rename from ansys/rep/client/client.py rename to ansys/hps/client/client.py diff --git a/ansys/rep/client/common/__init__.py b/ansys/hps/client/common/__init__.py similarity index 100% rename from ansys/rep/client/common/__init__.py rename to ansys/hps/client/common/__init__.py diff --git a/ansys/rep/client/common/base_resource.py b/ansys/hps/client/common/base_resource.py similarity index 100% rename from ansys/rep/client/common/base_resource.py rename to ansys/hps/client/common/base_resource.py diff --git a/ansys/rep/client/common/base_schema.py b/ansys/hps/client/common/base_schema.py similarity index 100% rename from ansys/rep/client/common/base_schema.py rename to ansys/hps/client/common/base_schema.py diff --git a/ansys/rep/client/common/restricted_value.py b/ansys/hps/client/common/restricted_value.py similarity index 100% rename from ansys/rep/client/common/restricted_value.py rename to ansys/hps/client/common/restricted_value.py diff --git a/ansys/rep/client/connection.py b/ansys/hps/client/connection.py similarity index 100% rename from ansys/rep/client/connection.py rename to ansys/hps/client/connection.py diff --git a/ansys/rep/client/exceptions.py b/ansys/hps/client/exceptions.py similarity index 100% rename from ansys/rep/client/exceptions.py rename to ansys/hps/client/exceptions.py diff --git a/ansys/rep/client/jms/__init__.py b/ansys/hps/client/jms/__init__.py similarity index 100% rename from ansys/rep/client/jms/__init__.py rename to ansys/hps/client/jms/__init__.py diff --git a/ansys/rep/client/jms/api/__init__.py b/ansys/hps/client/jms/api/__init__.py similarity index 100% rename from ansys/rep/client/jms/api/__init__.py rename to ansys/hps/client/jms/api/__init__.py diff --git a/ansys/rep/client/jms/api/base.py b/ansys/hps/client/jms/api/base.py similarity index 98% rename from ansys/rep/client/jms/api/base.py rename to ansys/hps/client/jms/api/base.py index cff4ca783..73492337c 100644 --- a/ansys/rep/client/jms/api/base.py +++ b/ansys/hps/client/jms/api/base.py @@ -2,10 +2,9 @@ import logging from typing import List, Type -from requests import Session - from ansys.rep.client.common import Object from ansys.rep.client.exceptions import ClientError +from requests import Session log = logging.getLogger(__name__) @@ -133,7 +132,7 @@ def copy_objects(session: Session, url: str, objects: List[Object], wait: bool = obj_type = objects[0].__class__ rest_name = obj_type.Meta.rest_name - url = f"{url}/{rest_name}:copy" + url = f"{url}/{rest_name}:copy" # noqa source_ids = [obj.id for obj in objects] r = session.post(url, data=json.dumps({"source_ids": source_ids})) diff --git a/ansys/rep/client/jms/api/jms_api.py b/ansys/hps/client/jms/api/jms_api.py similarity index 99% rename from ansys/rep/client/jms/api/jms_api.py rename to ansys/hps/client/jms/api/jms_api.py index 8c47b143c..fb22a3ba1 100644 --- a/ansys/rep/client/jms/api/jms_api.py +++ b/ansys/hps/client/jms/api/jms_api.py @@ -4,14 +4,13 @@ from typing import List, Union import uuid -import backoff -import requests - from ansys.rep.client.client import Client from ansys.rep.client.common import Object from ansys.rep.client.exceptions import REPError from ansys.rep.client.jms.resource import Operation, Permission, Project, TaskDefinitionTemplate from ansys.rep.client.jms.schema.project import ProjectSchema +import backoff +import requests from .base import copy_objects as base_copy_objects from .base import create_objects, delete_objects, get_object, get_objects, update_objects diff --git a/ansys/rep/client/jms/api/project_api.py b/ansys/hps/client/jms/api/project_api.py similarity index 99% rename from ansys/rep/client/jms/api/project_api.py rename to ansys/hps/client/jms/api/project_api.py index e789a01c6..944416eba 100644 --- a/ansys/rep/client/jms/api/project_api.py +++ b/ansys/hps/client/jms/api/project_api.py @@ -5,8 +5,6 @@ from typing import Callable, List, Type, Union from warnings import warn -import requests - from ansys.rep.client.client import Client from ansys.rep.client.common import Object from ansys.rep.client.exceptions import REPError @@ -24,6 +22,7 @@ Task, TaskDefinition, ) +import requests from .base import create_objects, delete_objects, get_objects, update_objects from .jms_api import JmsApi, _copy_objects diff --git a/ansys/rep/client/jms/keys.py b/ansys/hps/client/jms/keys.py similarity index 100% rename from ansys/rep/client/jms/keys.py rename to ansys/hps/client/jms/keys.py diff --git a/ansys/rep/client/jms/resource/.gitignore b/ansys/hps/client/jms/resource/.gitignore similarity index 100% rename from ansys/rep/client/jms/resource/.gitignore rename to ansys/hps/client/jms/resource/.gitignore diff --git a/ansys/rep/client/jms/resource/__init__.py b/ansys/hps/client/jms/resource/__init__.py similarity index 100% rename from ansys/rep/client/jms/resource/__init__.py rename to ansys/hps/client/jms/resource/__init__.py diff --git a/ansys/rep/client/jms/resource/algorithm.py b/ansys/hps/client/jms/resource/algorithm.py similarity index 100% rename from ansys/rep/client/jms/resource/algorithm.py rename to ansys/hps/client/jms/resource/algorithm.py diff --git a/ansys/rep/client/jms/resource/evaluator.py b/ansys/hps/client/jms/resource/evaluator.py similarity index 100% rename from ansys/rep/client/jms/resource/evaluator.py rename to ansys/hps/client/jms/resource/evaluator.py diff --git a/ansys/rep/client/jms/resource/file.py b/ansys/hps/client/jms/resource/file.py similarity index 100% rename from ansys/rep/client/jms/resource/file.py rename to ansys/hps/client/jms/resource/file.py diff --git a/ansys/rep/client/jms/resource/fitness_definition.py b/ansys/hps/client/jms/resource/fitness_definition.py similarity index 100% rename from ansys/rep/client/jms/resource/fitness_definition.py rename to ansys/hps/client/jms/resource/fitness_definition.py diff --git a/ansys/rep/client/jms/resource/job.py b/ansys/hps/client/jms/resource/job.py similarity index 100% rename from ansys/rep/client/jms/resource/job.py rename to ansys/hps/client/jms/resource/job.py diff --git a/ansys/rep/client/jms/resource/job_definition.py b/ansys/hps/client/jms/resource/job_definition.py similarity index 100% rename from ansys/rep/client/jms/resource/job_definition.py rename to ansys/hps/client/jms/resource/job_definition.py diff --git a/ansys/rep/client/jms/resource/license_context.py b/ansys/hps/client/jms/resource/license_context.py similarity index 100% rename from ansys/rep/client/jms/resource/license_context.py rename to ansys/hps/client/jms/resource/license_context.py diff --git a/ansys/rep/client/jms/resource/operation.py b/ansys/hps/client/jms/resource/operation.py similarity index 100% rename from ansys/rep/client/jms/resource/operation.py rename to ansys/hps/client/jms/resource/operation.py diff --git a/ansys/rep/client/jms/resource/parameter_definition.py b/ansys/hps/client/jms/resource/parameter_definition.py similarity index 100% rename from ansys/rep/client/jms/resource/parameter_definition.py rename to ansys/hps/client/jms/resource/parameter_definition.py diff --git a/ansys/rep/client/jms/resource/parameter_mapping.py b/ansys/hps/client/jms/resource/parameter_mapping.py similarity index 100% rename from ansys/rep/client/jms/resource/parameter_mapping.py rename to ansys/hps/client/jms/resource/parameter_mapping.py diff --git a/ansys/rep/client/jms/resource/permission.py b/ansys/hps/client/jms/resource/permission.py similarity index 100% rename from ansys/rep/client/jms/resource/permission.py rename to ansys/hps/client/jms/resource/permission.py diff --git a/ansys/rep/client/jms/resource/project.py b/ansys/hps/client/jms/resource/project.py similarity index 100% rename from ansys/rep/client/jms/resource/project.py rename to ansys/hps/client/jms/resource/project.py diff --git a/ansys/rep/client/jms/resource/selection.py b/ansys/hps/client/jms/resource/selection.py similarity index 100% rename from ansys/rep/client/jms/resource/selection.py rename to ansys/hps/client/jms/resource/selection.py diff --git a/ansys/rep/client/jms/resource/task.py b/ansys/hps/client/jms/resource/task.py similarity index 100% rename from ansys/rep/client/jms/resource/task.py rename to ansys/hps/client/jms/resource/task.py diff --git a/ansys/rep/client/jms/resource/task_definition.py b/ansys/hps/client/jms/resource/task_definition.py similarity index 100% rename from ansys/rep/client/jms/resource/task_definition.py rename to ansys/hps/client/jms/resource/task_definition.py diff --git a/ansys/rep/client/jms/resource/task_definition_template.py b/ansys/hps/client/jms/resource/task_definition_template.py similarity index 100% rename from ansys/rep/client/jms/resource/task_definition_template.py rename to ansys/hps/client/jms/resource/task_definition_template.py diff --git a/ansys/rep/client/jms/schema/__init__.py b/ansys/hps/client/jms/schema/__init__.py similarity index 100% rename from ansys/rep/client/jms/schema/__init__.py rename to ansys/hps/client/jms/schema/__init__.py diff --git a/ansys/rep/client/jms/schema/algorithm.py b/ansys/hps/client/jms/schema/algorithm.py similarity index 99% rename from ansys/rep/client/jms/schema/algorithm.py rename to ansys/hps/client/jms/schema/algorithm.py index b9ffceb3a..dbe78952d 100644 --- a/ansys/rep/client/jms/schema/algorithm.py +++ b/ansys/hps/client/jms/schema/algorithm.py @@ -6,9 +6,8 @@ # Author(s): O.Koenig # ---------------------------------------------------------- -from marshmallow import fields - from ansys.rep.client.common import ObjectSchemaWithModificationInfo +from marshmallow import fields from .object_reference import IdReferenceList diff --git a/ansys/rep/client/jms/schema/evaluator.py b/ansys/hps/client/jms/schema/evaluator.py similarity index 99% rename from ansys/rep/client/jms/schema/evaluator.py rename to ansys/hps/client/jms/schema/evaluator.py index 30d91f6e2..905473d8a 100644 --- a/ansys/rep/client/jms/schema/evaluator.py +++ b/ansys/hps/client/jms/schema/evaluator.py @@ -6,12 +6,11 @@ # Author(s): F.Negri # ---------------------------------------------------------- +from ansys.rep.client.common import ObjectSchema, RestrictedValue import marshmallow from marshmallow import fields from marshmallow.validate import OneOf -from ansys.rep.client.common import ObjectSchema, RestrictedValue - project_assignment_modes = ["disabled", "all_active", "project_list"] diff --git a/ansys/rep/client/jms/schema/file.py b/ansys/hps/client/jms/schema/file.py similarity index 99% rename from ansys/rep/client/jms/schema/file.py rename to ansys/hps/client/jms/schema/file.py index 98069692c..1b07db3ee 100644 --- a/ansys/rep/client/jms/schema/file.py +++ b/ansys/hps/client/jms/schema/file.py @@ -6,9 +6,8 @@ # Author(s): O.Koenig # ---------------------------------------------------------- -from marshmallow import fields - from ansys.rep.client.common import ObjectSchemaWithModificationInfo +from marshmallow import fields from .object_reference import IdReference diff --git a/ansys/rep/client/jms/schema/fitness_definition.py b/ansys/hps/client/jms/schema/fitness_definition.py similarity index 99% rename from ansys/rep/client/jms/schema/fitness_definition.py rename to ansys/hps/client/jms/schema/fitness_definition.py index 20a45f0ab..3e871b332 100644 --- a/ansys/rep/client/jms/schema/fitness_definition.py +++ b/ansys/hps/client/jms/schema/fitness_definition.py @@ -6,11 +6,10 @@ # Author(s): O.Koenig # ---------------------------------------------------------- +from ansys.rep.client.common import ObjectSchema from marshmallow import fields from marshmallow.validate import OneOf -from ansys.rep.client.common import ObjectSchema - fitness_term_types = ["design_objective", "limit_constraint", "target_constraint"] diff --git a/ansys/rep/client/jms/schema/job.py b/ansys/hps/client/jms/schema/job.py similarity index 99% rename from ansys/rep/client/jms/schema/job.py rename to ansys/hps/client/jms/schema/job.py index 34ab89176..1726d43f7 100644 --- a/ansys/rep/client/jms/schema/job.py +++ b/ansys/hps/client/jms/schema/job.py @@ -6,11 +6,10 @@ # Author(s): O.Koenig # ---------------------------------------------------------- +from ansys.rep.client.common import ObjectSchemaWithModificationInfo from marshmallow import fields from marshmallow.validate import OneOf -from ansys.rep.client.common import ObjectSchemaWithModificationInfo - from .object_reference import IdReference, IdReferenceList valid_eval_status = [ diff --git a/ansys/rep/client/jms/schema/job_definition.py b/ansys/hps/client/jms/schema/job_definition.py similarity index 99% rename from ansys/rep/client/jms/schema/job_definition.py rename to ansys/hps/client/jms/schema/job_definition.py index 0180e130a..e7f19332d 100644 --- a/ansys/rep/client/jms/schema/job_definition.py +++ b/ansys/hps/client/jms/schema/job_definition.py @@ -7,9 +7,8 @@ # ---------------------------------------------------------- import logging -from marshmallow import fields - from ansys.rep.client.common import ObjectSchemaWithModificationInfo +from marshmallow import fields from .fitness_definition import FitnessDefinitionSchema from .object_reference import IdReferenceList diff --git a/ansys/rep/client/jms/schema/license_context.py b/ansys/hps/client/jms/schema/license_context.py similarity index 99% rename from ansys/rep/client/jms/schema/license_context.py rename to ansys/hps/client/jms/schema/license_context.py index 149751ae2..c66465039 100644 --- a/ansys/rep/client/jms/schema/license_context.py +++ b/ansys/hps/client/jms/schema/license_context.py @@ -6,9 +6,8 @@ # Author(s): O.Koenig # ---------------------------------------------------------- -from marshmallow import fields - from ansys.rep.client.common import BaseSchema +from marshmallow import fields class LicenseContextSchema(BaseSchema): diff --git a/ansys/rep/client/jms/schema/object_reference.py b/ansys/hps/client/jms/schema/object_reference.py similarity index 100% rename from ansys/rep/client/jms/schema/object_reference.py rename to ansys/hps/client/jms/schema/object_reference.py diff --git a/ansys/rep/client/jms/schema/operation.py b/ansys/hps/client/jms/schema/operation.py similarity index 99% rename from ansys/rep/client/jms/schema/operation.py rename to ansys/hps/client/jms/schema/operation.py index 1ec3533c8..2eb7f10e5 100644 --- a/ansys/rep/client/jms/schema/operation.py +++ b/ansys/hps/client/jms/schema/operation.py @@ -1,6 +1,5 @@ -from marshmallow import fields - from ansys.rep.client.common import ObjectSchema +from marshmallow import fields class OperationSchema(ObjectSchema): diff --git a/ansys/rep/client/jms/schema/parameter_definition.py b/ansys/hps/client/jms/schema/parameter_definition.py similarity index 99% rename from ansys/rep/client/jms/schema/parameter_definition.py rename to ansys/hps/client/jms/schema/parameter_definition.py index 4842181a0..aa5b99232 100644 --- a/ansys/rep/client/jms/schema/parameter_definition.py +++ b/ansys/hps/client/jms/schema/parameter_definition.py @@ -7,11 +7,10 @@ # ---------------------------------------------------------- import logging +from ansys.rep.client.common import ObjectSchemaWithModificationInfo from marshmallow import fields from marshmallow_oneofschema import OneOfSchema -from ansys.rep.client.common import ObjectSchemaWithModificationInfo - log = logging.getLogger(__name__) diff --git a/ansys/rep/client/jms/schema/parameter_mapping.py b/ansys/hps/client/jms/schema/parameter_mapping.py similarity index 99% rename from ansys/rep/client/jms/schema/parameter_mapping.py rename to ansys/hps/client/jms/schema/parameter_mapping.py index 22f3ac39c..d3da92a16 100644 --- a/ansys/rep/client/jms/schema/parameter_mapping.py +++ b/ansys/hps/client/jms/schema/parameter_mapping.py @@ -7,9 +7,8 @@ # ---------------------------------------------------------- import logging -from marshmallow import fields - from ansys.rep.client.common import ObjectSchemaWithModificationInfo +from marshmallow import fields from .object_reference import IdReference diff --git a/ansys/rep/client/jms/schema/permission.py b/ansys/hps/client/jms/schema/permission.py similarity index 99% rename from ansys/rep/client/jms/schema/permission.py rename to ansys/hps/client/jms/schema/permission.py index 891f11bd6..8bce9325e 100644 --- a/ansys/rep/client/jms/schema/permission.py +++ b/ansys/hps/client/jms/schema/permission.py @@ -1,6 +1,5 @@ -from marshmallow import fields - from ansys.rep.client.common import BaseSchema +from marshmallow import fields class PermissionSchema(BaseSchema): diff --git a/ansys/rep/client/jms/schema/project.py b/ansys/hps/client/jms/schema/project.py similarity index 99% rename from ansys/rep/client/jms/schema/project.py rename to ansys/hps/client/jms/schema/project.py index 046fe3af4..ec0436c99 100644 --- a/ansys/rep/client/jms/schema/project.py +++ b/ansys/hps/client/jms/schema/project.py @@ -6,9 +6,8 @@ # Author(s): O.Koenig # ---------------------------------------------------------- -from marshmallow import fields - from ansys.rep.client.common import BaseSchema +from marshmallow import fields class ProjectSchema(BaseSchema): diff --git a/ansys/rep/client/jms/schema/selection.py b/ansys/hps/client/jms/schema/selection.py similarity index 99% rename from ansys/rep/client/jms/schema/selection.py rename to ansys/hps/client/jms/schema/selection.py index 9bc19c4b5..47f7a7f69 100644 --- a/ansys/rep/client/jms/schema/selection.py +++ b/ansys/hps/client/jms/schema/selection.py @@ -6,9 +6,8 @@ # Author(s): O.Koenig # ---------------------------------------------------------- -from marshmallow import fields - from ansys.rep.client.common import ObjectSchemaWithModificationInfo +from marshmallow import fields from .object_reference import IdReference, IdReferenceList diff --git a/ansys/rep/client/jms/schema/task.py b/ansys/hps/client/jms/schema/task.py similarity index 99% rename from ansys/rep/client/jms/schema/task.py rename to ansys/hps/client/jms/schema/task.py index a5ce57f86..aa8a13b0f 100644 --- a/ansys/rep/client/jms/schema/task.py +++ b/ansys/hps/client/jms/schema/task.py @@ -6,9 +6,8 @@ # Author(s): F.Negri # ---------------------------------------------------------- -from marshmallow import fields - from ansys.rep.client.common import ObjectSchemaWithModificationInfo +from marshmallow import fields from .object_reference import IdReference, IdReferenceList from .task_definition import TaskDefinitionSchema diff --git a/ansys/rep/client/jms/schema/task_definition.py b/ansys/hps/client/jms/schema/task_definition.py similarity index 99% rename from ansys/rep/client/jms/schema/task_definition.py rename to ansys/hps/client/jms/schema/task_definition.py index d104ea11c..ad044cb28 100644 --- a/ansys/rep/client/jms/schema/task_definition.py +++ b/ansys/hps/client/jms/schema/task_definition.py @@ -6,9 +6,8 @@ # Author(s): O.Koenig # ---------------------------------------------------------- -from marshmallow import fields - from ansys.rep.client.common import BaseSchema, ObjectSchemaWithModificationInfo, RestrictedValue +from marshmallow import fields from .object_reference import IdReference, IdReferenceList diff --git a/ansys/rep/client/jms/schema/task_definition_template.py b/ansys/hps/client/jms/schema/task_definition_template.py similarity index 99% rename from ansys/rep/client/jms/schema/task_definition_template.py rename to ansys/hps/client/jms/schema/task_definition_template.py index 227b58352..0d4501dfe 100644 --- a/ansys/rep/client/jms/schema/task_definition_template.py +++ b/ansys/hps/client/jms/schema/task_definition_template.py @@ -6,9 +6,8 @@ # Author(s): F. Negri # ---------------------------------------------------------- -from marshmallow import fields, validate - from ansys.rep.client.common import BaseSchema, ObjectSchema +from marshmallow import fields, validate from .task_definition import HpcResourcesSchema, SoftwareSchema diff --git a/ansys/rep/client/rms/__init__.py b/ansys/hps/client/rms/__init__.py similarity index 100% rename from ansys/rep/client/rms/__init__.py rename to ansys/hps/client/rms/__init__.py diff --git a/ansys/rep/client/rms/api/base.py b/ansys/hps/client/rms/api/base.py similarity index 99% rename from ansys/rep/client/rms/api/base.py rename to ansys/hps/client/rms/api/base.py index 4aa39c6ce..a4b8ce4ea 100644 --- a/ansys/rep/client/rms/api/base.py +++ b/ansys/hps/client/rms/api/base.py @@ -2,13 +2,12 @@ import logging from typing import List, Type +from ansys.rep.client.exceptions import ClientError from pydantic import BaseModel from pydantic import __version__ as pydantic_version from pydantic import create_model from requests import Session -from ansys.rep.client.exceptions import ClientError - from ..models import ( Cluster, ComputeResourceSet, diff --git a/ansys/rep/client/rms/api/rms_api.py b/ansys/hps/client/rms/api/rms_api.py similarity index 100% rename from ansys/rep/client/rms/api/rms_api.py rename to ansys/hps/client/rms/api/rms_api.py diff --git a/ansys/rep/client/rms/models.py b/ansys/hps/client/rms/models.py similarity index 100% rename from ansys/rep/client/rms/models.py rename to ansys/hps/client/rms/models.py diff --git a/ansys/rep/client/warnings.py b/ansys/hps/client/warnings.py similarity index 100% rename from ansys/rep/client/warnings.py rename to ansys/hps/client/warnings.py From 79170bb8743e94089aa3fad60fd810ef0d861128 Mon Sep 17 00:00:00 2001 From: Federico Negri Date: Thu, 14 Dec 2023 07:28:14 +0100 Subject: [PATCH 04/19] Rename ansys.rep.client to ansys.hps.client --- .flake8 | 2 +- ansys/hps/client/auth/api/auth_api.py | 12 ++-- ansys/hps/client/auth/resource/user.py | 2 +- ansys/hps/client/auth/schema/user.py | 3 +- ansys/hps/client/client.py | 2 +- ansys/hps/client/connection.py | 2 +- ansys/hps/client/exceptions.py | 4 +- ansys/hps/client/jms/api/base.py | 7 ++- ansys/hps/client/jms/api/jms_api.py | 21 +++---- ansys/hps/client/jms/api/project_api.py | 27 ++++----- ansys/hps/client/jms/resource/algorithm.py | 2 +- ansys/hps/client/jms/resource/evaluator.py | 2 +- ansys/hps/client/jms/resource/file.py | 2 +- .../client/jms/resource/fitness_definition.py | 4 +- ansys/hps/client/jms/resource/job.py | 2 +- .../hps/client/jms/resource/job_definition.py | 2 +- .../client/jms/resource/license_context.py | 2 +- ansys/hps/client/jms/resource/operation.py | 2 +- .../jms/resource/parameter_definition.py | 2 +- .../client/jms/resource/parameter_mapping.py | 2 +- ansys/hps/client/jms/resource/permission.py | 2 +- ansys/hps/client/jms/resource/project.py | 2 +- ansys/hps/client/jms/resource/selection.py | 2 +- ansys/hps/client/jms/resource/task.py | 2 +- .../client/jms/resource/task_definition.py | 2 +- .../jms/resource/task_definition_template.py | 2 +- ansys/hps/client/jms/schema/algorithm.py | 3 +- ansys/hps/client/jms/schema/evaluator.py | 3 +- ansys/hps/client/jms/schema/file.py | 3 +- .../client/jms/schema/fitness_definition.py | 3 +- ansys/hps/client/jms/schema/job.py | 3 +- ansys/hps/client/jms/schema/job_definition.py | 3 +- .../hps/client/jms/schema/license_context.py | 3 +- ansys/hps/client/jms/schema/operation.py | 3 +- .../client/jms/schema/parameter_definition.py | 3 +- .../client/jms/schema/parameter_mapping.py | 3 +- ansys/hps/client/jms/schema/permission.py | 3 +- ansys/hps/client/jms/schema/project.py | 3 +- ansys/hps/client/jms/schema/selection.py | 3 +- ansys/hps/client/jms/schema/task.py | 3 +- .../hps/client/jms/schema/task_definition.py | 3 +- .../jms/schema/task_definition_template.py | 3 +- ansys/hps/client/rms/api/base.py | 3 +- ansys/hps/client/rms/api/rms_api.py | 8 +-- doc/source/api/auth.rst | 8 +-- doc/source/api/client.rst | 4 +- doc/source/api/exceptions.rst | 12 ++-- doc/source/api/jms.rst | 58 +++++++++---------- doc/source/api/rms.rst | 14 ++--- doc/source/conf.py | 2 +- doc/source/quickstart.rst | 14 ++--- examples/add_num_cores_to_wb_project.py | 4 +- examples/cfx_static_mixer/project_setup.py | 4 +- .../fluent_2d_heat_exchanger/project_setup.py | 4 +- examples/fluent_nozzle/project_setup.py | 4 +- examples/lsdyna_cylinder_plate/lsdyna_job.py | 11 ++-- .../mapdl_linked_analyses/project_setup.py | 4 +- .../motorbike_frame.ipynb | 2 +- .../mapdl_motorbike_frame/project_query.py | 6 +- .../mapdl_motorbike_frame/project_setup.py | 4 +- examples/mapdl_motorbike_frame/task_files.py | 4 +- .../mapdl_tyre_performance/project_setup.py | 4 +- .../project_setup.py | 8 +-- .../project_setup.py | 6 +- .../python_multi_process_step/task_files.py | 2 +- .../project_setup.py | 4 +- .../python_two_bar_truss.ipynb | 4 +- generate_resources.py | 12 ++-- prepare_documentation.py | 8 +-- pyproject.toml | 2 +- tests/auth/test_api.py | 4 +- tests/auth/test_authenticate.py | 2 +- tests/jms/test_algorithms.py | 4 +- tests/jms/test_files.py | 4 +- tests/jms/test_fitness_definition.py | 8 +-- tests/jms/test_jms_api.py | 6 +- tests/jms/test_job_definitions.py | 4 +- tests/jms/test_jobs.py | 6 +- tests/jms/test_parameter_definitions.py | 6 +- tests/jms/test_project_permissions.py | 10 ++-- tests/jms/test_projects.py | 8 +-- tests/jms/test_resources.py | 2 +- tests/jms/test_task_definition.py | 6 +- tests/jms/test_task_definition_templates.py | 10 ++-- tests/jms/test_task_files.py | 4 +- tests/jms/test_tasks.py | 6 +- tests/rep_test.py | 6 +- tests/rms/test_api.py | 2 +- tests/rms/test_compute_resource_sets.py | 2 +- tests/rms/test_evaluators.py | 4 +- tests/rms/test_serialization.py | 4 +- tests/test_client.py | 2 +- tests/test_connection.py | 4 +- tests/test_examples.py | 4 +- tests/test_exceptions.py | 4 +- 95 files changed, 263 insertions(+), 243 deletions(-) diff --git a/.flake8 b/.flake8 index ec4bca299..59849d82c 100644 --- a/.flake8 +++ b/.flake8 @@ -1,5 +1,5 @@ [flake8] -exclude = venv, __init__.py, doc/_build, .venv, ansys/hps/client/rms/models.py +exclude = venv, __init__.py, doc/_build, .venv, ansys/hps/client/rms/models.py, generate_resources.py select = W191, W291, W293, W391, E115, E117, E122, E124, E125, E225, E231, E301, E303, E501, F401, F403, N801, N802, N803, N804, N805, N806, N807, N815, N816 count = True max-complexity = 10 diff --git a/ansys/hps/client/auth/api/auth_api.py b/ansys/hps/client/auth/api/auth_api.py index 887ee4d91..d3f5bda18 100644 --- a/ansys/hps/client/auth/api/auth_api.py +++ b/ansys/hps/client/auth/api/auth_api.py @@ -31,8 +31,8 @@ class AuthApi: Get users whose first name contains "john": - >>> from ansys.rep.client import Client - >>> from ansys.rep.client.auth import AuthApi, User + >>> from ansys.hps.client import Client + >>> from ansys.hps.client.auth import AuthApi, User >>> cl = Client( ... rep_url="https://127.0.0.1:8443/rep/", username="repadmin", password="repadmin" ... ) @@ -96,7 +96,7 @@ def get_user_realm_roles(self, id: str) -> List[str]: def user_is_admin(self, id: str) -> bool: """Check whether the user is system admin""" - from ansys.rep.client.jms import JmsApi + from ansys.hps.client.jms import JmsApi # the admin keys are configurable settings of JMS # they need to be queried, can't be hardcoded @@ -119,7 +119,7 @@ def create_user(self, user: User, as_objects=True) -> User: """Create a new user. Args: - user (:class:`ansys.rep.client.auth.User`): A User object. Defaults to None. + user (:class:`ansys.hps.client.auth.User`): A User object. Defaults to None. as_objects (bool, optional): Defaults to True. """ return create_user(self.keycloak_admin_client, user, as_objects=as_objects) @@ -128,7 +128,7 @@ def update_user(self, user: User, as_objects=True) -> User: """Modify an existing user. Args: - user (:class:`ansys.rep.client.auth.User`): A User object. Defaults to None. + user (:class:`ansys.hps.client.auth.User`): A User object. Defaults to None. as_objects (bool, optional): Defaults to True. """ return update_user(self.keycloak_admin_client, user, as_objects=as_objects) @@ -137,7 +137,7 @@ def delete_user(self, user: User) -> None: """Delete an existing user. Args: - user (:class:`ansys.rep.client.auth.User`): A User object. Defaults to None. + user (:class:`ansys.hps.client.auth.User`): A User object. Defaults to None. """ return self.keycloak_admin_client.delete_user(user.id) diff --git a/ansys/hps/client/auth/resource/user.py b/ansys/hps/client/auth/resource/user.py index aa27bd7ac..8076d5e0d 100644 --- a/ansys/hps/client/auth/resource/user.py +++ b/ansys/hps/client/auth/resource/user.py @@ -1,6 +1,6 @@ # autogenerated code from marshmallow.utils import missing -from ansys.rep.client.common import Object +from ansys.hps.client.common import Object from ..schema.user import UserSchema class User(Object): diff --git a/ansys/hps/client/auth/schema/user.py b/ansys/hps/client/auth/schema/user.py index 869abf6bb..0efca4c1e 100644 --- a/ansys/hps/client/auth/schema/user.py +++ b/ansys/hps/client/auth/schema/user.py @@ -6,9 +6,10 @@ # Author(s): F.Negri # ---------------------------------------------------------- -from ansys.rep.client.common.base_schema import BaseSchema from marshmallow import fields +from ansys.hps.client.common.base_schema import BaseSchema + class UserSchema(BaseSchema): class Meta(BaseSchema.Meta): diff --git a/ansys/hps/client/client.py b/ansys/hps/client/client.py index 23e76d8b9..75eb84d54 100644 --- a/ansys/hps/client/client.py +++ b/ansys/hps/client/client.py @@ -68,7 +68,7 @@ class Client(object): Create client object and connect to REP with username and password - >>> from ansys.rep.client import Client + >>> from ansys.hps.client import Client >>> cl = Client( ... rep_url="https://localhost:8443/rep", ... username="repuser", diff --git a/ansys/hps/client/connection.py b/ansys/hps/client/connection.py index 8858232d7..4036c2f68 100644 --- a/ansys/hps/client/connection.py +++ b/ansys/hps/client/connection.py @@ -24,7 +24,7 @@ def create_session( Parameters ---------- access_token : str - The access token provided by :meth:`ansys.rep.client.auth.authenticate` + The access token provided by :meth:`ansys.hps.client.auth.authenticate` verify: Union[bool, str], optional Either a boolean, in which case it controls whether we verify the server's TLS certificate, or a string, in which case it must be diff --git a/ansys/hps/client/exceptions.py b/ansys/hps/client/exceptions.py index 4b4b4955d..477f71eeb 100644 --- a/ansys/hps/client/exceptions.py +++ b/ansys/hps/client/exceptions.py @@ -15,8 +15,8 @@ def __init__(self, *args, **kwargs): Derives from :class:`requests.exceptions.RequestException`. Example: - >>> from ansys.rep.client import REPError - >>> from ansys.rep.client.jms import Client + >>> from ansys.hps.client import REPError + >>> from ansys.hps.client.jms import Client >>> try: >>> client = Client(rep_url="https://127.0.0.1:8443/rep/", username="repadmin", diff --git a/ansys/hps/client/jms/api/base.py b/ansys/hps/client/jms/api/base.py index 73492337c..acf831250 100644 --- a/ansys/hps/client/jms/api/base.py +++ b/ansys/hps/client/jms/api/base.py @@ -2,10 +2,11 @@ import logging from typing import List, Type -from ansys.rep.client.common import Object -from ansys.rep.client.exceptions import ClientError from requests import Session +from ansys.hps.client.common import Object +from ansys.hps.client.exceptions import ClientError + log = logging.getLogger(__name__) @@ -132,7 +133,7 @@ def copy_objects(session: Session, url: str, objects: List[Object], wait: bool = obj_type = objects[0].__class__ rest_name = obj_type.Meta.rest_name - url = f"{url}/{rest_name}:copy" # noqa + url = f"{url}/{rest_name}:copy" # noqa: E231 source_ids = [obj.id for obj in objects] r = session.post(url, data=json.dumps({"source_ids": source_ids})) diff --git a/ansys/hps/client/jms/api/jms_api.py b/ansys/hps/client/jms/api/jms_api.py index fb22a3ba1..4ecfbb8f0 100644 --- a/ansys/hps/client/jms/api/jms_api.py +++ b/ansys/hps/client/jms/api/jms_api.py @@ -4,14 +4,15 @@ from typing import List, Union import uuid -from ansys.rep.client.client import Client -from ansys.rep.client.common import Object -from ansys.rep.client.exceptions import REPError -from ansys.rep.client.jms.resource import Operation, Permission, Project, TaskDefinitionTemplate -from ansys.rep.client.jms.schema.project import ProjectSchema import backoff import requests +from ansys.hps.client.client import Client +from ansys.hps.client.common import Object +from ansys.hps.client.exceptions import REPError +from ansys.hps.client.jms.resource import Operation, Permission, Project, TaskDefinitionTemplate +from ansys.hps.client.jms.schema.project import ProjectSchema + from .base import copy_objects as base_copy_objects from .base import create_objects, delete_objects, get_object, get_objects, update_objects @@ -31,8 +32,8 @@ class JmsApi(object): Create a new project - >>> from ansys.rep.client import Client - >>> from ansys.rep.client.jms import JmsApi, Project + >>> from ansys.hps.client import Client + >>> from ansys.hps.client.jms import JmsApi, Project >>> cl = Client( ... rep_url="https://127.0.0.1:8443/rep", username="repadmin", password="repadmin" ... ) @@ -125,7 +126,7 @@ def create_task_definition_templates( """Create new task definition templates Args: - templates (list of :class:`ansys.rep.client.jms.TaskDefinitionTemplate`): + templates (list of :class:`ansys.hps.client.jms.TaskDefinitionTemplate`): A list of task definition templates """ return create_objects(self.client.session, self.url, templates, as_objects, **query_params) @@ -136,7 +137,7 @@ def update_task_definition_templates( """Update existing task definition templates Args: - templates (list of :class:`ansys.rep.client.jms.TaskDefinitionTemplate`): + templates (list of :class:`ansys.hps.client.jms.TaskDefinitionTemplate`): A list of task definition templates """ return update_objects( @@ -152,7 +153,7 @@ def delete_task_definition_templates(self, templates: List[TaskDefinitionTemplat """Delete existing task definition templates Args: - templates (list of :class:`ansys.rep.client.jms.TaskDefinitionTemplate`): + templates (list of :class:`ansys.hps.client.jms.TaskDefinitionTemplate`): A list of task definition templates """ return delete_objects(self.client.session, self.url, templates) diff --git a/ansys/hps/client/jms/api/project_api.py b/ansys/hps/client/jms/api/project_api.py index 944416eba..18823c1c4 100644 --- a/ansys/hps/client/jms/api/project_api.py +++ b/ansys/hps/client/jms/api/project_api.py @@ -5,10 +5,12 @@ from typing import Callable, List, Type, Union from warnings import warn -from ansys.rep.client.client import Client -from ansys.rep.client.common import Object -from ansys.rep.client.exceptions import REPError -from ansys.rep.client.jms.resource import ( +import requests + +from ansys.hps.client.client import Client +from ansys.hps.client.common import Object +from ansys.hps.client.exceptions import REPError +from ansys.hps.client.jms.resource import ( Algorithm, File, Job, @@ -22,7 +24,6 @@ Task, TaskDefinition, ) -import requests from .base import create_objects, delete_objects, get_objects, update_objects from .jms_api import JmsApi, _copy_objects @@ -43,8 +44,8 @@ class ProjectApi: Examples -------- - >>> from ansys.rep.client import Client - >>> from ansys.rep.client.jms import JmsApi, Project, ProjectApi + >>> from ansys.hps.client import Client + >>> from ansys.hps.client.jms import JmsApi, Project, ProjectApi >>> cl = Client( ... rep_url="https://127.0.0.1:8443/rep", username="repadmin", password="repadmin" ... ) @@ -127,7 +128,7 @@ def get_files(self, as_objects=True, content=False, **query_params) -> List[File """ Return a list of file resources, optionally filtered by given query parameters. If content=True, each files content is downloaded as well and stored in memory - as :attr:`ansys.rep.client.jms.File.content`. + as :attr:`ansys.hps.client.jms.File.content`. """ return get_files(self, as_objects=as_objects, content=content, **query_params) @@ -283,11 +284,11 @@ def create_jobs(self, jobs: List[Job], as_objects=True) -> List[Job]: """Create new jobs Args: - jobs (list of :class:`ansys.rep.client.jms.Job`): A list of Job objects + jobs (list of :class:`ansys.hps.client.jms.Job`): A list of Job objects as_objects (bool): Whether to return jobs as objects or dictionaries Returns: - List of :class:`ansys.rep.client.jms.Job` or list of dict if `as_objects` is False + List of :class:`ansys.hps.client.jms.Job` or list of dict if `as_objects` is False """ return self._create_objects(jobs, as_objects=as_objects) @@ -316,11 +317,11 @@ def update_jobs(self, jobs: List[Job], as_objects=True) -> List[Job]: """Update existing jobs Args: - jobs (list of :class:`ansys.rep.client.jms.Job`): A list of job objects + jobs (list of :class:`ansys.hps.client.jms.Job`): A list of job objects as_objects (bool): Whether to return jobs as objects or dictionaries Returns: - List of :class:`ansys.rep.client.jms.Job` or list of dict if `as_objects` is True + List of :class:`ansys.hps.client.jms.Job` or list of dict if `as_objects` is True """ return self._update_objects(jobs, Job, as_objects=as_objects) @@ -328,7 +329,7 @@ def delete_jobs(self, jobs: List[Job]): """Delete existing jobs Args: - jobs (list of :class:`ansys.rep.client.jms.Job`): A list of Job objects + jobs (list of :class:`ansys.hps.client.jms.Job`): A list of Job objects Note that only the ``id`` field of the Job objects need to be filled; the other fields can be empty. diff --git a/ansys/hps/client/jms/resource/algorithm.py b/ansys/hps/client/jms/resource/algorithm.py index 03affe6b2..75329adfe 100644 --- a/ansys/hps/client/jms/resource/algorithm.py +++ b/ansys/hps/client/jms/resource/algorithm.py @@ -1,6 +1,6 @@ # autogenerated code from marshmallow.utils import missing -from ansys.rep.client.common import Object +from ansys.hps.client.common import Object from ..schema.algorithm import AlgorithmSchema class Algorithm(Object): diff --git a/ansys/hps/client/jms/resource/evaluator.py b/ansys/hps/client/jms/resource/evaluator.py index ceb48601a..4e3aa9709 100644 --- a/ansys/hps/client/jms/resource/evaluator.py +++ b/ansys/hps/client/jms/resource/evaluator.py @@ -1,6 +1,6 @@ # autogenerated code from marshmallow.utils import missing -from ansys.rep.client.common import Object +from ansys.hps.client.common import Object from ..schema.evaluator import EvaluatorConfigurationUpdateSchema from ..schema.evaluator import EvaluatorSchema diff --git a/ansys/hps/client/jms/resource/file.py b/ansys/hps/client/jms/resource/file.py index 76fca663b..65c9fa044 100644 --- a/ansys/hps/client/jms/resource/file.py +++ b/ansys/hps/client/jms/resource/file.py @@ -3,7 +3,7 @@ import io from ..schema.file import FileSchema -from ansys.rep.client.common import Object +from ansys.hps.client.common import Object class File(Object): diff --git a/ansys/hps/client/jms/resource/fitness_definition.py b/ansys/hps/client/jms/resource/fitness_definition.py index 6a1e3a9f4..4e4a128a0 100644 --- a/ansys/hps/client/jms/resource/fitness_definition.py +++ b/ansys/hps/client/jms/resource/fitness_definition.py @@ -10,7 +10,7 @@ from marshmallow.utils import missing from ..schema.fitness_definition import FitnessDefinitionSchema, FitnessTermDefinitionSchema -from ansys.rep.client.common import Object +from ansys.hps.client.common import Object log = logging.getLogger(__name__) @@ -89,7 +89,7 @@ class FitnessDefinition(Object): id : str, optional Unique ID to access the resource, generated internally by the server on creation. fitness_term_definitions - List of :class:`ansys.rep.client.jms.FitnessTermDefinition`. + List of :class:`ansys.hps.client.jms.FitnessTermDefinition`. error_fitness : float The default fitness value assigned to failed design points. diff --git a/ansys/hps/client/jms/resource/job.py b/ansys/hps/client/jms/resource/job.py index 0954f82cc..146af83ee 100644 --- a/ansys/hps/client/jms/resource/job.py +++ b/ansys/hps/client/jms/resource/job.py @@ -1,6 +1,6 @@ # autogenerated code from marshmallow.utils import missing -from ansys.rep.client.common import Object +from ansys.hps.client.common import Object from ..schema.job import JobSchema class Job(Object): diff --git a/ansys/hps/client/jms/resource/job_definition.py b/ansys/hps/client/jms/resource/job_definition.py index 2a5c70940..a8cde29c2 100644 --- a/ansys/hps/client/jms/resource/job_definition.py +++ b/ansys/hps/client/jms/resource/job_definition.py @@ -1,6 +1,6 @@ # autogenerated code from marshmallow.utils import missing -from ansys.rep.client.common import Object +from ansys.hps.client.common import Object from ..schema.job_definition import JobDefinitionSchema class JobDefinition(Object): diff --git a/ansys/hps/client/jms/resource/license_context.py b/ansys/hps/client/jms/resource/license_context.py index 97a8f64d2..15fbeaea0 100644 --- a/ansys/hps/client/jms/resource/license_context.py +++ b/ansys/hps/client/jms/resource/license_context.py @@ -1,6 +1,6 @@ # autogenerated code from marshmallow.utils import missing -from ansys.rep.client.common import Object +from ansys.hps.client.common import Object from ..schema.license_context import LicenseContextSchema class LicenseContext(Object): diff --git a/ansys/hps/client/jms/resource/operation.py b/ansys/hps/client/jms/resource/operation.py index 67536e054..dce0ebec7 100644 --- a/ansys/hps/client/jms/resource/operation.py +++ b/ansys/hps/client/jms/resource/operation.py @@ -1,6 +1,6 @@ # autogenerated code from marshmallow.utils import missing -from ansys.rep.client.common import Object +from ansys.hps.client.common import Object from ..schema.operation import OperationSchema class Operation(Object): diff --git a/ansys/hps/client/jms/resource/parameter_definition.py b/ansys/hps/client/jms/resource/parameter_definition.py index 405f4f80d..fadaec34f 100644 --- a/ansys/hps/client/jms/resource/parameter_definition.py +++ b/ansys/hps/client/jms/resource/parameter_definition.py @@ -1,6 +1,6 @@ # autogenerated code from marshmallow.utils import missing -from ansys.rep.client.common import Object +from ansys.hps.client.common import Object from ..schema.parameter_definition import ParameterDefinitionSchema from ..schema.parameter_definition import FloatParameterDefinitionSchema from ..schema.parameter_definition import IntParameterDefinitionSchema diff --git a/ansys/hps/client/jms/resource/parameter_mapping.py b/ansys/hps/client/jms/resource/parameter_mapping.py index 422ea1e07..9987bf640 100644 --- a/ansys/hps/client/jms/resource/parameter_mapping.py +++ b/ansys/hps/client/jms/resource/parameter_mapping.py @@ -1,6 +1,6 @@ # autogenerated code from marshmallow.utils import missing -from ansys.rep.client.common import Object +from ansys.hps.client.common import Object from ..schema.parameter_mapping import ParameterMappingSchema class ParameterMapping(Object): diff --git a/ansys/hps/client/jms/resource/permission.py b/ansys/hps/client/jms/resource/permission.py index 327eb8285..d8d1a95b0 100644 --- a/ansys/hps/client/jms/resource/permission.py +++ b/ansys/hps/client/jms/resource/permission.py @@ -1,6 +1,6 @@ # autogenerated code from marshmallow.utils import missing -from ansys.rep.client.common import Object +from ansys.hps.client.common import Object from ..schema.permission import PermissionSchema class Permission(Object): diff --git a/ansys/hps/client/jms/resource/project.py b/ansys/hps/client/jms/resource/project.py index d6582531b..dedb9ab6c 100644 --- a/ansys/hps/client/jms/resource/project.py +++ b/ansys/hps/client/jms/resource/project.py @@ -1,6 +1,6 @@ # autogenerated code from marshmallow.utils import missing -from ansys.rep.client.common import Object +from ansys.hps.client.common import Object from ..schema.project import ProjectSchema class Project(Object): diff --git a/ansys/hps/client/jms/resource/selection.py b/ansys/hps/client/jms/resource/selection.py index 00095ceca..052c83c07 100644 --- a/ansys/hps/client/jms/resource/selection.py +++ b/ansys/hps/client/jms/resource/selection.py @@ -1,6 +1,6 @@ # autogenerated code from marshmallow.utils import missing -from ansys.rep.client.common import Object +from ansys.hps.client.common import Object from ..schema.selection import JobSelectionSchema class JobSelection(Object): diff --git a/ansys/hps/client/jms/resource/task.py b/ansys/hps/client/jms/resource/task.py index fe3660091..18a9fddde 100644 --- a/ansys/hps/client/jms/resource/task.py +++ b/ansys/hps/client/jms/resource/task.py @@ -1,6 +1,6 @@ # autogenerated code from marshmallow.utils import missing -from ansys.rep.client.common import Object +from ansys.hps.client.common import Object from ..schema.task import TaskSchema class Task(Object): diff --git a/ansys/hps/client/jms/resource/task_definition.py b/ansys/hps/client/jms/resource/task_definition.py index 3a48e202e..d484a974e 100644 --- a/ansys/hps/client/jms/resource/task_definition.py +++ b/ansys/hps/client/jms/resource/task_definition.py @@ -1,6 +1,6 @@ # autogenerated code from marshmallow.utils import missing -from ansys.rep.client.common import Object +from ansys.hps.client.common import Object from ..schema.task_definition import HpcResourcesSchema from ..schema.task_definition import ResourceRequirementsSchema from ..schema.task_definition import SoftwareSchema diff --git a/ansys/hps/client/jms/resource/task_definition_template.py b/ansys/hps/client/jms/resource/task_definition_template.py index b4dc8f321..4475815b6 100644 --- a/ansys/hps/client/jms/resource/task_definition_template.py +++ b/ansys/hps/client/jms/resource/task_definition_template.py @@ -1,6 +1,6 @@ # autogenerated code from marshmallow.utils import missing -from ansys.rep.client.common import Object +from ansys.hps.client.common import Object from ..schema.task_definition_template import TemplatePropertySchema from ..schema.task_definition_template import TemplateResourceRequirementsSchema from ..schema.task_definition_template import TemplateInputFileSchema diff --git a/ansys/hps/client/jms/schema/algorithm.py b/ansys/hps/client/jms/schema/algorithm.py index dbe78952d..bf23e6740 100644 --- a/ansys/hps/client/jms/schema/algorithm.py +++ b/ansys/hps/client/jms/schema/algorithm.py @@ -6,9 +6,10 @@ # Author(s): O.Koenig # ---------------------------------------------------------- -from ansys.rep.client.common import ObjectSchemaWithModificationInfo from marshmallow import fields +from ansys.hps.client.common import ObjectSchemaWithModificationInfo + from .object_reference import IdReferenceList diff --git a/ansys/hps/client/jms/schema/evaluator.py b/ansys/hps/client/jms/schema/evaluator.py index 905473d8a..0c7b94776 100644 --- a/ansys/hps/client/jms/schema/evaluator.py +++ b/ansys/hps/client/jms/schema/evaluator.py @@ -6,11 +6,12 @@ # Author(s): F.Negri # ---------------------------------------------------------- -from ansys.rep.client.common import ObjectSchema, RestrictedValue import marshmallow from marshmallow import fields from marshmallow.validate import OneOf +from ansys.hps.client.common import ObjectSchema, RestrictedValue + project_assignment_modes = ["disabled", "all_active", "project_list"] diff --git a/ansys/hps/client/jms/schema/file.py b/ansys/hps/client/jms/schema/file.py index 1b07db3ee..61c3856a4 100644 --- a/ansys/hps/client/jms/schema/file.py +++ b/ansys/hps/client/jms/schema/file.py @@ -6,9 +6,10 @@ # Author(s): O.Koenig # ---------------------------------------------------------- -from ansys.rep.client.common import ObjectSchemaWithModificationInfo from marshmallow import fields +from ansys.hps.client.common import ObjectSchemaWithModificationInfo + from .object_reference import IdReference diff --git a/ansys/hps/client/jms/schema/fitness_definition.py b/ansys/hps/client/jms/schema/fitness_definition.py index 3e871b332..f634fa945 100644 --- a/ansys/hps/client/jms/schema/fitness_definition.py +++ b/ansys/hps/client/jms/schema/fitness_definition.py @@ -6,10 +6,11 @@ # Author(s): O.Koenig # ---------------------------------------------------------- -from ansys.rep.client.common import ObjectSchema from marshmallow import fields from marshmallow.validate import OneOf +from ansys.hps.client.common import ObjectSchema + fitness_term_types = ["design_objective", "limit_constraint", "target_constraint"] diff --git a/ansys/hps/client/jms/schema/job.py b/ansys/hps/client/jms/schema/job.py index 1726d43f7..ad646449c 100644 --- a/ansys/hps/client/jms/schema/job.py +++ b/ansys/hps/client/jms/schema/job.py @@ -6,10 +6,11 @@ # Author(s): O.Koenig # ---------------------------------------------------------- -from ansys.rep.client.common import ObjectSchemaWithModificationInfo from marshmallow import fields from marshmallow.validate import OneOf +from ansys.hps.client.common import ObjectSchemaWithModificationInfo + from .object_reference import IdReference, IdReferenceList valid_eval_status = [ diff --git a/ansys/hps/client/jms/schema/job_definition.py b/ansys/hps/client/jms/schema/job_definition.py index e7f19332d..14e8dbe1e 100644 --- a/ansys/hps/client/jms/schema/job_definition.py +++ b/ansys/hps/client/jms/schema/job_definition.py @@ -7,9 +7,10 @@ # ---------------------------------------------------------- import logging -from ansys.rep.client.common import ObjectSchemaWithModificationInfo from marshmallow import fields +from ansys.hps.client.common import ObjectSchemaWithModificationInfo + from .fitness_definition import FitnessDefinitionSchema from .object_reference import IdReferenceList diff --git a/ansys/hps/client/jms/schema/license_context.py b/ansys/hps/client/jms/schema/license_context.py index c66465039..4f73e014b 100644 --- a/ansys/hps/client/jms/schema/license_context.py +++ b/ansys/hps/client/jms/schema/license_context.py @@ -6,9 +6,10 @@ # Author(s): O.Koenig # ---------------------------------------------------------- -from ansys.rep.client.common import BaseSchema from marshmallow import fields +from ansys.hps.client.common import BaseSchema + class LicenseContextSchema(BaseSchema): class Meta(BaseSchema.Meta): diff --git a/ansys/hps/client/jms/schema/operation.py b/ansys/hps/client/jms/schema/operation.py index 2eb7f10e5..7b2e37c88 100644 --- a/ansys/hps/client/jms/schema/operation.py +++ b/ansys/hps/client/jms/schema/operation.py @@ -1,6 +1,7 @@ -from ansys.rep.client.common import ObjectSchema from marshmallow import fields +from ansys.hps.client.common import ObjectSchema + class OperationSchema(ObjectSchema): class Meta(ObjectSchema.Meta): diff --git a/ansys/hps/client/jms/schema/parameter_definition.py b/ansys/hps/client/jms/schema/parameter_definition.py index aa5b99232..d9f660ef0 100644 --- a/ansys/hps/client/jms/schema/parameter_definition.py +++ b/ansys/hps/client/jms/schema/parameter_definition.py @@ -7,10 +7,11 @@ # ---------------------------------------------------------- import logging -from ansys.rep.client.common import ObjectSchemaWithModificationInfo from marshmallow import fields from marshmallow_oneofschema import OneOfSchema +from ansys.hps.client.common import ObjectSchemaWithModificationInfo + log = logging.getLogger(__name__) diff --git a/ansys/hps/client/jms/schema/parameter_mapping.py b/ansys/hps/client/jms/schema/parameter_mapping.py index d3da92a16..243cb6c78 100644 --- a/ansys/hps/client/jms/schema/parameter_mapping.py +++ b/ansys/hps/client/jms/schema/parameter_mapping.py @@ -7,9 +7,10 @@ # ---------------------------------------------------------- import logging -from ansys.rep.client.common import ObjectSchemaWithModificationInfo from marshmallow import fields +from ansys.hps.client.common import ObjectSchemaWithModificationInfo + from .object_reference import IdReference log = logging.getLogger(__name__) diff --git a/ansys/hps/client/jms/schema/permission.py b/ansys/hps/client/jms/schema/permission.py index 8bce9325e..0375e140d 100644 --- a/ansys/hps/client/jms/schema/permission.py +++ b/ansys/hps/client/jms/schema/permission.py @@ -1,6 +1,7 @@ -from ansys.rep.client.common import BaseSchema from marshmallow import fields +from ansys.hps.client.common import BaseSchema + class PermissionSchema(BaseSchema): class Meta(BaseSchema.Meta): diff --git a/ansys/hps/client/jms/schema/project.py b/ansys/hps/client/jms/schema/project.py index ec0436c99..0f575eaab 100644 --- a/ansys/hps/client/jms/schema/project.py +++ b/ansys/hps/client/jms/schema/project.py @@ -6,9 +6,10 @@ # Author(s): O.Koenig # ---------------------------------------------------------- -from ansys.rep.client.common import BaseSchema from marshmallow import fields +from ansys.hps.client.common import BaseSchema + class ProjectSchema(BaseSchema): class Meta(BaseSchema.Meta): diff --git a/ansys/hps/client/jms/schema/selection.py b/ansys/hps/client/jms/schema/selection.py index 47f7a7f69..f84c1205c 100644 --- a/ansys/hps/client/jms/schema/selection.py +++ b/ansys/hps/client/jms/schema/selection.py @@ -6,9 +6,10 @@ # Author(s): O.Koenig # ---------------------------------------------------------- -from ansys.rep.client.common import ObjectSchemaWithModificationInfo from marshmallow import fields +from ansys.hps.client.common import ObjectSchemaWithModificationInfo + from .object_reference import IdReference, IdReferenceList diff --git a/ansys/hps/client/jms/schema/task.py b/ansys/hps/client/jms/schema/task.py index aa8a13b0f..63cb6f15a 100644 --- a/ansys/hps/client/jms/schema/task.py +++ b/ansys/hps/client/jms/schema/task.py @@ -6,9 +6,10 @@ # Author(s): F.Negri # ---------------------------------------------------------- -from ansys.rep.client.common import ObjectSchemaWithModificationInfo from marshmallow import fields +from ansys.hps.client.common import ObjectSchemaWithModificationInfo + from .object_reference import IdReference, IdReferenceList from .task_definition import TaskDefinitionSchema diff --git a/ansys/hps/client/jms/schema/task_definition.py b/ansys/hps/client/jms/schema/task_definition.py index ad044cb28..a312f415d 100644 --- a/ansys/hps/client/jms/schema/task_definition.py +++ b/ansys/hps/client/jms/schema/task_definition.py @@ -6,9 +6,10 @@ # Author(s): O.Koenig # ---------------------------------------------------------- -from ansys.rep.client.common import BaseSchema, ObjectSchemaWithModificationInfo, RestrictedValue from marshmallow import fields +from ansys.hps.client.common import BaseSchema, ObjectSchemaWithModificationInfo, RestrictedValue + from .object_reference import IdReference, IdReferenceList diff --git a/ansys/hps/client/jms/schema/task_definition_template.py b/ansys/hps/client/jms/schema/task_definition_template.py index 0d4501dfe..0c9be3144 100644 --- a/ansys/hps/client/jms/schema/task_definition_template.py +++ b/ansys/hps/client/jms/schema/task_definition_template.py @@ -6,9 +6,10 @@ # Author(s): F. Negri # ---------------------------------------------------------- -from ansys.rep.client.common import BaseSchema, ObjectSchema from marshmallow import fields, validate +from ansys.hps.client.common import BaseSchema, ObjectSchema + from .task_definition import HpcResourcesSchema, SoftwareSchema diff --git a/ansys/hps/client/rms/api/base.py b/ansys/hps/client/rms/api/base.py index a4b8ce4ea..a51fcdfe3 100644 --- a/ansys/hps/client/rms/api/base.py +++ b/ansys/hps/client/rms/api/base.py @@ -2,12 +2,13 @@ import logging from typing import List, Type -from ansys.rep.client.exceptions import ClientError from pydantic import BaseModel from pydantic import __version__ as pydantic_version from pydantic import create_model from requests import Session +from ansys.hps.client.exceptions import ClientError + from ..models import ( Cluster, ComputeResourceSet, diff --git a/ansys/hps/client/rms/api/rms_api.py b/ansys/hps/client/rms/api/rms_api.py index 103ed16e9..c62aaba98 100644 --- a/ansys/hps/client/rms/api/rms_api.py +++ b/ansys/hps/client/rms/api/rms_api.py @@ -1,8 +1,8 @@ import logging from typing import List -from ansys.rep.client.client import Client -from ansys.rep.client.rms.models import ( +from ansys.hps.client.client import Client +from ansys.hps.client.rms.models import ( Cluster, ComputeResourceSet, EvaluatorConfiguration, @@ -78,8 +78,8 @@ def update_evaluator_configuration( on a Linux evaluator that was active in the past 60 seconds. >>> import datetime - >>> from ansys.rep.client import Client - >>> from ansys.rep.client.jms import RmsApi, EvaluatorConfigurationUpdate + >>> from ansys.hps.client import Client + >>> from ansys.hps.client.jms import RmsApi, EvaluatorConfigurationUpdate >>> cl = Client( ... rep_url="https://localhost:8443/rep", username="repuser", password="repuser" ... ) diff --git a/doc/source/api/auth.rst b/doc/source/api/auth.rst index ac06ee3d8..eeaeda59d 100644 --- a/doc/source/api/auth.rst +++ b/doc/source/api/auth.rst @@ -6,20 +6,20 @@ Authentication Service The REP Authentication Service processes all REP sign ins following OAuth 2.0 resource owner password credentials flow. When you enter your REP credentials, you get an access token (expiring after 24 hours) and a refresh token for authenticating all services. -The ``ansys.rep.client.auth`` subpackage wraps around the Authentication Service REST API available at ``https://hostname:port/rep/auth/api``. +The ``ansys.hps.client.auth`` subpackage wraps around the Authentication Service REST API available at ``https://hostname:port/rep/auth/api``. Authentication function ------------------------------------------ -.. autofunction:: ansys.rep.client.auth.authenticate +.. autofunction:: ansys.hps.client.auth.authenticate Auth API ------------------------------------------ -.. autoclass:: ansys.rep.client.auth.AuthApi +.. autoclass:: ansys.hps.client.auth.AuthApi :members: User -------------------------------------- -.. autoclass:: ansys.rep.client.auth.User +.. autoclass:: ansys.hps.client.auth.User :members: \ No newline at end of file diff --git a/doc/source/api/client.rst b/doc/source/api/client.rst index d3bd3ccaf..5db948005 100644 --- a/doc/source/api/client.rst +++ b/doc/source/api/client.rst @@ -4,11 +4,11 @@ Client Connection module ------------------------------------------ -.. automodule:: ansys.rep.client.connection +.. automodule:: ansys.hps.client.connection :members: Client object ------------------------------------ -.. autoclass:: ansys.rep.client.Client +.. autoclass:: ansys.hps.client.Client :members: \ No newline at end of file diff --git a/doc/source/api/exceptions.rst b/doc/source/api/exceptions.rst index 7d1920fc4..1e7bcbc45 100644 --- a/doc/source/api/exceptions.rst +++ b/doc/source/api/exceptions.rst @@ -3,13 +3,13 @@ Exceptions HTTP requests returning an unsuccessful status code will raise: -* :exc:`ansys.rep.client.ClientError` for client errors (4xx status code, e.g. bad syntax or not found) -* :exc:`ansys.rep.client.APIError` for server errors (5xx status code, e.g. internal server error or not implemented) +* :exc:`ansys.hps.client.ClientError` for client errors (4xx status code, e.g. bad syntax or not found) +* :exc:`ansys.hps.client.APIError` for server errors (5xx status code, e.g. internal server error or not implemented) -All exceptions that the Ansys REP clients explicitly raise inherit from :exc:`ansys.rep.client.REPError`. +All exceptions that the Ansys REP clients explicitly raise inherit from :exc:`ansys.hps.client.REPError`. -.. autoexception:: ansys.rep.client.REPError +.. autoexception:: ansys.hps.client.REPError :members: -.. autoexception:: ansys.rep.client.APIError -.. autoexception:: ansys.rep.client.ClientError \ No newline at end of file +.. autoexception:: ansys.hps.client.APIError +.. autoexception:: ansys.hps.client.ClientError \ No newline at end of file diff --git a/doc/source/api/jms.rst b/doc/source/api/jms.rst index 9f2c27ec1..44f091288 100644 --- a/doc/source/api/jms.rst +++ b/doc/source/api/jms.rst @@ -3,20 +3,20 @@ Job Management Service Ansys REP includes Job Management Service (JMS), which is the main service for storing and evaluating jobs using multiple heterogeneous compute resources. -The Python subpackage ``ansys.rep.client.jms`` wraps around the JMS service REST API available at ``https://hostname:port/rep/jms/api``. +The Python subpackage ``ansys.hps.client.jms`` wraps around the JMS service REST API available at ``https://hostname:port/rep/jms/api``. APIs -------------------------------------- JMS Api ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. autoclass:: ansys.rep.client.jms.JmsApi +.. autoclass:: ansys.hps.client.jms.JmsApi :members: :undoc-members: Project Api ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. autoclass:: ansys.rep.client.jms.ProjectApi +.. autoclass:: ansys.hps.client.jms.ProjectApi :members: :undoc-members: @@ -27,13 +27,13 @@ Resources File ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. autoclass:: ansys.rep.client.jms.File +.. autoclass:: ansys.hps.client.jms.File :members: Project ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. autoclass:: ansys.rep.client.jms.Project +.. autoclass:: ansys.hps.client.jms.Project :members: :undoc-members: :exclude-members: Meta @@ -41,54 +41,54 @@ Project Fitness Definition ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. autoclass:: ansys.rep.client.jms.FitnessTermDefinition +.. autoclass:: ansys.hps.client.jms.FitnessTermDefinition :members: -.. autoclass:: ansys.rep.client.jms.FitnessDefinition +.. autoclass:: ansys.hps.client.jms.FitnessDefinition :members: Parameters ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. autoclass:: ansys.rep.client.jms.FloatParameterDefinition +.. autoclass:: ansys.hps.client.jms.FloatParameterDefinition :members: -.. autoclass:: ansys.rep.client.jms.BoolParameterDefinition +.. autoclass:: ansys.hps.client.jms.BoolParameterDefinition :members: -.. autoclass:: ansys.rep.client.jms.IntParameterDefinition +.. autoclass:: ansys.hps.client.jms.IntParameterDefinition :members: -.. autoclass:: ansys.rep.client.jms.StringParameterDefinition +.. autoclass:: ansys.hps.client.jms.StringParameterDefinition :members: -.. autoclass:: ansys.rep.client.jms.ParameterMapping +.. autoclass:: ansys.hps.client.jms.ParameterMapping :members: Task Definition ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. autoclass:: ansys.rep.client.jms.Software +.. autoclass:: ansys.hps.client.jms.Software :members: -.. autoclass:: ansys.rep.client.jms.ResourceRequirements +.. autoclass:: ansys.hps.client.jms.ResourceRequirements :members: -.. autoclass:: ansys.rep.client.jms.SuccessCriteria +.. autoclass:: ansys.hps.client.jms.SuccessCriteria :members: -.. autoclass:: ansys.rep.client.jms.Licensing +.. autoclass:: ansys.hps.client.jms.Licensing :members: -.. autoclass:: ansys.rep.client.jms.TaskDefinition +.. autoclass:: ansys.hps.client.jms.TaskDefinition :members: Job Definition ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. autoclass:: ansys.rep.client.jms.JobDefinition +.. autoclass:: ansys.hps.client.jms.JobDefinition :members: :undoc-members: :exclude-members: Meta @@ -96,58 +96,58 @@ Job Definition Task ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. autoclass:: ansys.rep.client.jms.Task +.. autoclass:: ansys.hps.client.jms.Task :members: Job ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. autoclass:: ansys.rep.client.jms.Job +.. autoclass:: ansys.hps.client.jms.Job :members: Job Selection ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. autoclass:: ansys.rep.client.jms.JobSelection +.. autoclass:: ansys.hps.client.jms.JobSelection :members: Design Exploration Algorithm ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. autoclass:: ansys.rep.client.jms.Algorithm +.. autoclass:: ansys.hps.client.jms.Algorithm :members: Evaluator ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. autoclass:: ansys.rep.client.jms.Evaluator +.. autoclass:: ansys.hps.client.jms.Evaluator :members: Task Definition Template ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. autoclass:: ansys.rep.client.jms.TemplateProperty +.. autoclass:: ansys.hps.client.jms.TemplateProperty :members: -.. autoclass:: ansys.rep.client.jms.TemplateResourceRequirements +.. autoclass:: ansys.hps.client.jms.TemplateResourceRequirements :members: -.. autoclass:: ansys.rep.client.jms.TemplateInputFile +.. autoclass:: ansys.hps.client.jms.TemplateInputFile :members: -.. autoclass:: ansys.rep.client.jms.TemplateOutputFile +.. autoclass:: ansys.hps.client.jms.TemplateOutputFile :members: -.. autoclass:: ansys.rep.client.jms.TaskDefinitionTemplate +.. autoclass:: ansys.hps.client.jms.TaskDefinitionTemplate :members: Permissions ^^^^^^^^^^^ -.. autoclass:: ansys.rep.client.jms.Permission +.. autoclass:: ansys.hps.client.jms.Permission :members: \ No newline at end of file diff --git a/doc/source/api/rms.rst b/doc/source/api/rms.rst index f8582036c..c8f49defb 100644 --- a/doc/source/api/rms.rst +++ b/doc/source/api/rms.rst @@ -3,14 +3,14 @@ Resource Management Service Ansys REP includes the Resource Management Service (JMS), which is the main service for managing heterogeneous compute resources. -The Python subpackage ``ansys.rep.client.rms`` wraps around the RMS service REST API available at ``https://hostname:port/rep/rms/api``. +The Python subpackage ``ansys.hps.client.rms`` wraps around the RMS service REST API available at ``https://hostname:port/rep/rms/api``. APIs -------------------------------------- RMS Api ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. autoclass:: ansys.rep.client.rms.RmsApi +.. autoclass:: ansys.hps.client.rms.RmsApi :members: :undoc-members: @@ -21,24 +21,24 @@ Resources Evaluator Registration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. autopydantic_model:: ansys.rep.client.rms.EvaluatorRegistration +.. autopydantic_model:: ansys.hps.client.rms.EvaluatorRegistration Evaluator Configuration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. autopydantic_model:: ansys.rep.client.rms.EvaluatorConfiguration +.. autopydantic_model:: ansys.hps.client.rms.EvaluatorConfiguration Evaluator Configuration Update ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. autopydantic_model:: ansys.rep.client.rms.EvaluatorConfigurationUpdate +.. autopydantic_model:: ansys.hps.client.rms.EvaluatorConfigurationUpdate Scaler Configuration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. autopydantic_model:: ansys.rep.client.rms.ScalerRegistration +.. autopydantic_model:: ansys.hps.client.rms.ScalerRegistration Compute Resource Set ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. autopydantic_model:: ansys.rep.client.rms.ComputeResourceSet +.. autopydantic_model:: ansys.hps.client.rms.ComputeResourceSet diff --git a/doc/source/conf.py b/doc/source/conf.py index 6b56c9ac0..f9fbc1331 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -6,7 +6,7 @@ from ansys_sphinx_theme import get_version_match from ansys_sphinx_theme import pyansys_logo_black as logo -from ansys.rep.client import __ansys_apps_version__, __company__, __version__, __version_no_dots__ +from ansys.hps.client import __ansys_apps_version__, __company__, __version__, __version_no_dots__ sys.path.append(os.path.abspath(os.path.dirname(__file__))) diff --git a/doc/source/quickstart.rst b/doc/source/quickstart.rst index 117aff3e2..9008aa381 100644 --- a/doc/source/quickstart.rst +++ b/doc/source/quickstart.rst @@ -19,8 +19,8 @@ Let's start by connecting to a REP server running on the localhost with default .. code-block:: python - from ansys.rep.client import Client - from ansys.rep.client.jms import JmsApi, ProjectApi + from ansys.hps.client import Client + from ansys.hps.client.jms import JmsApi, ProjectApi client = Client(rep_url="https://localhost:8443/rep", username="repuser", password="repuser") @@ -283,8 +283,8 @@ Admin users with the Keycloak "manage-users" role can create new users as well a .. code-block:: python - from ansys.rep.client import Client - from ansys.rep.client.auth import AuthApi, User + from ansys.hps.client import Client + from ansys.hps.client.auth import AuthApi, User client = Client(rep_url="https://localhost:8443/rep/", username="repadmin", password="repadmin") auth_api = AuthApi(client) @@ -311,14 +311,14 @@ Admin users with the Keycloak "manage-users" role can create new users as well a Exception handling ------------------------------------------ -All exceptions that the Ansys REP client explicitly raise inherit from :exc:`ansys.rep.client.REPError`. +All exceptions that the Ansys REP client explicitly raise inherit from :exc:`ansys.hps.client.REPError`. Client Errors are raised for 4xx HTTP status codes, while API Errors are raised for 5xx HTTP status codes (server side errors). For example, instantiating a client with invalid credentials will return a 401 Client Error. .. code-block:: python - from ansys.rep.client import Client, REPError + from ansys.hps.client import Client, REPError try: client = Client(rep_url="https://localhost:8443/rep/", username="repuser", password="wrong_psw") @@ -333,7 +333,7 @@ A *get* call on a non-existing resource will return a 404 Client Error. .. code-block:: python - from ansys.rep.client.jms import JmsApi + from ansys.hps.client.jms import JmsApi jms_api = JmsApi(client) try: diff --git a/examples/add_num_cores_to_wb_project.py b/examples/add_num_cores_to_wb_project.py index a0e864267..97d2526c3 100644 --- a/examples/add_num_cores_to_wb_project.py +++ b/examples/add_num_cores_to_wb_project.py @@ -13,8 +13,8 @@ import logging -from ansys.rep.client import REPError -from ansys.rep.client.jms import Client +from ansys.hps.client import REPError +from ansys.hps.client.jms import Client log = logging.getLogger(__name__) diff --git a/examples/cfx_static_mixer/project_setup.py b/examples/cfx_static_mixer/project_setup.py index 65c8de903..ace8c6a3d 100644 --- a/examples/cfx_static_mixer/project_setup.py +++ b/examples/cfx_static_mixer/project_setup.py @@ -5,8 +5,8 @@ import logging import os -from ansys.rep.client import Client, REPError, __ansys_apps_version__ -from ansys.rep.client.jms import ( +from ansys.hps.client import Client, REPError, __ansys_apps_version__ +from ansys.hps.client.jms import ( File, JmsApi, Job, diff --git a/examples/fluent_2d_heat_exchanger/project_setup.py b/examples/fluent_2d_heat_exchanger/project_setup.py index 06d9b8a6e..974808884 100644 --- a/examples/fluent_2d_heat_exchanger/project_setup.py +++ b/examples/fluent_2d_heat_exchanger/project_setup.py @@ -6,8 +6,8 @@ import logging import os -from ansys.rep.client import Client, REPError, __ansys_apps_version__ -from ansys.rep.client.jms import ( +from ansys.hps.client import Client, REPError, __ansys_apps_version__ +from ansys.hps.client.jms import ( File, JmsApi, Job, diff --git a/examples/fluent_nozzle/project_setup.py b/examples/fluent_nozzle/project_setup.py index 9f958aafe..c191b95b1 100644 --- a/examples/fluent_nozzle/project_setup.py +++ b/examples/fluent_nozzle/project_setup.py @@ -5,8 +5,8 @@ import logging import os -from ansys.rep.client import Client, REPError, __ansys_apps_version__ -from ansys.rep.client.jms import ( +from ansys.hps.client import Client, REPError, __ansys_apps_version__ +from ansys.hps.client.jms import ( File, JmsApi, Job, diff --git a/examples/lsdyna_cylinder_plate/lsdyna_job.py b/examples/lsdyna_cylinder_plate/lsdyna_job.py index 9735801f8..2380133ed 100644 --- a/examples/lsdyna_cylinder_plate/lsdyna_job.py +++ b/examples/lsdyna_cylinder_plate/lsdyna_job.py @@ -23,8 +23,8 @@ import os import time -from ansys.rep.client import Client, REPError -from ansys.rep.client.jms import ( +from ansys.hps.client import Client, REPError +from ansys.hps.client.jms import ( File, JmsApi, Job, @@ -69,9 +69,8 @@ def __init__( self.task_ids = task_ids def __str__(self): - return ( - f"REP Job:\n {json.dumps(self, default=lambda x: x.__dict__, sort_keys=True, indent=4)}" - ) + repr = json.dumps(self, default=lambda x: x.__dict__, sort_keys=True, indent=4) + return f"REP Job:\n{repr}" # noqa: E231 def save(self): """Save job info to JSON file""" @@ -355,7 +354,7 @@ def download_results(app_job: REPJob): continue else: log.warning( - f"{file.evaluation_path} already exists:" + f"{file.evaluation_path} already exists: " f"size on server: {humanize.naturalsize(file.size)}, " f"size on disk {humanize.naturalsize(os.path.getsize(download_path))} MB" ) diff --git a/examples/mapdl_linked_analyses/project_setup.py b/examples/mapdl_linked_analyses/project_setup.py index 58281b3d1..22f395bb1 100644 --- a/examples/mapdl_linked_analyses/project_setup.py +++ b/examples/mapdl_linked_analyses/project_setup.py @@ -24,8 +24,8 @@ import os from typing import List, Tuple -from ansys.rep.client import Client, REPError, __ansys_apps_version__ -from ansys.rep.client.jms import ( +from ansys.hps.client import Client, REPError, __ansys_apps_version__ +from ansys.hps.client.jms import ( File, JmsApi, Job, diff --git a/examples/mapdl_motorbike_frame/motorbike_frame.ipynb b/examples/mapdl_motorbike_frame/motorbike_frame.ipynb index 9ab08c8c2..2706e6b37 100644 --- a/examples/mapdl_motorbike_frame/motorbike_frame.ipynb +++ b/examples/mapdl_motorbike_frame/motorbike_frame.ipynb @@ -32,7 +32,7 @@ "import time\n", "import logging\n", "\n", - "from ansys.rep.client.jms import (Client, JobDefinition, Job, File,\n", + "from ansys.hps.client.jms import (Client, JobDefinition, Job, File,\n", " FitnessDefinition, Project, SuccessCriteria, Licensing)" ] }, diff --git a/examples/mapdl_motorbike_frame/project_query.py b/examples/mapdl_motorbike_frame/project_query.py index 8d96d6c5e..1c8f5ccf6 100644 --- a/examples/mapdl_motorbike_frame/project_query.py +++ b/examples/mapdl_motorbike_frame/project_query.py @@ -10,8 +10,8 @@ import os from statistics import mean, stdev -from ansys.rep.client import Client, REPError -from ansys.rep.client.jms import JmsApi, ProjectApi +from ansys.hps.client import Client, REPError +from ansys.hps.client.jms import JmsApi, ProjectApi log = logging.getLogger(__name__) @@ -21,7 +21,7 @@ def print_value_stats(values, title): log.info(f"{title}") # log.info(f"Num : {len(values)}") log.info(f"Mean : {mean(values)} Stdev: {stdev(values)}") - log.info(f"(Min,Max): ({min(values)}, {max(values)})") + log.info(f"(Min, Max): ({min(values)}, {max(values)})") def query_stats(client, project_name): diff --git a/examples/mapdl_motorbike_frame/project_setup.py b/examples/mapdl_motorbike_frame/project_setup.py index 8075beecf..de2c4f825 100644 --- a/examples/mapdl_motorbike_frame/project_setup.py +++ b/examples/mapdl_motorbike_frame/project_setup.py @@ -9,8 +9,8 @@ import os import random -from ansys.rep.client import Client, REPError, __ansys_apps_version__ -from ansys.rep.client.jms import ( +from ansys.hps.client import Client, REPError, __ansys_apps_version__ +from ansys.hps.client.jms import ( File, FitnessDefinition, FloatParameterDefinition, diff --git a/examples/mapdl_motorbike_frame/task_files.py b/examples/mapdl_motorbike_frame/task_files.py index 885055a5f..c53f2f66e 100644 --- a/examples/mapdl_motorbike_frame/task_files.py +++ b/examples/mapdl_motorbike_frame/task_files.py @@ -3,8 +3,8 @@ import logging import os -from ansys.rep.client import REPError -from ansys.rep.client.jms import Client, File +from ansys.hps.client import REPError +from ansys.hps.client.jms import Client, File log = logging.getLogger(__name__) diff --git a/examples/mapdl_tyre_performance/project_setup.py b/examples/mapdl_tyre_performance/project_setup.py index a5343ccb1..6875f207c 100644 --- a/examples/mapdl_tyre_performance/project_setup.py +++ b/examples/mapdl_tyre_performance/project_setup.py @@ -10,8 +10,8 @@ import os import random -from ansys.rep.client import Client, REPError, __ansys_apps_version__ -from ansys.rep.client.jms import ( +from ansys.hps.client import Client, REPError, __ansys_apps_version__ +from ansys.hps.client.jms import ( File, FloatParameterDefinition, JmsApi, diff --git a/examples/python_linked_multi_process_step/project_setup.py b/examples/python_linked_multi_process_step/project_setup.py index ecf152b61..c5cfacb52 100644 --- a/examples/python_linked_multi_process_step/project_setup.py +++ b/examples/python_linked_multi_process_step/project_setup.py @@ -8,8 +8,8 @@ import os import random -from ansys.rep.client import Client, REPError -from ansys.rep.client.jms import ( +from ansys.hps.client import Client, REPError +from ansys.hps.client.jms import ( File, FloatParameterDefinition, JmsApi, @@ -117,10 +117,10 @@ def main(client, num_task_definitions, num_jobs, start, inactive): input_file_ids = [file_ids[f"td{i}_pyscript"]] if i == 0: input_file_ids.append(file_ids["input"]) - cmd = f"%executable% %file:td{i}_pyscript% %file:input% {i}" + cmd = f"%executable% %file:td{i}_pyscript% %file:input% {i}" # noqa: E231 else: input_file_ids.append(file_ids[f"td{i-1}_result"]) - cmd = f"%executable% %file:td{i}_pyscript% %file:td{i-1}_result% {i}" + cmd = f"%executable% %file:td{i}_pyscript% %file:td{i-1}_result% {i}" # noqa: E231 output_file_ids = [file_ids[f"td{i}_result"]] diff --git a/examples/python_multi_process_step/project_setup.py b/examples/python_multi_process_step/project_setup.py index 4a9db69d2..0f9833a22 100644 --- a/examples/python_multi_process_step/project_setup.py +++ b/examples/python_multi_process_step/project_setup.py @@ -27,8 +27,8 @@ from task_files import update_task_files -from ansys.rep.client import Client, REPError -from ansys.rep.client.jms import ( +from ansys.hps.client import Client, REPError +from ansys.hps.client.jms import ( File, IntParameterDefinition, JmsApi, @@ -201,7 +201,7 @@ def main( if f"td{i}_results_jpg" in file_ids.keys(): output_file_ids.append(file_ids[f"td{i}_results_jpg"]) - cmd = f"%executable% %file:td{i}_pyscript% %file:td{i}_input% {i}" + cmd = f"%executable% %file:td{i}_pyscript% %file:td{i}_input% {i}" # noqa: E231 if images: cmd += " --images" task_defs.append( diff --git a/examples/python_multi_process_step/task_files.py b/examples/python_multi_process_step/task_files.py index 1b1b25f50..e16db0db0 100644 --- a/examples/python_multi_process_step/task_files.py +++ b/examples/python_multi_process_step/task_files.py @@ -17,7 +17,7 @@ import os from tempfile import NamedTemporaryFile -from ansys.rep.client.jms import File +from ansys.hps.client.jms import File log = logging.getLogger(__name__) diff --git a/examples/python_two_bar_truss_problem/project_setup.py b/examples/python_two_bar_truss_problem/project_setup.py index dcd937009..5ec77be0c 100644 --- a/examples/python_two_bar_truss_problem/project_setup.py +++ b/examples/python_two_bar_truss_problem/project_setup.py @@ -7,8 +7,8 @@ import os import random -from ansys.rep.client import Client, REPError -from ansys.rep.client.jms import ( +from ansys.hps.client import Client, REPError +from ansys.hps.client.jms import ( File, FitnessDefinition, FloatParameterDefinition, diff --git a/examples/python_two_bar_truss_problem/python_two_bar_truss.ipynb b/examples/python_two_bar_truss_problem/python_two_bar_truss.ipynb index 00d4194ec..4739c1e56 100644 --- a/examples/python_two_bar_truss_problem/python_two_bar_truss.ipynb +++ b/examples/python_two_bar_truss_problem/python_two_bar_truss.ipynb @@ -23,8 +23,8 @@ "import sys\n", "import time\n", "\n", - "from ansys.rep.client import REPError\n", - "from ansys.rep.client.jms import (Client, JobDefinition, Job, File,\n", + "from ansys.hps.client import REPError\n", + "from ansys.hps.client.jms import (Client, JobDefinition, Job, File,\n", " FitnessDefinition, Project)" ] }, diff --git a/generate_resources.py b/generate_resources.py index 5140ba4d3..33b054c70 100644 --- a/generate_resources.py +++ b/generate_resources.py @@ -9,8 +9,8 @@ import marshmallow -from ansys.rep.client.common.restricted_value import RestrictedValue -from ansys.rep.client.jms.schema.object_reference import IdReference, IdReferenceList +from ansys.hps.client.common.restricted_value import RestrictedValue +from ansys.hps.client.jms.schema.object_reference import IdReference, IdReferenceList # we define here which resources to auto-generate # some are excluded or done only partially (e.g. File) @@ -372,7 +372,7 @@ def get_resource_imports(resource, base_class): imports = [ "from marshmallow.utils import missing", - "from ansys.rep.client.common import Object", + "from ansys.hps.client.common import Object", # f"from {base_class['path']}.{base_class['filename']} import {base_class['name']}", f"from ..schema.{resource['schema_filename']} import {resource['schema']}", ] @@ -416,7 +416,7 @@ def __init__(self, return code -def process_resources(subpackage, resources, base_class_path="ansys.rep.client"): +def process_resources(subpackage, resources, base_class_path="ansys.hps.client"): target_folder = os.path.join("ansys", "rep", "client", subpackage, "resource") resources_code = {} @@ -425,7 +425,7 @@ def process_resources(subpackage, resources, base_class_path="ansys.rep.client") # dynamically load resource schema module = importlib.import_module( - f"ansys.rep.client.{subpackage}.schema.{resource['schema_filename']}" + f"ansys.hps.client.{subpackage}.schema.{resource['schema_filename']}" ) resource_class = getattr(module, resource["schema"]) @@ -443,7 +443,7 @@ def process_resources(subpackage, resources, base_class_path="ansys.rep.client") base_class = {"name": "Object", "filename": "common", "path": base_class_path} if resource.get("base_class", None): base_class["name"] = resource["base_class"] - base_class["path"] = "ansys.rep.client.jms.resource" + base_class["path"] = "ansys.hps.client.jms.resource" base_class["filename"] = next( (r["resource_filename"] for r in resources if r["class"] == resource["base_class"]), None, diff --git a/prepare_documentation.py b/prepare_documentation.py index 75b87150c..b2d709bc7 100644 --- a/prepare_documentation.py +++ b/prepare_documentation.py @@ -13,9 +13,9 @@ from apispec import APISpec from apispec.ext.marshmallow import MarshmallowPlugin -from ansys.rep.client import __version__ -from ansys.rep.client.auth.resource import User -from ansys.rep.client.jms.resource import ( +from ansys.hps.client import __version__ +from ansys.hps.client.auth.resource import User +from ansys.hps.client.jms.resource import ( Algorithm, BoolParameterDefinition, Evaluator, @@ -41,7 +41,7 @@ TaskDefinition, TaskDefinitionTemplate, ) -from ansys.rep.client.jms.schema.object_reference import IdReference, IdReferenceList +from ansys.hps.client.jms.schema.object_reference import IdReference, IdReferenceList def custom_field_attributes(self, field, **kwargs): diff --git a/pyproject.toml b/pyproject.toml index d9f106166..8ff20f05b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,5 +29,5 @@ markers = [ filterwarnings = [ "ignore::urllib3.exceptions.InsecureRequestWarning", "ignore::DeprecationWarning:pkg_resources.*", - "ignore::ansys.rep.client.UnverifiedHTTPSRequestsWarning", + "ignore::ansys.hps.client.UnverifiedHTTPSRequestsWarning", ] \ No newline at end of file diff --git a/tests/auth/test_api.py b/tests/auth/test_api.py index 722845ed8..d1be28c28 100644 --- a/tests/auth/test_api.py +++ b/tests/auth/test_api.py @@ -11,8 +11,8 @@ from keycloak import KeycloakOpenID from keycloak.exceptions import KeycloakError -from ansys.rep.client import Client, REPError -from ansys.rep.client.auth import AuthApi, User, authenticate +from ansys.hps.client import Client, REPError +from ansys.hps.client.auth import AuthApi, User, authenticate from tests.rep_test import REPTestCase log = logging.getLogger(__name__) diff --git a/tests/auth/test_authenticate.py b/tests/auth/test_authenticate.py index caa46c69b..b29dfdf29 100644 --- a/tests/auth/test_authenticate.py +++ b/tests/auth/test_authenticate.py @@ -9,7 +9,7 @@ import requests -from ansys.rep.client.auth import authenticate +from ansys.hps.client.auth import authenticate from tests.rep_test import REPTestCase log = logging.getLogger(__name__) diff --git a/tests/jms/test_algorithms.py b/tests/jms/test_algorithms.py index 2124b8b41..821d558c0 100644 --- a/tests/jms/test_algorithms.py +++ b/tests/jms/test_algorithms.py @@ -10,8 +10,8 @@ from marshmallow.utils import missing -from ansys.rep.client.jms import JmsApi, ProjectApi -from ansys.rep.client.jms.resource import Algorithm, Job, JobDefinition, JobSelection, Project +from ansys.hps.client.jms import JmsApi, ProjectApi +from ansys.hps.client.jms.resource import Algorithm, Job, JobDefinition, JobSelection, Project from tests.rep_test import REPTestCase log = logging.getLogger(__name__) diff --git a/tests/jms/test_files.py b/tests/jms/test_files.py index 251bb6abd..ff4ee8fd2 100644 --- a/tests/jms/test_files.py +++ b/tests/jms/test_files.py @@ -13,8 +13,8 @@ from marshmallow.utils import missing -from ansys.rep.client.jms import JmsApi, ProjectApi -from ansys.rep.client.jms.resource import File, Project +from ansys.hps.client.jms import JmsApi, ProjectApi +from ansys.hps.client.jms.resource import File, Project from tests.rep_test import REPTestCase log = logging.getLogger(__name__) diff --git a/tests/jms/test_fitness_definition.py b/tests/jms/test_fitness_definition.py index f5708e5dc..79bc68907 100644 --- a/tests/jms/test_fitness_definition.py +++ b/tests/jms/test_fitness_definition.py @@ -10,13 +10,13 @@ from marshmallow.utils import missing -from ansys.rep.client.jms import JmsApi, ProjectApi -from ansys.rep.client.jms.resource import JobDefinition, Project -from ansys.rep.client.jms.resource.fitness_definition import ( +from ansys.hps.client.jms import JmsApi, ProjectApi +from ansys.hps.client.jms.resource import JobDefinition, Project +from ansys.hps.client.jms.resource.fitness_definition import ( FitnessDefinition, FitnessTermDefinition, ) -from ansys.rep.client.jms.schema.fitness_definition import ( +from ansys.hps.client.jms.schema.fitness_definition import ( FitnessDefinitionSchema, FitnessTermDefinitionSchema, ) diff --git a/tests/jms/test_jms_api.py b/tests/jms/test_jms_api.py index 03f1d4ae2..963341176 100644 --- a/tests/jms/test_jms_api.py +++ b/tests/jms/test_jms_api.py @@ -11,9 +11,9 @@ from examples.mapdl_motorbike_frame.project_setup import create_project from marshmallow.utils import missing -from ansys.rep.client import Client -from ansys.rep.client.jms import JmsApi, ProjectApi -from ansys.rep.client.jms.resource import Job, Project +from ansys.hps.client import Client +from ansys.hps.client.jms import JmsApi, ProjectApi +from ansys.hps.client.jms.resource import Job, Project from tests.rep_test import REPTestCase log = logging.getLogger(__name__) diff --git a/tests/jms/test_job_definitions.py b/tests/jms/test_job_definitions.py index 322e16a39..f920d46f6 100644 --- a/tests/jms/test_job_definitions.py +++ b/tests/jms/test_job_definitions.py @@ -3,8 +3,8 @@ from examples.mapdl_motorbike_frame.project_setup import create_project from marshmallow.utils import missing -from ansys.rep.client import AuthApi, JmsApi, ProjectApi -from ansys.rep.client.jms.resource import ( +from ansys.hps.client import AuthApi, JmsApi, ProjectApi +from ansys.hps.client.jms.resource import ( HpcResources, JobDefinition, Project, diff --git a/tests/jms/test_jobs.py b/tests/jms/test_jobs.py index 1c45616e4..445c0f311 100644 --- a/tests/jms/test_jobs.py +++ b/tests/jms/test_jobs.py @@ -13,9 +13,9 @@ from examples.mapdl_motorbike_frame.project_setup import create_project from marshmallow.utils import missing -from ansys.rep.client import AuthApi, JmsApi, ProjectApi -from ansys.rep.client.jms.resource import Job, JobDefinition, Project -from ansys.rep.client.jms.schema.job import JobSchema +from ansys.hps.client import AuthApi, JmsApi, ProjectApi +from ansys.hps.client.jms.resource import Job, JobDefinition, Project +from ansys.hps.client.jms.schema.job import JobSchema from tests.rep_test import REPTestCase log = logging.getLogger(__name__) diff --git a/tests/jms/test_parameter_definitions.py b/tests/jms/test_parameter_definitions.py index dd33af528..b72698473 100644 --- a/tests/jms/test_parameter_definitions.py +++ b/tests/jms/test_parameter_definitions.py @@ -10,8 +10,8 @@ from marshmallow.utils import missing -from ansys.rep.client.jms import JmsApi, ProjectApi -from ansys.rep.client.jms.resource import ( +from ansys.hps.client.jms import JmsApi, ProjectApi +from ansys.hps.client.jms.resource import ( BoolParameterDefinition, FloatParameterDefinition, IntParameterDefinition, @@ -19,7 +19,7 @@ Project, StringParameterDefinition, ) -from ansys.rep.client.jms.schema.parameter_definition import ( +from ansys.hps.client.jms.schema.parameter_definition import ( BoolParameterDefinitionSchema, FloatParameterDefinitionSchema, IntParameterDefinitionSchema, diff --git a/tests/jms/test_project_permissions.py b/tests/jms/test_project_permissions.py index beaa0f09f..d5e23ed6a 100644 --- a/tests/jms/test_project_permissions.py +++ b/tests/jms/test_project_permissions.py @@ -10,11 +10,11 @@ import unittest import uuid -from ansys.rep.client import Client -from ansys.rep.client.auth import AuthApi, User -from ansys.rep.client.exceptions import ClientError -from ansys.rep.client.jms import JmsApi, ProjectApi -from ansys.rep.client.jms.resource import JobDefinition, Permission, Project +from ansys.hps.client import Client +from ansys.hps.client.auth import AuthApi, User +from ansys.hps.client.exceptions import ClientError +from ansys.hps.client.jms import JmsApi, ProjectApi +from ansys.hps.client.jms.resource import JobDefinition, Permission, Project from tests.rep_test import REPTestCase log = logging.getLogger(__name__) diff --git a/tests/jms/test_projects.py b/tests/jms/test_projects.py index 47fda3992..57b8d65f7 100644 --- a/tests/jms/test_projects.py +++ b/tests/jms/test_projects.py @@ -15,10 +15,10 @@ from examples.mapdl_motorbike_frame.project_setup import create_project as motorbike_create_project from marshmallow.utils import missing -from ansys.rep.client import __ansys_apps_version__ as ansys_version -from ansys.rep.client.jms import JmsApi, ProjectApi -from ansys.rep.client.jms.resource import JobDefinition, LicenseContext, Project -from ansys.rep.client.jms.schema.project import ProjectSchema +from ansys.hps.client import __ansys_apps_version__ as ansys_version +from ansys.hps.client.jms import JmsApi, ProjectApi +from ansys.hps.client.jms.resource import JobDefinition, LicenseContext, Project +from ansys.hps.client.jms.schema.project import ProjectSchema from tests.rep_test import REPTestCase log = logging.getLogger(__name__) diff --git a/tests/jms/test_resources.py b/tests/jms/test_resources.py index c15da3679..6d865678a 100644 --- a/tests/jms/test_resources.py +++ b/tests/jms/test_resources.py @@ -4,7 +4,7 @@ from examples.mapdl_motorbike_frame.project_setup import create_project from marshmallow import missing -from ansys.rep.client.jms import ( +from ansys.hps.client.jms import ( FitnessDefinition, JmsApi, JobDefinition, diff --git a/tests/jms/test_task_definition.py b/tests/jms/test_task_definition.py index eab45f78b..5f9eba130 100644 --- a/tests/jms/test_task_definition.py +++ b/tests/jms/test_task_definition.py @@ -1,14 +1,14 @@ from collections import OrderedDict import unittest -from ansys.rep.client.jms.resource import TaskDefinition -from ansys.rep.client.jms.resource.task_definition import ( +from ansys.hps.client.jms.resource import TaskDefinition +from ansys.hps.client.jms.resource.task_definition import ( HpcResources, Licensing, ResourceRequirements, SuccessCriteria, ) -from ansys.rep.client.jms.schema.task_definition import TaskDefinitionSchema +from ansys.hps.client.jms.schema.task_definition import TaskDefinitionSchema from tests.rep_test import REPTestCase diff --git a/tests/jms/test_task_definition_templates.py b/tests/jms/test_task_definition_templates.py index 66d24e1b0..1f2e0a6de 100644 --- a/tests/jms/test_task_definition_templates.py +++ b/tests/jms/test_task_definition_templates.py @@ -13,16 +13,16 @@ from marshmallow.utils import missing -from ansys.rep.client import REPError -from ansys.rep.client.auth import AuthApi -from ansys.rep.client.jms import JmsApi -from ansys.rep.client.jms.resource import ( +from ansys.hps.client import REPError +from ansys.hps.client.auth import AuthApi +from ansys.hps.client.jms import JmsApi +from ansys.hps.client.jms.resource import ( HpcResources, Permission, TaskDefinitionTemplate, TemplateResourceRequirements, ) -from ansys.rep.client.jms.schema.task_definition_template import TaskDefinitionTemplateSchema +from ansys.hps.client.jms.schema.task_definition_template import TaskDefinitionTemplateSchema from tests.rep_test import REPTestCase log = logging.getLogger(__name__) diff --git a/tests/jms/test_task_files.py b/tests/jms/test_task_files.py index d34de14a3..434fdc0c5 100644 --- a/tests/jms/test_task_files.py +++ b/tests/jms/test_task_files.py @@ -14,8 +14,8 @@ from examples.mapdl_motorbike_frame.project_setup import create_project import pytest -from ansys.rep.client.jms import JmsApi, ProjectApi -from ansys.rep.client.jms.resource import File +from ansys.hps.client.jms import JmsApi, ProjectApi +from ansys.hps.client.jms.resource import File from tests.rep_test import REPTestCase log = logging.getLogger(__name__) diff --git a/tests/jms/test_tasks.py b/tests/jms/test_tasks.py index 86877cc17..5e0ee00e5 100644 --- a/tests/jms/test_tasks.py +++ b/tests/jms/test_tasks.py @@ -15,9 +15,9 @@ from marshmallow.utils import missing import pytest -from ansys.rep.client.jms import JmsApi, ProjectApi -from ansys.rep.client.jms.resource import Job, JobDefinition, Project, Software, TaskDefinition -from ansys.rep.client.jms.schema.task import TaskSchema +from ansys.hps.client.jms import JmsApi, ProjectApi +from ansys.hps.client.jms.resource import Job, JobDefinition, Project, Software, TaskDefinition +from ansys.hps.client.jms.schema.task import TaskSchema from tests.rep_test import REPTestCase log = logging.getLogger(__name__) diff --git a/tests/rep_test.py b/tests/rep_test.py index dfb66270d..f3fc2050e 100644 --- a/tests/rep_test.py +++ b/tests/rep_test.py @@ -14,9 +14,9 @@ from keycloak import KeycloakAdmin -from ansys.rep.client import Client -from ansys.rep.client.auth import AuthApi, User -from ansys.rep.client.auth.api.auth_api import create_user +from ansys.hps.client import Client +from ansys.hps.client.auth import AuthApi, User +from ansys.hps.client.auth.api.auth_api import create_user class REPTestCase(unittest.TestCase): diff --git a/tests/rms/test_api.py b/tests/rms/test_api.py index da038bf2f..0d2614e57 100644 --- a/tests/rms/test_api.py +++ b/tests/rms/test_api.py @@ -1,7 +1,7 @@ import logging import unittest -from ansys.rep.client.rms import RmsApi +from ansys.hps.client.rms import RmsApi from tests.rep_test import REPTestCase log = logging.getLogger(__name__) diff --git a/tests/rms/test_compute_resource_sets.py b/tests/rms/test_compute_resource_sets.py index 01fea936b..b36387e24 100644 --- a/tests/rms/test_compute_resource_sets.py +++ b/tests/rms/test_compute_resource_sets.py @@ -1,7 +1,7 @@ import logging import unittest -from ansys.rep.client.rms import RmsApi +from ansys.hps.client.rms import RmsApi from tests.rep_test import REPTestCase log = logging.getLogger(__name__) diff --git a/tests/rms/test_evaluators.py b/tests/rms/test_evaluators.py index 6df48951c..82f90f2a6 100644 --- a/tests/rms/test_evaluators.py +++ b/tests/rms/test_evaluators.py @@ -2,8 +2,8 @@ import logging import unittest -from ansys.rep.client.rms import RmsApi -from ansys.rep.client.rms.models import EvaluatorConfigurationUpdate, EvaluatorRegistration +from ansys.hps.client.rms import RmsApi +from ansys.hps.client.rms.models import EvaluatorConfigurationUpdate, EvaluatorRegistration from tests.rep_test import REPTestCase log = logging.getLogger(__name__) diff --git a/tests/rms/test_serialization.py b/tests/rms/test_serialization.py index 322ae7eb3..b248f0250 100644 --- a/tests/rms/test_serialization.py +++ b/tests/rms/test_serialization.py @@ -3,8 +3,8 @@ import logging import unittest -from ansys.rep.client.rms.api.base import objects_to_json -from ansys.rep.client.rms.models import EvaluatorRegistration +from ansys.hps.client.rms.api.base import objects_to_json +from ansys.hps.client.rms.models import EvaluatorRegistration from tests.rep_test import REPTestCase log = logging.getLogger(__name__) diff --git a/tests/test_client.py b/tests/test_client.py index 5e455da00..85769dd93 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -11,7 +11,7 @@ import requests -from ansys.rep.client import Client +from ansys.hps.client import Client from tests.rep_test import REPTestCase log = logging.getLogger(__name__) diff --git a/tests/test_connection.py b/tests/test_connection.py index 520a3759f..afa28410b 100644 --- a/tests/test_connection.py +++ b/tests/test_connection.py @@ -7,8 +7,8 @@ # ---------------------------------------------------------- import logging -from ansys.rep.client.auth import authenticate -from ansys.rep.client.connection import create_session, ping +from ansys.hps.client.auth import authenticate +from ansys.hps.client.connection import create_session, ping from tests.rep_test import REPTestCase log = logging.getLogger(__name__) diff --git a/tests/test_examples.py b/tests/test_examples.py index a9a679490..dd8983c34 100644 --- a/tests/test_examples.py +++ b/tests/test_examples.py @@ -1,8 +1,8 @@ import logging import unittest -from ansys.rep.client import __ansys_apps_version__ as ansys_version -from ansys.rep.client.jms import JmsApi, ProjectApi +from ansys.hps.client import __ansys_apps_version__ as ansys_version +from ansys.hps.client.jms import JmsApi, ProjectApi from tests.rep_test import REPTestCase log = logging.getLogger(__name__) diff --git a/tests/test_exceptions.py b/tests/test_exceptions.py index 47b74ecc1..442aa2e0c 100644 --- a/tests/test_exceptions.py +++ b/tests/test_exceptions.py @@ -8,8 +8,8 @@ import logging import unittest -from ansys.rep.client import APIError, Client, ClientError -from ansys.rep.client.jms import JmsApi +from ansys.hps.client import APIError, Client, ClientError +from ansys.hps.client.jms import JmsApi from tests.rep_test import REPTestCase log = logging.getLogger(__name__) From 176ce5c468baa34f430aade213a243072df1f882 Mon Sep 17 00:00:00 2001 From: Federico Negri Date: Thu, 14 Dec 2023 07:33:27 +0100 Subject: [PATCH 05/19] Some logs renaming --- examples/cfx_static_mixer/project_setup.py | 4 ++-- examples/fluent_2d_heat_exchanger/project_setup.py | 4 ++-- examples/fluent_nozzle/project_setup.py | 4 ++-- examples/mapdl_linked_analyses/project_setup.py | 4 ++-- examples/mapdl_motorbike_frame/project_query.py | 4 ++-- examples/mapdl_motorbike_frame/project_setup.py | 4 ++-- examples/mapdl_motorbike_frame/task_files.py | 4 ++-- examples/mapdl_tyre_performance/project_setup.py | 4 ++-- examples/python_linked_multi_process_step/project_setup.py | 2 +- 9 files changed, 17 insertions(+), 17 deletions(-) diff --git a/examples/cfx_static_mixer/project_setup.py b/examples/cfx_static_mixer/project_setup.py index ace8c6a3d..7cd3ac910 100644 --- a/examples/cfx_static_mixer/project_setup.py +++ b/examples/cfx_static_mixer/project_setup.py @@ -162,9 +162,9 @@ def create_project(client, name, num_jobs=20, version=__ansys_apps_version__): logging.basicConfig(format="%(message)s", level=logging.DEBUG) try: - log.info("Connect to REP JMS") + log.info("Connect to HPC Platform Services") client = Client(rep_url=args.url, username=args.username, password=args.password) - log.info(f"REP URL: {client.rep_url}") + log.info(f"HPS URL: {client.rep_url}") proj = create_project( client=client, name=args.name, num_jobs=args.num_jobs, version=args.ansys_version ) diff --git a/examples/fluent_2d_heat_exchanger/project_setup.py b/examples/fluent_2d_heat_exchanger/project_setup.py index 974808884..69dd3f887 100644 --- a/examples/fluent_2d_heat_exchanger/project_setup.py +++ b/examples/fluent_2d_heat_exchanger/project_setup.py @@ -138,11 +138,11 @@ def create_project( logger = logging.getLogger() logging.basicConfig(format="[%(asctime)s | %(levelname)s] %(message)s", level=logging.DEBUG) - log.debug("=== REP connection") + log.debug("=== HPS connection") client = Client(rep_url=args.url, username=args.username, password=args.password) try: - log.info(f"REP URL: {client.rep_url}") + log.info(f"HPS URL: {client.rep_url}") proj = create_project( client=client, name=args.name, diff --git a/examples/fluent_nozzle/project_setup.py b/examples/fluent_nozzle/project_setup.py index c191b95b1..9927d14b2 100644 --- a/examples/fluent_nozzle/project_setup.py +++ b/examples/fluent_nozzle/project_setup.py @@ -194,9 +194,9 @@ def create_project(client, name, num_jobs=20, version=__ansys_apps_version__): logging.basicConfig(format="%(message)s", level=logging.DEBUG) try: - log.info("Connect to REP JMS") + log.info("Connect to HPC Platform Services") client = Client(rep_url=args.url, username=args.username, password=args.password) - log.info(f"REP URL: {client.rep_url}") + log.info(f"HPS URL: {client.rep_url}") proj = create_project( client=client, name=args.name, num_jobs=args.num_jobs, version=args.ansys_version ) diff --git a/examples/mapdl_linked_analyses/project_setup.py b/examples/mapdl_linked_analyses/project_setup.py index 22f395bb1..316d072db 100644 --- a/examples/mapdl_linked_analyses/project_setup.py +++ b/examples/mapdl_linked_analyses/project_setup.py @@ -290,7 +290,7 @@ def create_project( client: Client, name: str, incremental: bool, use_exec_script: bool, version: str ) -> Project: - log.info("=== REP connection") + log.info("=== HPS connection") log.info(f"Client connected at {client.rep_url}") log.info("=== Create new Project") @@ -373,7 +373,7 @@ def create_project( logger = logging.getLogger() logging.basicConfig(format="[%(asctime)s | %(levelname)s] %(message)s", level=logging.INFO) - log.debug("=== REP connection") + log.debug("=== HPS connection") client = Client(rep_url=args.url, username=args.username, password=args.password) try: diff --git a/examples/mapdl_motorbike_frame/project_query.py b/examples/mapdl_motorbike_frame/project_query.py index 1c8f5ccf6..aa4c09017 100644 --- a/examples/mapdl_motorbike_frame/project_query.py +++ b/examples/mapdl_motorbike_frame/project_query.py @@ -124,9 +124,9 @@ def download_files(client, project_name): logging.basicConfig(format="%(message)s", level=logging.DEBUG) try: - log.info("Connect to REP JMS") + log.info("Connect to HPC Platform Services") client = Client(rep_url=args.url, username=args.username, password=args.password) - log.info(f"REP URL: {client.rep_url}") + log.info(f"HPS URL: {client.rep_url}") query_stats(client=client, project_name=args.name) download_files(client=client, project_name=args.name) diff --git a/examples/mapdl_motorbike_frame/project_setup.py b/examples/mapdl_motorbike_frame/project_setup.py index de2c4f825..6444e761c 100644 --- a/examples/mapdl_motorbike_frame/project_setup.py +++ b/examples/mapdl_motorbike_frame/project_setup.py @@ -340,9 +340,9 @@ def create_project( logging.basicConfig(format="%(message)s", level=logging.DEBUG) try: - log.info("Connect to REP JMS") + log.info("Connect to HPC Platform Services") client = Client(rep_url=args.url, username=args.username, password=args.password) - log.info(f"REP URL: {client.rep_url}") + log.info(f"HPS URL: {client.rep_url}") proj = create_project( client=client, name=args.name, diff --git a/examples/mapdl_motorbike_frame/task_files.py b/examples/mapdl_motorbike_frame/task_files.py index c53f2f66e..6b14135bd 100644 --- a/examples/mapdl_motorbike_frame/task_files.py +++ b/examples/mapdl_motorbike_frame/task_files.py @@ -129,9 +129,9 @@ def modify_task_files(client, project_name): logging.basicConfig(format="%(message)s", level=logging.DEBUG) try: - log.info("Connect to REP JMS") + log.info("Connect to HPC Platform Services") client = Client(rep_url=args.url, username=args.username, password=args.password) - log.info(f"REP URL: {client.rep_url}") + log.info(f"HPS URL: {client.rep_url}") modify_task_files(client=client, project_name=args.name) except REPError as e: diff --git a/examples/mapdl_tyre_performance/project_setup.py b/examples/mapdl_tyre_performance/project_setup.py index 6875f207c..972199ea5 100644 --- a/examples/mapdl_tyre_performance/project_setup.py +++ b/examples/mapdl_tyre_performance/project_setup.py @@ -251,11 +251,11 @@ def create_project( logger = logging.getLogger() logging.basicConfig(format="[%(asctime)s | %(levelname)s] %(message)s", level=logging.DEBUG) - log.debug("=== REP connection") + log.debug("=== HPS connection") client = Client(rep_url=args.url, username=args.username, password=args.password) try: - log.info(f"REP URL: {client.rep_url}") + log.info(f"HPS URL: {client.rep_url}") proj = create_project( client=client, name=args.name, diff --git a/examples/python_linked_multi_process_step/project_setup.py b/examples/python_linked_multi_process_step/project_setup.py index c5cfacb52..e847bb667 100644 --- a/examples/python_linked_multi_process_step/project_setup.py +++ b/examples/python_linked_multi_process_step/project_setup.py @@ -192,7 +192,7 @@ def main(client, num_task_definitions, num_jobs, start, inactive): args = parser.parse_args() - log.debug("=== REP connection") + log.debug("=== HPS connection") client = Client(rep_url=args.url, username=args.username, password=args.password) try: main( From 899c0215ab08f6c7d32aa12692f085afb07c4c92 Mon Sep 17 00:00:00 2001 From: Federico Negri Date: Thu, 14 Dec 2023 07:38:17 +0100 Subject: [PATCH 06/19] Some docstring changes --- README.rst | 2 +- ansys/hps/client/auth/api/auth_api.py | 2 +- ansys/hps/client/client.py | 2 +- ansys/hps/client/jms/api/jms_api.py | 2 +- ansys/hps/client/jms/api/project_api.py | 2 +- ansys/hps/client/rms/api/rms_api.py | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.rst b/README.rst index 53aae8dc4..1e06b4d99 100644 --- a/README.rst +++ b/README.rst @@ -31,7 +31,7 @@ PyHPS :alt: Black -A Python client for Ansys REP - Remote Execution Platform +A Python client library for the Ansys HPC Platform Services. How to install -------------- diff --git a/ansys/hps/client/auth/api/auth_api.py b/ansys/hps/client/auth/api/auth_api.py index d3f5bda18..60ee037c0 100644 --- a/ansys/hps/client/auth/api/auth_api.py +++ b/ansys/hps/client/auth/api/auth_api.py @@ -24,7 +24,7 @@ class AuthApi: Parameters ---------- client : Client - A REP client object. + An HPS client object. Examples -------- diff --git a/ansys/hps/client/client.py b/ansys/hps/client/client.py index 75eb84d54..0e1d9931a 100644 --- a/ansys/hps/client/client.py +++ b/ansys/hps/client/client.py @@ -21,7 +21,7 @@ class Client(object): - """A python interface to the Remote Execution Platform (REP) API. + """A python client to the Ansys HPC Platform Services APIs. Uses the provided credentials to create and store an authorized :class:`requests.Session` object. diff --git a/ansys/hps/client/jms/api/jms_api.py b/ansys/hps/client/jms/api/jms_api.py index 4ecfbb8f0..a86d33713 100644 --- a/ansys/hps/client/jms/api/jms_api.py +++ b/ansys/hps/client/jms/api/jms_api.py @@ -25,7 +25,7 @@ class JmsApi(object): Parameters ---------- client : Client - A REP client object. + An HPS client object. Examples -------- diff --git a/ansys/hps/client/jms/api/project_api.py b/ansys/hps/client/jms/api/project_api.py index 18823c1c4..ddefd9732 100644 --- a/ansys/hps/client/jms/api/project_api.py +++ b/ansys/hps/client/jms/api/project_api.py @@ -37,7 +37,7 @@ class ProjectApi: Parameters ---------- client : Client - A REP client object. + An HPS client object. project_id : str ID of the project diff --git a/ansys/hps/client/rms/api/rms_api.py b/ansys/hps/client/rms/api/rms_api.py index c62aaba98..016aa6dd2 100644 --- a/ansys/hps/client/rms/api/rms_api.py +++ b/ansys/hps/client/rms/api/rms_api.py @@ -22,7 +22,7 @@ class RmsApi(object): Parameters ---------- client : Client - A REP client object. + An HPS client object. """ def __init__(self, client: Client): From 93ec064a5ab0eeb77f37690560656da60bcbbae2 Mon Sep 17 00:00:00 2001 From: Federico Negri Date: Thu, 14 Dec 2023 07:40:07 +0100 Subject: [PATCH 07/19] Remove old files --- examples/add_num_cores_to_wb_project.py | 59 - .../motorbike_frame.ipynb | 2828 ----------------- .../python_two_bar_truss.ipynb | 2501 --------------- 3 files changed, 5388 deletions(-) delete mode 100644 examples/add_num_cores_to_wb_project.py delete mode 100644 examples/mapdl_motorbike_frame/motorbike_frame.ipynb delete mode 100644 examples/python_two_bar_truss_problem/python_two_bar_truss.ipynb diff --git a/examples/add_num_cores_to_wb_project.py b/examples/add_num_cores_to_wb_project.py deleted file mode 100644 index 97d2526c3..000000000 --- a/examples/add_num_cores_to_wb_project.py +++ /dev/null @@ -1,59 +0,0 @@ -# ---------------------------------------------------------- -# Copyright (C) 2019 by -# ANSYS Switzerland GmbH -# www.ansys.com -# -# Author(s): O.Koenig -# ---------------------------------------------------------- -# -# Exemplary utility script that connects to a WB project and then -# adds a number_of_cores parameter location to to propagate the -# number to the input script. -# - -import logging - -from ansys.hps.client import REPError -from ansys.hps.client.jms import Client - -log = logging.getLogger(__name__) - - -def main(): - - client = Client( - rep_url="https://dcsv202testing.westeurope.cloudapp.azure.com/dcs", - username="repadmin", - password="An5y5_repadmin", - ) - log.debug(f"Client connected to {client.rep_url}") - proj = client.get_project("steel_support_img_steps") - job_def = proj.get_job_definitions(id=1)[0] - files = proj.get_files() - - wbjn_names = ["wbjn_Workbench_Geometry", "wbjn_Workbench_Solution", "wbjn_Workbench_Project"] - wbjn_files = [] - for f in files: - if f.name in wbjn_names: - wbjn_files.append(f) - - for wbjn in wbjn_files: - log.debug(f"Addin parameter location rule for number_of_cores value to {wbjn.name}") - job_def.add_parameter_mapping( - key_string="number_of_cores", - tokenizer="=", - task_definition_property="num_cores", - file_id=wbjn.id, - ) - proj.update_job_definitions([job_def]) - - -if __name__ == "__main__": - - logger = logging.getLogger() - logging.basicConfig(format="[%(asctime)s | %(levelname)s] %(message)s", level=logging.DEBUG) - - try: - main() - except REPError as e: - log.error(str(e)) diff --git a/examples/mapdl_motorbike_frame/motorbike_frame.ipynb b/examples/mapdl_motorbike_frame/motorbike_frame.ipynb deleted file mode 100644 index 2706e6b37..000000000 --- a/examples/mapdl_motorbike_frame/motorbike_frame.ipynb +++ /dev/null @@ -1,2828 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "33155fc3-db14-423a-9b75-2ca1b4de0b11", - "metadata": {}, - "source": [ - "# DCS parametric MAPDL simulation\n", - "\n", - "Create a DCS project consisting of an ANSYS APDL beam model\n", - "of a tubular steel trellis motorbike-frame.\n", - "\n", - "After creating the project job_definition, a number of design points with randomly \n", - "chosen parameter values are created and set to pending.\n", - "\n", - "For further details about the model and its parametrization, see e.g.\n", - "\"Using Evolutionary Methods with a Heterogeneous Genotype Representation \n", - "for Design Optimization of a Tubular Steel Trellis Motorbike-Frame\", 2003\n", - "by U. M. Fasel, O. Koenig, M. Wintermantel and P. Ermanni.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "86e49e2e-4935-42ad-8d3a-31eb1c185fc4", - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import random\n", - "import time\n", - "import logging\n", - "\n", - "from ansys.hps.client.jms import (Client, JobDefinition, Job, File,\n", - " FitnessDefinition, Project, SuccessCriteria, Licensing)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "99b4b41d-2c79-47bd-ac23-0901fc58f96f", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Start logging\n" - ] - } - ], - "source": [ - "logger = logging.getLogger()\n", - "logging.basicConfig(format='%(message)s', level=logging.DEBUG)\n", - "log = logging.getLogger(__name__)\n", - "log.info(\"Start logging\")" - ] - }, - { - "cell_type": "markdown", - "id": "dd624633-7ce7-48a0-bf39-995734b1d407", - "metadata": {}, - "source": [ - "### Connect to DCS" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "cc9d0a2b-fa15-4338-b8d4-3a29d9380dbd", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Authenticate on https://ec2-18-185-40-216.eu-central-1.compute.amazonaws.com/dcs/auth/api with user demo and password\n", - "Starting new HTTPS connection (1): ec2-18-185-40-216.eu-central-1.compute.amazonaws.com:443\n", - "https://ec2-18-185-40-216.eu-central-1.compute.amazonaws.com:443 \"POST /dcs/auth/api/oauth/token HTTP/1.1\" 200 None\n", - "Authentication successful, returning tokens\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "https://ec2-18-185-40-216.eu-central-1.compute.amazonaws.com/dcs\n" - ] - } - ], - "source": [ - "client = Client(rep_url=\"https://ec2-18-185-40-216.eu-central-1.compute.amazonaws.com/dcs\", username=\"demo\", password=\"tnz\")\n", - "print(client.rep_url)" - ] - }, - { - "cell_type": "markdown", - "id": "e5b25e2b-3c05-4de0-b35f-b279e404b73a", - "metadata": {}, - "source": [ - "### Create DCS project" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "ab146270-6ecd-45c3-b9a1-ad23724988a8", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "=== Project\n", - "Starting new HTTPS connection (1): ec2-18-185-40-216.eu-central-1.compute.amazonaws.com:443\n", - "https://ec2-18-185-40-216.eu-central-1.compute.amazonaws.com:443 \"POST /dcs/dps/api//projects/ HTTP/1.1\" 201 1164\n", - "=== Files\n", - "https://ec2-18-185-40-216.eu-central-1.compute.amazonaws.com:443 \"POST /dcs/dps/api//projects/mapdl_motorbike_frame/files?fields=all HTTP/1.1\" 201 3052\n", - "https://ec2-18-185-40-216.eu-central-1.compute.amazonaws.com:443 \"POST /dcs/fs/api/v1/mapdl_motorbike_frame/1_mac HTTP/1.1\" 200 47\n", - "https://ec2-18-185-40-216.eu-central-1.compute.amazonaws.com:443 \"POST /dcs/fs/api/v1/mapdl_motorbike_frame/2_results HTTP/1.1\" 200 47\n", - "https://ec2-18-185-40-216.eu-central-1.compute.amazonaws.com:443 \"PUT /dcs/dps/api//projects/mapdl_motorbike_frame/files?fields=all HTTP/1.1\" 200 3112\n", - "=== JobDefinition with simulation workflow and parameters\n", - "https://ec2-18-185-40-216.eu-central-1.compute.amazonaws.com:443 \"POST /dcs/dps/api//projects/mapdl_motorbike_frame/job_definitions?fields=all HTTP/1.1\" 201 62092\n" - ] - } - ], - "source": [ - "log.debug(\"=== Project\")\n", - "\n", - "proj_id=\"mapdl_motorbike_frame\"\n", - "proj = Project(id=proj_id, display_name=\"MAPDL Motorbike Frame\", priority=1, active=True)\n", - "proj = client.create_project(proj, replace=True)\n", - "\n", - "log.debug(\"=== Files\")\n", - "files = []\n", - "files.append(File(name=\"mac\", evaluation_path=\"motorbike_frame.mac\",\n", - " type=\"text/plain\", src=os.path.join(\"motorbike_frame.mac\")))\n", - "files.append(File(name=\"results\", evaluation_path=\"motorbike_frame_results.txt\",\n", - " type=\"text/plain\", src=os.path.join(\"motorbike_frame_results.txt\")))\n", - "files.append(File(name=\"out\", evaluation_path=\"file.out\", type=\"text/plain\", collect=True, monitor=True))\n", - "files.append(File(name=\"img\", evaluation_path=\"**.jpg\", type=\"image/jpeg\", collect=True))\n", - "files.append(File(name=\"err\", evaluation_path=\"file*.err\", type=\"text/plain\", collect=True, monitor=True))\n", - "\n", - "# Alternative, not recommended way, will collect ALL files matching file.*\n", - "#files.append( File( name=\"all_files\", evaluation_path=\"file.*\", type=\"text/plain\") )\n", - "\n", - "files = proj.create_files(files)\n", - "file_ids = {f.name: f.id for f in files}\n", - "\n", - "log.debug(\"=== JobDefinition with simulation workflow and parameters\")\n", - "job_def = JobDefinition(name=\"JobDefinition.1\", active=True)\n", - "\n", - "# Input params: Dimensions of three custom tubes\n", - "float_input_params=[]\n", - "for i in range(1,4):\n", - " pd=job_def.add_float_parameter_definition(name='tube%i_radius' %i, lower_limit=4.0, upper_limit=20.0,default=12.0 )\n", - " job_def.add_parameter_mapping(key_string='radius(%i)' % i, tokenizer=\"=\", parameter_definition_name=pd.name, file_id=file_ids[\"mac\"])\n", - " float_input_params.append(pd)\n", - "\n", - " pd=job_def.add_float_parameter_definition(name='tube%i_thickness' %i,lower_limit=0.5, upper_limit=2.5, default=1.0 )\n", - " job_def.add_parameter_mapping(key_string='thickness(%i)' % i, tokenizer=\"=\", parameter_definition_name=pd.name, file_id=file_ids[\"mac\"])\n", - " float_input_params.append(pd)\n", - "\n", - "# Input params: Custom types used for all the different tubes of the frame\n", - "str_input_params=[]\n", - "for i in range(1,22):\n", - " pd=job_def.add_string_parameter_definition(name=\"tube%s\" %i, default=\"1\", value_list=[\"1\",\"2\",\"3\"] )\n", - " job_def.add_parameter_mapping(key_string='tubes(%i)' % i, tokenizer=\"=\", parameter_definition_name=pd.name, file_id=file_ids[\"mac\"])\n", - " str_input_params.append(pd)\n", - "\n", - "# Output Parames\n", - "for pname in [\"weight\", \"torsion_stiffness\", \"max_stress\"]:\n", - " pd=job_def.add_float_parameter_definition(name=pname)\n", - " job_def.add_parameter_mapping(key_string=pname, tokenizer=\"=\", parameter_definition_name=pd.name, file_id=file_ids[\"results\"])\n", - "\n", - "# Collect some runtime stats from MAPDL out file\n", - "pd=job_def.add_float_parameter_definition(name=\"mapdl_elapsed_time_obtain_license\")\n", - "job_def.add_parameter_mapping(key_string=\"Elapsed time spent obtaining a license\", tokenizer=\":\", parameter_definition_name=pd.name, file_id=file_ids[\"out\"])\n", - "pd=job_def.add_float_parameter_definition(name=\"mapdl_cp_time\")\n", - "job_def.add_parameter_mapping(key_string=\"CP Time (sec)\", tokenizer=\"=\", parameter_definition_name=pd.name, file_id=file_ids[\"out\"])\n", - "pd=job_def.add_float_parameter_definition(name=\"mapdl_elapsed_time\")\n", - "job_def.add_parameter_mapping(key_string=\"Elapsed Time (sec)\", tokenizer=\"=\", parameter_definition_name=pd.name, file_id=file_ids[\"out\"])\n", - "\n", - "# Process step\n", - "job_def.add_task_definition( name=\"MAPDL_run\", \n", - " application_name=\"ANSYS Mechanical APDL\",\n", - " application_version=\"2022 R2\",\n", - " execution_command=\"%executable% -b -i %file:mac% -o file.out -np %resource:num_cores%\",\n", - " max_execution_time=50.0,\n", - " cpu_core_usage=1.0,\n", - " execution_level=0,\n", - " memory=250,\n", - " disk_space=5,\n", - " num_trials=1,\n", - " input_file_ids=[f.id for f in files[:1]], \n", - " output_file_ids=[f.id for f in files[1:]], \n", - " success_criteria= SuccessCriteria(\n", - " return_code=0,\n", - " expressions= [\"values['tube1_radius']>=4.0\", \"values['tube1_thickness']>=0.5\"],\n", - " required_output_file_ids=[ file_ids[\"results\"] ],\n", - " require_all_output_files=False,\n", - " require_all_output_parameters=True\n", - " ),\n", - " licensing = Licensing(enable_shared_licensing=False) # Shared licensing disabled by default\n", - " )\n", - "\n", - "# For demonstration purpose we also define some parameter replacements that refer to process step properties\n", - "job_def.add_parameter_mapping(key_string='name', tokenizer=\"=\", string_quote=\"'\", task_definition_property=\"name\", file_id=file_ids[\"mac\"])\n", - "job_def.add_parameter_mapping(key_string='application_name', tokenizer=\"=\", string_quote=\"'\", task_definition_property=\"application_name\", file_id=file_ids[\"mac\"])\n", - "job_def.add_parameter_mapping(key_string='num_cores', tokenizer=\"=\", task_definition_property=\"num_cores\", file_id=file_ids[\"mac\"])\n", - "job_def.add_parameter_mapping(key_string='cpu_core_usage', tokenizer=\"=\", task_definition_property=\"cpu_core_usage\", file_id=file_ids[\"mac\"])\n", - "\n", - "# Optional fitness definition\n", - "fd = FitnessDefinition(error_fitness=10.0)\n", - "fd.add_fitness_term(name=\"weight\", type=\"design_objective\", weighting_factor=1.0,\n", - " expression=\"map_design_objective( values['weight'], 7.5, 5.5)\")\n", - "fd.add_fitness_term(name=\"torsional_stiffness\", type=\"target_constraint\", weighting_factor=1.0,\n", - " expression=\"map_target_constraint( values['torsion_stiffness'], 1313.0, 5.0, 30.0 )\" )\n", - "fd.add_fitness_term(name=\"max_stress\", type=\"limit_constraint\", weighting_factor=1.0,\n", - " expression=\"map_limit_constraint( values['max_stress'], 451.0, 50.0 )\") \n", - "job_def.fitness_definition =fd\n", - "\n", - "# Create job_definition in project\n", - "job_def=proj.create_job_definitions([job_def])[0]" - ] - }, - { - "cell_type": "markdown", - "id": "9edce71f-8d23-4a31-b430-2d3f565567e1", - "metadata": {}, - "source": [ - "### Create design points" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "8b085fe1-c38d-4c46-804e-01fc96f54b24", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "=== Create 500 design points\n", - "https://ec2-18-185-40-216.eu-central-1.compute.amazonaws.com:443 \"POST /dcs/dps/api//projects/mapdl_motorbike_frame/jobs?fields=all HTTP/1.1\" 201 1112321\n" - ] - } - ], - "source": [ - "num_jobs=500\n", - "log.debug( f\"=== Create {num_jobs} design points\" )\n", - "dps=[]\n", - "for i in range(num_jobs):\n", - " values = { p.name : p.lower_limit + random.random()*(p.upper_limit-p.lower_limit) for p in float_input_params }\n", - " values.update({ p.name: random.choice(p.value_list) for p in str_input_params})\n", - " dps.append( Job( name=f\"Job.{i}\", values=values, eval_status=\"pending\") )\n", - "dps=job_def.create_jobs(dps)" - ] - }, - { - "cell_type": "markdown", - "id": "df20fd95-3596-4b3b-af4c-e50110e2ea7f", - "metadata": {}, - "source": [ - "### Wait for first 50 design points being evaluated" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "e83cbcd0-f516-4a55-99d1-f94bd5420199", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Resetting dropped connection: ec2-18-185-40-216.eu-central-1.compute.amazonaws.com\n", - "https://ec2-18-185-40-216.eu-central-1.compute.amazonaws.com:443 \"GET /dcs/dps/api//projects/mapdl_motorbike_frame/job_definitions/1/jobs?eval_status=evaluated&fields=all HTTP/1.1\" 200 484578\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of evaluated design points: 187\n" - ] - } - ], - "source": [ - "dps=[]\n", - "while len(dps)<25:\n", - " dps=job_def.get_jobs(eval_status='evaluated')\n", - " print(f\"Number of evaluated design points: {len(dps)}\")\n", - " time.sleep(5)" - ] - }, - { - "cell_type": "markdown", - "id": "c2bbd254-aad8-4d0e-ace8-4a9487eb9cb5", - "metadata": {}, - "source": [ - "### Plot some results" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "f3e40ce4-1643-4b47-8d3d-d7393284b147", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "param: tube1_radius\n", - "param: tube1_thickness\n", - "param: tube2_radius\n", - "param: tube2_thickness\n", - "param: tube3_radius\n", - "param: tube3_thickness\n", - "param: mapdl_elapsed_time_obtain_license\n", - "param: mapdl_cp_time\n", - "param: mapdl_elapsed_time\n", - "param: weight\n", - "param: torsion_stiffness\n", - "param: max_stress\n", - "param: tube1\n", - "param: tube2\n", - "param: tube3\n", - "param: tube4\n", - "param: tube5\n", - "param: tube6\n", - "param: tube7\n", - "param: tube8\n", - "param: tube9\n", - "param: tube10\n", - "param: tube11\n", - "param: tube12\n", - "param: tube13\n", - "param: tube14\n", - "param: tube15\n", - "param: tube16\n", - "param: tube17\n", - "param: tube18\n", - "param: tube19\n", - "param: tube20\n", - "param: tube21\n" - ] - } - ], - "source": [ - "values = {}\n", - "for param_name,value in dps[0].values.items():\n", - " print(f\"param: {param_name}\")\n", - " param_values = [ dp.values[param_name] for dp in dps ]\n", - " values[param_name]= param_values\n", - "values['id'] = [ dp.id for dp in dps ]\n", - "import pandas as pd\n", - "df= pd.DataFrame(values)\n", - "#print(\"---\")\n", - "#print(df)" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "8d1ccb65-71ca-4d55-ad7e-d59d4d9b3948", - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "alignmentgroup": "True", - "bingroup": "x", - "hovertemplate": "weight=%{x}
count=%{y}", - "legendgroup": "", - "marker": { - "color": "#636efa", - "pattern": { - "shape": "" - } - }, - "name": "", - "nbinsx": 20, - "offsetgroup": "", - "orientation": "v", - "showlegend": false, - "type": "histogram", - "x": [ - 9.76657508, - 8.56657979, - 8.66197345, - 6.69647363, - 8.63906276, - 7.75939879, - 4.84080744, - 5.70625179, - 10.40788634, - 4.13213835, - 10.85116767, - 12.36302635, - 6.5426365, - 6.07444705, - 8.63858024, - 5.70113438, - 4.78143412, - 7.70776608, - 7.04969484, - 8.97729346, - 7.94196092, - 6.64865507, - 8.43289057, - 7.47878262, - 5.01002164, - 6.15924617, - 4.59574812, - 3.68563721, - 5.65507397, - 9.87722159, - 7.42712888, - 9.71474677, - 4.85593001, - 8.35031777, - 6.17954994, - 9.10963196, - 6.88834922, - 5.77229055, - 9.2492708, - 7.9365736, - 2.95322204, - 5.29243576, - 7.86761086, - 10.57908583, - 8.23325802, - 8.2014482, - 12.17403906, - 12.00206412, - 4.80209306, - 8.25199413, - 7.69925619, - 10.19750982, - 9.95271341, - 2.51164081, - 6.33563192, - 7.29637438, - 3.18141767, - 6.6716512, - 8.23994296, - 3.76364708, - 9.61258736, - 10.47767531, - 10.2761224, - 5.92336281, - 9.54364697, - 5.14088519, - 8.4861294, - 8.53210113, - 8.6578462, - 11.31528326, - 11.02356351, - 5.13737409, - 6.64893147, - 7.41745504, - 8.3396673, - 7.57153224, - 3.90813435, - 6.12254513, - 5.75030263, - 7.1266902, - 8.48763652, - 3.45911015, - 3.96706005, - 6.49881408, - 6.59184151, - 5.79636945, - 3.22215761, - 4.53329364, - 7.1142825, - 7.03493698, - 7.35892468, - 6.52528417, - 3.18014946, - 10.29159368, - 7.9684108, - 8.43736408, - 6.1624461, - 8.18859993, - 6.16964548, - 13.25033243, - 7.05984056, - 8.5009233, - 8.7500706, - 7.72074364, - 10.1416817, - 6.64427625, - 5.88626187, - 7.09721842, - 8.61957344, - 10.48237788, - 5.5629953, - 7.67843288, - 7.68703239, - 5.50233832, - 4.45688547, - 3.70683683, - 8.53466669, - 4.86790123, - 9.23726344, - 7.34686388, - 8.53839367, - 5.62331435, - 5.41720569, - 10.50488422, - 5.33984548, - 9.19473103, - 4.3771988, - 5.33431898, - 6.27255886, - 5.78530425, - 3.6185746, - 11.13215852, - 5.69640154, - 10.98402301, - 5.50161262, - 6.3108099, - 5.25394228, - 5.72998505, - 4.69736372, - 7.66503418, - 7.31731731, - 8.49987771, - 4.64112749, - 8.89262564, - 7.61886156, - 5.68652237, - 7.70621775, - 8.41436133, - 7.42913082, - 6.38445081, - 6.28658436, - 3.98723467, - 5.58891705, - 4.18531967, - 3.5842174, - 6.32929774, - 5.30586097, - 3.9997267, - 6.977546, - 7.98364975, - 4.63754786, - 7.03690577, - 6.92642357, - 11.1920442, - 11.84308323, - 9.1246867, - 9.28684451, - 7.9244532, - 7.74634042, - 5.7252392, - 6.68237933, - 7.38727086, - 11.36606564, - 10.92263108, - 9.04596043, - 9.53640801, - 7.20281653, - 8.45800739, - 8.1973408, - 10.89259692, - 6.29891688, - 4.64664884, - 3.67163337, - 8.74042557, - 5.72894109, - 10.01994782, - 9.31596677 - ], - "xaxis": "x", - "yaxis": "y" - } - ], - "layout": { - "autosize": true, - "barmode": "relative", - "legend": { - "tracegroupgap": 0 - }, - "margin": { - "t": 60 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#f2f5fa" - }, - "error_y": { - "color": "#f2f5fa" - }, - "marker": { - "line": { - "color": "rgb(17,17,17)", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "rgb(17,17,17)", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#A2B1C6", - "gridcolor": "#506784", - "linecolor": "#506784", - "minorgridcolor": "#506784", - "startlinecolor": "#A2B1C6" - }, - "baxis": { - "endlinecolor": "#A2B1C6", - "gridcolor": "#506784", - "linecolor": "#506784", - "minorgridcolor": "#506784", - "startlinecolor": "#A2B1C6" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "marker": { - "line": { - "color": "#283442" - } - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "line": { - "color": "#283442" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#506784" - }, - "line": { - "color": "rgb(17,17,17)" - } - }, - "header": { - "fill": { - "color": "#2a3f5f" - }, - "line": { - "color": "rgb(17,17,17)" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#f2f5fa", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#f2f5fa" - }, - "geo": { - "bgcolor": "rgb(17,17,17)", - "lakecolor": "rgb(17,17,17)", - "landcolor": "rgb(17,17,17)", - "showlakes": true, - "showland": true, - "subunitcolor": "#506784" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "dark" - }, - "paper_bgcolor": "rgb(17,17,17)", - "plot_bgcolor": "rgb(17,17,17)", - "polar": { - "angularaxis": { - "gridcolor": "#506784", - "linecolor": "#506784", - "ticks": "" - }, - "bgcolor": "rgb(17,17,17)", - "radialaxis": { - "gridcolor": "#506784", - "linecolor": "#506784", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "rgb(17,17,17)", - "gridcolor": "#506784", - "gridwidth": 2, - "linecolor": "#506784", - "showbackground": true, - "ticks": "", - "zerolinecolor": "#C8D4E3" - }, - "yaxis": { - "backgroundcolor": "rgb(17,17,17)", - "gridcolor": "#506784", - "gridwidth": 2, - "linecolor": "#506784", - "showbackground": true, - "ticks": "", - "zerolinecolor": "#C8D4E3" - }, - "zaxis": { - "backgroundcolor": "rgb(17,17,17)", - "gridcolor": "#506784", - "gridwidth": 2, - "linecolor": "#506784", - "showbackground": true, - "ticks": "", - "zerolinecolor": "#C8D4E3" - } - }, - "shapedefaults": { - "line": { - "color": "#f2f5fa" - } - }, - "sliderdefaults": { - "bgcolor": "#C8D4E3", - "bordercolor": "rgb(17,17,17)", - "borderwidth": 1, - "tickwidth": 0 - }, - "ternary": { - "aaxis": { - "gridcolor": "#506784", - "linecolor": "#506784", - "ticks": "" - }, - "baxis": { - "gridcolor": "#506784", - "linecolor": "#506784", - "ticks": "" - }, - "bgcolor": "rgb(17,17,17)", - "caxis": { - "gridcolor": "#506784", - "linecolor": "#506784", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "updatemenudefaults": { - "bgcolor": "#506784", - "borderwidth": 0 - }, - "xaxis": { - "automargin": true, - "gridcolor": "#283442", - "linecolor": "#506784", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "#283442", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "#283442", - "linecolor": "#506784", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "#283442", - "zerolinewidth": 2 - } - } - }, - "xaxis": { - "anchor": "y", - "autorange": true, - "domain": [ - 0, - 1 - ], - "range": [ - 2, - 14 - ], - "title": { - "text": "weight" - }, - "type": "linear" - }, - "yaxis": { - "anchor": "x", - "autorange": true, - "domain": [ - 0, - 1 - ], - "range": [ - 0, - 35.78947368421053 - ], - "title": { - "text": "count" - } - } - } - }, - "image/png": "iVBORw0KGgoAAAANSUhEUgAABREAAAFoCAYAAADAYLwFAAAAAXNSR0IArs4c6QAAIABJREFUeF7t3VGMXNd5H/Djpt08WATqtCmpxEBSV/JbAMlpEARc0mYrIwjAqiUlwoRUqSpAQBCRDaEtwbIhBYKQ1KoES0FlIUEAHwSpVFdYkUpdAkFgOpRMLRQbjW3UbybT2K0MLts+FKD9QrR1cceewXC03Jl77sycc+/57Ru559zznd93ONj9896ZT33mM5/5afBFgAABAgQIECBAgAABAgQIECBAgACBuwh8SojobBAgQIAAAQIECBAgQIAAAQIECBAgsJmAENH5IECAAAECBAgQIECAAAECBAgQIEBgUwEhogNCgAABAgQIECBAgAABAgQIECBAgIAQ0RkgQIAAAQIECBAgQIAAAQIECBAgQCBewJ2I8XZmEiBAgAABAgQIECBAgAABAgQIEChCQIhYRJttkgABAgQIECBAgAABAgQIECBAgEC8gBAx3s5MAgQIECBAgAABAgQIECBAgAABAkUICBGLaLNNEiBAgAABAgQIECBAgAABAgQIEIgXECLG25lJgAABAgQIECBAgAABAgQIECBAoAgBIWIRbbZJAgQIECBAgAABAgQIECBAgAABAvECQsR4OzMJECBAgAABAgQIECBAgAABAgQIFCEgRCyizTZJgAABAgQIECBAgAABAgQIECBAIF5AiBhvZyYBAgQIECBAgAABAgQIECBAgACBIgSEiEW02SYJECBAgAABAgQIECBAgAABAgQIxAsIEePtzCRAgAABAgQIECBAgAABAgQIECBQhIAQsYg22yQBAgQIECBAgAABAgQIECBAgACBeAEhYrydmQQIECBAgAABAgQIECBAgAABAgSKEBAiFtFmmyRAgAABAgQIECBAgAABAgQIECAQLyBEjLczkwABAgQIECBAgAABAgQIECBAgEARAkLEItpskwQIECBAgAABAgQIECBAgAABAgTiBYSI8XZmEiBAgAABAgQIECBAgAABAgQIEChCQIhYRJttkgABAgQIECBAgAABAgQIECBAgEC8gBAx3s5MAgQIECBAgAABAgQIECBAgAABAkUICBGLaLNNEiBAgAABAgQIECBAgAABAgQIEIgXECLG25lJgAABAgQIECBAgAABAgQIECBAoAgBIWIRbbZJAgQIECBAgAABAgQIECBAgAABAvECQsR4OzMJECBAgAABAgQIECBAgAABAgQIFCEgRCyizTZJgAABAgQIECBAgAABAgQIECBAIF5AiBhvZyYBAgQIECBAgAABAgQIECBAgACBIgSEiEW02SYJECBAgAABAgQIECBAgAABAgQIxAsIEePtzCRAgAABAgQIECBAgAABAgQIECBQhIAQsYg22yQBAgQIECBAgAABAgQIECBAgACBeAEhYrydmQQIECBAgAABAgQIECBAgAABAgSKEBAiFtFmmyRAgAABAgQIECBAgAABAgQIECAQLyBEjLczkwABAgQIECBAgAABAgQIECBAgEARAkLEItpskwQIECBAgAABAgQIECBAgAABAgTiBYSI8XZmEiBAgAABAgQIECBAgAABAgQIEChCQIhYRJttkgABAgQIECBAgAABAgQIECBAgEC8gBAx3s5MAgQIECBAgAABAgQIECBAgAABAkUICBGLaLNNEiBAgAABAgQIECBAgAABAgQIEIgXECLG25lJgAABAgQIECBAgAABAgQIECBAoAgBIWIRbbZJAgQIECBAgAABAgQIECBAgAABAvECQsR4OzMJECBAgAABAgQIECBAgAABAgQIFCEgRCyizTZJgAABAgQIECBAgAABAgQIECBAIF5AiBhvZyYBAgQIECBAgAABAgQIECBAgACBIgSEiEW02SYJECBAgAABAgQIECBAgAABAgQIxAsIEePtzCRAgAABAgQIECBAgAABAgQIECBQhIAQsYg22yQBAgQIECBAgAABAgQIECBAgACBeAEhYrydmQQIECBAgAABAgQIECBAgAABAgSKEBAiFtFmmyRAgAABAgQIECBAgAABAgQIECAQLyBEjLczkwABAgQIECBAgAABAgQIECBAgEARAkLEItpskwQIECBAgAABAgQIECBAgAABAgTiBYSI8XZmEiBAgAABAgQIECBAgAABAgQIEChCQIhYRJttkgABAgQIECBAgAABAgQIECBAgEC8gBAx3s5MAgQIECBAgAABAgQIECBAgAABAkUICBGLaLNNEiBAgAABAgQIECBAgAABAgQIEIgXECLG25lJgAABAgQIECBAgAABAgQIECBAoAgBIWIRbbZJAgQIECBAgAABAgQIECBAgAABAvECQsR4OzMJECBAgAABAgQIECBAgAABAgQIFCEgRCyizTZJgAABAgQIECBAgAABAgQIECBAIF5AiBhvZyYBAgQIECBAgAABAgQIECBAgACBIgSEiEW02SYJECBAgAABAgQIECBAgAABAgQIxAsIEePtzCRAgAABAgQIECBAgAABAgQIECBQhIAQsYg22yQBAgQIECBAgAABAgQIECBAgACBeAEhYrydmQQIECBAgAABAgQIECBAgAABAgSKEBAiFtFmmyRAgAABAgQIECBAgAABAgQIECAQLyBEjLczkwABAgQIECBAgAABAgQIECBAgEARAkLEItpskwQIECBAgAABAgQIECBAgAABAgTiBYSI8XZmEiBAgAABAgQIECBAgAABAgQIEChCQIhYRJttkgABAgQIECBAgAABAgQIECBAgEC8gBAx3s5MAgQIECBAYMYCe5+4OeMVXH4jgYtvbQVDgAABAgQIECBA4A4BIaIDQYAAAQIECGQrIERM0xohYhp3qxIgQIAAAQIEchYQIubcHbURIECAAIHCBYSIaQ6AEDGNu1UJECBAgAABAjkLCBFz7o7aCBAgQIBA4QJCxDQHQIiYxt2qBAgQIECAAIGcBYSIOXdHbQQIECBAoHABIWKaAyBETONuVQIECBAgQIBAzgJCxJy7ozYCBAgQIFC4gBAxzQEQIqZxtyoBAgQIECBAIGcBIWLO3VEbAQIECBAoXECImOYACBHTuFuVAAECBAgQIJCzgBAx5+6ojQABAgQIFC4gRExzAISIadytSoAAAQIECBDIWUCImHN31EaAAAECBAoXECKmOQBCxDTuViVAgAABAgQI5CwgRMy5O2ojQIAAAQKFCwgR0xwAIWIad6sSIECAAAECBHIWECLm3B21ESBAgACBwgWEiGkOgBAxjbtVCRAgQIAAAQI5CwgRc+6O2ggQIECAQOECQsQ0B0CImMbdqgQIECBAgACBnAWEiDl3R20ECBAgQKBwASFimgMgREzjblUCBAgQIECAQM4CQsScu6M2AgQIECBQuIAQMc0BECKmcbcqAQIECBAgQCBnASFizt1RGwECBAgQKFxAiJjmAAgR07hblQABAgQIECCQs4AQMefuqI0AAQIECBQuIERMcwCEiGncrUqAAAECBAgQyFlAiJhzd9RGgAABAgQKFxAipjkAQsQ07lYlQIAAAQIECOQsIETMuTtqI0CAAAEChQsIEdMcACFiGner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BAgQIECAQHECQsTiWm7DBAgQIECAAIHpCJw6/XLYvfvhcPzY0XDxwup0LuoqBAgQIECAAAECWQoIEbNsi6IIECBAgAABAvMV2L59Rzjzytlw69at8NCuHRMtPkmIeH5lNdx33/1h+dBSWFu7OtF1DSJAgAABAgQIEMhPQIiYX09URIAAAQIECBBohYAQsRVtUiQBAgQIECBAYCoCQsSpMLoIAQIECBAgQGC+Ansf2RdeePGl8J3vfjs8vn9fb/HRu/6WDx8JBw48Hc6dez2cOX0q9Od8+p57euPX128M7hDs34l4/fq1wfWqMZevXA333//5Ozb3zsrb4cjhZ0M/RLx06athz95Hw8LCQm/c8Pe/sv+xO+Z++OE37rj+fNWsRoAAAQIECBAgECsgRIyVM48AAQIECBAgkFigCviqr+rx434I+Eu/9DfCa6+e7YWGVcj3xS/t6gWFW7dt64WOVeBXBYD9gHDLli2971df1ePMwyFidf3+96tHkfshZP8a1fWrkHA4jKyCzAcf+MLgfRI9zpz4kFieAAECBAgQIDAlASHilCBdhgABAgQIECAwb4HhgO63f+d3wp49j/ZK+G///Ye9u/2GQ8Zq7Nat2+54v8PhOxW/+dFHd4SIo3cxVtfdKEQc/WCV0XlCxHmfCusRIECAAAECBGYjIEScjaurEiBAgAABAgRmLjAc2P3m3/2t3no/+vjj3t2H//pfvRj++b84Fj54/0rvzsONHkuuxt++fbt35+JoiLjR+x0KEWfeUgsQIECAAAECBLIVECJm2xqFESBAgAABAgQ2F+iHel//+uXwwAMPhvfeezf84C//shcervyH8+HJf/JPw1tvvtF7tHn4rsSNrjr6nojDj0L3P1VZiOhEEiBAgAABAgTKFRAiltt7OydAgAABAgQ6IFCFg7+48Ivhni33hOdPngg319d7jyXfunXrjvczHPdY8UYh4uijyjEh4kZhZAfYbYEAAQIECBAgUJyAELG4ltswAQIECBAg0CWBKhxcXNwZrl37/uD9Djf6u+rR52cOLoUf/vAHg3FVcHjyhX8ZXv13/3YQPvY/WOVun/5crTX66czHjx0NFy+s9lhH3xOxChGrT27uf9hLl+zthQABAgQIECBQkoAQsaRu2ysBAgQIECDQOYF+OPjexXcHn7q80d9VG+8Hg5++556BQz98HL0TcaPx3/vefwmf+9ufG3zC80bvm7jRB7IMvx/jhx9+o/ehL74IECBAgAABAgTaJSBEbFe/VEuAAAECBAgQSCZQhZDPnTg5eJ/FZIVYmAABAgQIECBAYO4CQsS5k1uQAAECBAgQINAOgUt//LXwp1//Wu+DWaqvce+r2I5dqZIAAQIECBAgQCBGQIgYo2YOAQIECBAgQKAAgeHHkKvtrq/fCMuHlkL/05oLILBFAgQIECBAgACBnwsIER0FAgQIECBAgAABAgQIECBAgAABAgQ2FRAiOiAECBAgQIAAAQIECBAgQIAAAQIECAgRnQECBAgQIECAAAECBAgQIECAAAECBOIF3IkYb2cmAQIECBAgQIAAAQIECBAgQIAAgSIEhIhFtNkmCRAgQIAAAQIECBAgQIAAAQIECMQLCBHj7cwkQIAAAQIECBAgQIAAAQIECBAgUISAELGINtskAQIECBAgQIAAAQIECBAgQIAAgXgBIWK8nZkECBAgQIAAAQIECBAgQIAAAQIEihAQIhbRZpskQIAAAQIECBAgQIAAAQIECBAgEC8gRIy3M5MAAQIECBAgQIAAAQIECBAgQIBAEQJCxCLabJMECBAgQIAAAQIECBAgQIAAAQIE4gWEiPF2ZhIgQIAAAQIECBAgQIAAAQIECBAoQkCIWESbbZIAAQIECBAgQIAAAQIECBAgQIBAvIAQMd7OTAIECBAgQIAAAQIECBAgQIAAAQJFCAgRi2izTRIgQIAAAQIECBAgQIAAAQIECBCIFxAixtuZSYAAAQIECBAgQIAAAQIECBAgQKAIASFiEW22SQIECBAgQIAAAQIECBAgQIAAAQLxAkLEeDszCRAgQIAAAQIECBAgQIAAAQIECBQhIEQsos02SYAAAQIECBAgQIAAAQIECBAgQCBeQIgYb2cmAQIECBAgQIAAAQIECBAgQIAAgSIEhIhFtNkmCRAgQIAAAQIECBAgQIAAAQIECMQLCBHj7cwkQIAAAQIECBAgQIAAAQIECBAgUISAELGINtskAQIECBAgQIAAAQIECBAgQIAAgXgBIWK8nZkECBAgQIAAAQIECBAgQIAAAQIEihAQIhbRZpskQIAAAQIECBAgQIAAAQIECBAgEC8gRIy3M5MAAQIECBAgQIAAAQIECBAgQIBAEQJCxCLabJMECBAgQIAAAQIECBAgQIAAAQIE4gWEiPF2ZhIgQIAAAQIECBAgQIAAAQIECBAoQkCIWESbbZIAAQIECBAgQIAAAQIECBAgQIBAvIAQMd7OTAIECBAgQIAAAQIECBAgQIAAAQJFCAgRi2izTRIgQIAAAQIECBAgQIAAAQIECBCIFxAixtuZSYAAAQIECBAgQIAAAQIECBAgQKAIASFiEW22SQIECBAgQIAAAQIECBAgQIAAAQLxAkLEeDszCRAgQIAAAQIECBAgQIAAAQIECBQhIEQsos02SYAAAQIECBAgQIAAAQIECBAgQCBeQIgYb2cmAQIECBAgQIAAAQIECBAgQIAAgSIE/j9EYERtdBJ0YgAAAABJRU5ErkJggg==", - "text/html": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "weight=%{x}
max_stress=%{y}", - "legendgroup": "", - "marker": { - "color": "#636efa", - "symbol": "circle" - }, - "mode": "markers", - "name": "", - "orientation": "v", - "showlegend": false, - "type": "scatter", - "x": [ - 9.76657508, - 8.56657979, - 8.66197345, - 6.69647363, - 8.63906276, - 7.75939879, - 4.84080744, - 5.70625179, - 10.40788634, - 4.13213835, - 10.85116767, - 12.36302635, - 6.5426365, - 6.07444705, - 8.63858024, - 5.70113438, - 4.78143412, - 7.70776608, - 7.04969484, - 8.97729346, - 7.94196092, - 6.64865507, - 8.43289057, - 7.47878262, - 5.01002164, - 6.15924617, - 4.59574812, - 3.68563721, - 5.65507397, - 9.87722159, - 7.42712888, - 9.71474677, - 4.85593001, - 8.35031777, - 6.17954994, - 9.10963196, - 6.88834922, - 5.77229055, - 9.2492708, - 7.9365736, - 2.95322204, - 5.29243576, - 7.86761086, - 10.57908583, - 8.23325802, - 8.2014482, - 12.17403906, - 12.00206412, - 4.80209306, - 8.25199413, - 7.69925619, - 10.19750982, - 9.95271341, - 2.51164081, - 6.33563192, - 7.29637438, - 3.18141767, - 6.6716512, - 8.23994296, - 3.76364708, - 9.61258736, - 10.47767531, - 10.2761224, - 5.92336281, - 9.54364697, - 5.14088519, - 8.4861294, - 8.53210113, - 8.6578462, - 11.31528326, - 11.02356351, - 5.13737409, - 6.64893147, - 7.41745504, - 8.3396673, - 7.57153224, - 3.90813435, - 6.12254513, - 5.75030263, - 7.1266902, - 8.48763652, - 3.45911015, - 3.96706005, - 6.49881408, - 6.59184151, - 5.79636945, - 3.22215761, - 4.53329364, - 7.1142825, - 7.03493698, - 7.35892468, - 6.52528417, - 3.18014946, - 10.29159368, - 7.9684108, - 8.43736408, - 6.1624461, - 8.18859993, - 6.16964548, - 13.25033243, - 7.05984056, - 8.5009233, - 8.7500706, - 7.72074364, - 10.1416817, - 6.64427625, - 5.88626187, - 7.09721842, - 8.61957344, - 10.48237788, - 5.5629953, - 7.67843288, - 7.68703239, - 5.50233832, - 4.45688547, - 3.70683683, - 8.53466669, - 4.86790123, - 9.23726344, - 7.34686388, - 8.53839367, - 5.62331435, - 5.41720569, - 10.50488422, - 5.33984548, - 9.19473103, - 4.3771988, - 5.33431898, - 6.27255886, - 5.78530425, - 3.6185746, - 11.13215852, - 5.69640154, - 10.98402301, - 5.50161262, - 6.3108099, - 5.25394228, - 5.72998505, - 4.69736372, - 7.66503418, - 7.31731731, - 8.49987771, - 4.64112749, - 8.89262564, - 7.61886156, - 5.68652237, - 7.70621775, - 8.41436133, - 7.42913082, - 6.38445081, - 6.28658436, - 3.98723467, - 5.58891705, - 4.18531967, - 3.5842174, - 6.32929774, - 5.30586097, - 3.9997267, - 6.977546, - 7.98364975, - 4.63754786, - 7.03690577, - 6.92642357, - 11.1920442, - 11.84308323, - 9.1246867, - 9.28684451, - 7.9244532, - 7.74634042, - 5.7252392, - 6.68237933, - 7.38727086, - 11.36606564, - 10.92263108, - 9.04596043, - 9.53640801, - 7.20281653, - 8.45800739, - 8.1973408, - 10.89259692, - 6.29891688, - 4.64664884, - 3.67163337, - 8.74042557, - 5.72894109, - 10.01994782, - 9.31596677 - ], - "xaxis": "x", - "y": [ - 281.12317878, - 220.00608147, - 235.54514709, - 360.19539158, - 280.13411394, - 248.35300749, - 452.1490342, - 997.91116863, - 187.17274739, - 1016.43578925, - 203.36922013, - 150.4366771, - 275.26915195, - 462.28366794, - 259.53245106, - 431.83769364, - 420.04944477, - 278.65664154, - 504.80732411, - 463.7414856, - 249.11133475, - 361.02807478, - 285.40419977, - 267.58795057, - 484.53098351, - 411.90269249, - 547.81146792, - 785.77633134, - 354.47395718, - 162.5209617, - 302.03361182, - 244.16757202, - 533.41162493, - 374.35743763, - 572.97351074, - 236.42478943, - 490.62124431, - 786.43529093, - 405.58168774, - 320.56271561, - 1264.72568059, - 485.93968546, - 419.57724136, - 161.64251628, - 197.86607782, - 265.47898697, - 192.34692703, - 126.14662933, - 402.36053467, - 234.20761454, - 341.22536191, - 130.38529968, - 225.61631176, - 1560.7598594, - 341.37031374, - 401.30586022, - 1281.3852511, - 411.03845383, - 292.45185674, - 871.79661104, - 208.66664357, - 116.32260895, - 132.85457398, - 592.35138866, - 501.36651702, - 613.69598378, - 424.57785958, - 211.67041375, - 219.76026286, - 129.73263601, - 300.44789294, - 645.58309219, - 214.97919261, - 468.46212711, - 334.91764475, - 417.57052612, - 599.45933379, - 285.66346387, - 585.28900037, - 181.58709879, - 219.58886828, - 788.40491821, - 963.87163386, - 478.35443115, - 265.52318471, - 796.3388533, - 1507.79866701, - 807.20703464, - 286.55103877, - 353.53511426, - 253.10704218, - 429.86469784, - 1085.02061321, - 203.82207348, - 190.89226543, - 631.62182617, - 355.9193007, - 235.65842253, - 295.44067336, - 124.89218016, - 215.47488831, - 199.92252441, - 228.11931403, - 366.28912354, - 315.33392873, - 360.29170069, - 270.87986337, - 298.98876336, - 288.64573743, - 216.83002352, - 617.32758551, - 191.26427455, - 224.92240325, - 504.07906807, - 500.65527819, - 972.2393428, - 183.15201448, - 789.18267548, - 224.13594055, - 449.86820004, - 456.17843556, - 653.12618142, - 479.42583423, - 287.95389174, - 404.56388693, - 420.12223226, - 702.1326759, - 438.6185449, - 389.50116814, - 366.15201171, - 783.46005354, - 159.60997318, - 379.19924302, - 208.3782752, - 651.02235459, - 243.46254943, - 877.18414307, - 579.53817856, - 413.97244739, - 316.82280219, - 311.00691714, - 244.97330672, - 623.47907164, - 194.49865553, - 214.9149657, - 924.89508534, - 287.40368014, - 255.1209633, - 455.34954215, - 375.05221093, - 217.28548472, - 871.68445315, - 537.22456607, - 776.22077057, - 890.63612502, - 636.04439856, - 491.91208959, - 416.65054393, - 268.41768399, - 233.45554479, - 530.49067444, - 290.79122981, - 233.51155255, - 117.77681864, - 170.60606384, - 313.1460815, - 152.72761004, - 255.25708061, - 305.12405754, - 337.31262811, - 239.19112397, - 288.41101074, - 125.3825717, - 128.02492289, - 202.73990192, - 193.60554203, - 216.78724421, - 231.47456138, - 208.58769933, - 559.66352907, - 293.09666514, - 1060.45186872, - 874.49581493, - 388.37952553, - 886.08009498, - 155.55509949, - 164.32139904 - ], - "yaxis": "y" - } - ], - "layout": { - "autosize": true, - "legend": { - "tracegroupgap": 0 - }, - "margin": { - "t": 60 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#f2f5fa" - }, - "error_y": { - "color": "#f2f5fa" - }, - "marker": { - "line": { - "color": "rgb(17,17,17)", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "rgb(17,17,17)", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#A2B1C6", - "gridcolor": "#506784", - "linecolor": "#506784", - "minorgridcolor": "#506784", - "startlinecolor": "#A2B1C6" - }, - "baxis": { - "endlinecolor": "#A2B1C6", - "gridcolor": "#506784", - "linecolor": "#506784", - "minorgridcolor": "#506784", - "startlinecolor": "#A2B1C6" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "marker": { - "line": { - "color": "#283442" - } - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "line": { - "color": "#283442" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#506784" - }, - "line": { - "color": "rgb(17,17,17)" - } - }, - "header": { - "fill": { - "color": "#2a3f5f" - }, - "line": { - "color": "rgb(17,17,17)" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#f2f5fa", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#f2f5fa" - }, - "geo": { - "bgcolor": "rgb(17,17,17)", - "lakecolor": "rgb(17,17,17)", - "landcolor": "rgb(17,17,17)", - "showlakes": true, - "showland": true, - "subunitcolor": "#506784" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "dark" - }, - "paper_bgcolor": "rgb(17,17,17)", - "plot_bgcolor": "rgb(17,17,17)", - "polar": { - "angularaxis": { - "gridcolor": "#506784", - "linecolor": "#506784", - "ticks": "" - }, - "bgcolor": "rgb(17,17,17)", - "radialaxis": { - "gridcolor": "#506784", - "linecolor": "#506784", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "rgb(17,17,17)", - "gridcolor": "#506784", - "gridwidth": 2, - "linecolor": "#506784", - "showbackground": true, - "ticks": "", - "zerolinecolor": "#C8D4E3" - }, - "yaxis": { - "backgroundcolor": "rgb(17,17,17)", - "gridcolor": "#506784", - "gridwidth": 2, - "linecolor": "#506784", - "showbackground": true, - "ticks": "", - "zerolinecolor": "#C8D4E3" - }, - "zaxis": { - "backgroundcolor": "rgb(17,17,17)", - "gridcolor": "#506784", - "gridwidth": 2, - "linecolor": "#506784", - "showbackground": true, - "ticks": "", - "zerolinecolor": "#C8D4E3" - } - }, - "shapedefaults": { - "line": { - "color": "#f2f5fa" - } - }, - "sliderdefaults": { - "bgcolor": "#C8D4E3", - "bordercolor": "rgb(17,17,17)", - "borderwidth": 1, - "tickwidth": 0 - }, - "ternary": { - "aaxis": { - "gridcolor": "#506784", - "linecolor": "#506784", - "ticks": "" - }, - "baxis": { - "gridcolor": "#506784", - "linecolor": "#506784", - "ticks": "" - }, - "bgcolor": "rgb(17,17,17)", - "caxis": { - "gridcolor": "#506784", - "linecolor": "#506784", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "updatemenudefaults": { - "bgcolor": "#506784", - "borderwidth": 0 - }, - "xaxis": { - "automargin": true, - "gridcolor": "#283442", - "linecolor": "#506784", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "#283442", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "#283442", - "linecolor": "#506784", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "#283442", - "zerolinewidth": 2 - } - } - }, - "xaxis": { - "anchor": "y", - "autorange": true, - "domain": [ - 0, - 1 - ], - "range": [ - 1.8709982502717069, - 13.890974989728294 - ], - "title": { - "text": "weight" - }, - "type": "linear" - }, - "yaxis": { - "anchor": "x", - "autorange": true, - "domain": [ - 0, - 1 - ], - "range": [ - 4.482979321981617, - 1672.5994890280185 - ], - "title": { - "text": "max_stress" - }, - "type": "linear" - } - } - }, - "image/png": "iVBORw0KGgoAAAANSUhEUgAABREAAAFoCAYAAADAYLwFAAAAAXNSR0IArs4c6QAAIABJREFUeF7s3Ql4FtXd9/F/9kASIOz7GkAE2fd9U1QQlxbXan1bW2ufWqu11qdqrVVbq9altlpb28dqVdw3REGRfZVNdghbWAMhLCEhkPW9zo2JuTMJubc5c+ae71zvez0aZs75n89/4Co/Z+bEpKenlwsHAggggAACCCCAAAIIIIAAAggggAACCCBQi0AMISL3BgIIIIAAAggggAACCCCAAAIIIIAAAgicS4AQkfsDAQQQQAABBBBAAAEEEEAAAQQQQAABBM4pQIjIDYIAAggggAACCCCAAAIIIIAAAggggAAChIjcAwgggAACCCCAAAIIIIAAAggggAACCCAQugBPIoZux5UIIIAAAggggAACCCCAAAIIIIAAAgh4QoAQ0RNtZpEIIIAAAggggAACCCCAAAIIIIAAAgiELkCIGLodVyKAAAIIIIAAAggggAACCCCAAAIIIOAJAUJET7SZRSKAAAIIIIAAAggggAACCCCAAAIIIBC6ACFi6HZciQACCCCAAAIIIIAAAggggAACCCCAgCcECBE90WYWiQACCCCAAAIIIIAAAggggAACCCCAQOgChIih23ElAggggAACCCCAAAIIIIAAAggggAACnhAgRPREm1kkAggggAACCCCAAAIIIIAAAggggAACoQsQIoZux5UIIIAAAggggAACCCCAAAIIIIAAAgh4QoAQ0RNtZpEIIIAAAggggAACCCCAAAIIIIAAAgiELkCIGLodVyKAAAIIIIAAAggggAACCCCAAAIIIOAJAUJET7SZRSKAAAIIIIAAAggggAACCCCAAAIIIBC6ACFi6HZciQACCCCAAAIIIIAAAggggAACCCCAgCcECBE90WYWiQACCCCAAAIIIIAAAggggAACCCCAQOgChIih23ElAggggAACCCCAAAIIIIAAAggggAACnhAgRPREm1kkAggggAACCCCAAAIIIIAAAggggAACoQsQIoZux5UIIIAAAggggAACCCCAAAIIIIAAAgh4QoAQ0RNtZpEIIIAAAggggAACCCCAAAIIIIAAAgiELkCIGLodVyKAAAIIIIAAAggggAACCCCAAAIIIOAJAUJET7SZRSKAAAIIIIAAAggggAACCCCAAAIIIBC6ACFi6HZciQACCCCAAAIIIIAAAggggAACCCCAgCcECBE90WYWiQACCCCAAAIIIIAAAggggAACCCCAQOgChIih23ElAggggAACCCCAAAIIIIAAAggggAACnhAgRPREm1kkAggggAACCCCAAAIIIIAAAggggAACoQsQIoZux5UIIIAAAggggAACCCCAAAIIIIAAAgh4QoAQ0RNtZpEIIIAAAggggAACCCCAAAIIIIAAAgiELkCIGLodVyKAAAIIIIAAAggggAACCCCAAAIIIOAJAUJET7SZRSKAAAIIIIAAAggggAACCCCAAAIIIBC6ACFi6HZciQACCCCAAAIIIIAAAggggAACCCCAgCcECBE90WYWiQACCCCAAAIIIIAAAggggAACCCCAQOgChIih23ElAggggAACCCCAAAIIIIAAAggggAACnhAgRPREm1kkAggggAACCCCAAAIIIIAAAggggAACoQsQIoZux5UIIIAAAggggAACCCCAAAIIIIAAAgh4QoAQ0RNtZpEIIIAAAggggAACCCCAAAIIIIAAAgiELkCIGLodVyKAAAIIIIAAAggggAACCCCAAAIIIOAJAUJET7SZRSKAAAIIIIAAAggggAACCCCAAAIIIBC6ACFi6HZciQACCCCAAAIIIIAAAggggAACCCCAgCcECBE90WYWiQACCCCAAAIIIIAAAggggAACCCCAQOgChIih23ElAggggAACCCCAAAIIIIAAAggggAACnhAgRPREm1kkAggggAACCCCAAAIIIIAAAggggAACoQsQIoZux5UIIIAAAggggAACCCCAAAIIIIAAAgh4QoAQ0RNtZpEIIIAAAggggAACCCCAAAIIIIAAAgiELkCIGLodVyKAAAIIIIAAAggggAACCCCAAAIIIOAJAUJET7SZRSKAAAIIIIAAAggggAACCCCAAAIIIBC6ACFi6HZciQACCCCAAAIIIIAAAggggAACCCCAgCcECBE90WYWiQACCCCAAAIIIIAAAggggAACCCCAQOgChIih23ElAggggAACCCCAAAIIIIAAAggggAACnhAgRPREm1kkAggggAACCCCAAAIIIIAAAggggAACoQsQIoZux5UIIIAAAggggAACCCCAAAIIIIAAAgh4QoAQ0RNtZpEIIIAAAggggAACCCCAAAIIIIAAAgiELkCIGLodVyKAAAIIIIAA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AAIIIIAAAggggECpECBELBXLzEMigAACCCCAAAIIIIAAAggggAACCCDgXIAQ0bkddyKAAAIIIIAAAggggAACCCCAAAIIIFAqBAgRS8Uy85AIIIAAAggggAACCCCAAAIIIIAAAgg4FyBEdG7HnQgggAACCCCAAAIIIIAAAggggAACCJQKAULEUrHMPCQCCCCAAAIIIIAAAggggAACCCCAAALOBQgRndtxJwIIIIAAAggggAACCCCAAAIIIIAAAqVCgBCxVCwzD4kAAggggAACCCCAAAIIIIAAAggggIBzAUJE53bciQACCCCAAAIIIIAAAggggAACCCCAQKkQIEQsFcvMQyKAAAIIIIAAAggggAACCCCAAAIIIOBcgBDRuR13IoAAAggggAACCCCAAAIIIIAAAgggUCoECBFLxTLzkAgggAACCCCAAAIIIIAAAggggAACCDgXIER0bsedCCCAAAIIIIAAAggggAACCCCAAAIIlAoBQsRSscw8JAIIIIAAAggggAACCCCAAAIIIIAAAs4FCBGd23EnAggggAACCCCAAAIIIIAAAggggAACpUKAELFULDMPiQACCCCAAAIIIIAAAggggAACCCCAgHMBQkTndtyJAAIIIIAAAggggAACCCCAAAIIIIBAqRAgRCwVy8xDIoAAAggggAACCCCAAAIIIIAAAggg4FyAENG5HXcigAACCCCAAAIIIIAAAggggAACCCBQKgQIEUvFMvOQCCCAAAIIIIAAAggggAACCCCAAAIIOBcgRHRux50IIIAAAggggAACCCCAAAIIIIAAAgiUCgFCxFKxzDwkAggggAACCCCAAAIIIIAAAggggAACzgUIEZ3bcScCCCCAAAIIIIAAAggggAACCCCAAAKlQoAQsVQsMw+JAAIIIIAAAggggAACCCCAAAIIIICAcwFCROd23IkAAggggAACCCCAAAIIIIAAAggggECpECBELBXLzEMigAACCCCAAAIIIIAAAggggAACCCDgXIAQ0bkddyKAAAIIIIAAAggggAACCCCAAAIIIFAqBP4/qRdcah9vE5kAAAAASUVORK5CYII=", - "text/html": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import plotly.express as px\n", - "fig1 = px.histogram(df, x=\"weight\", nbins=20, template=\"plotly_dark\")\n", - "fig1.show()\n", - "fig2 = px.scatter(df, x='weight', y='max_stress', template=\"plotly_dark\")\n", - "fig2.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9208908a-91b0-4eb7-92af-465abd89692c", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/examples/python_two_bar_truss_problem/python_two_bar_truss.ipynb b/examples/python_two_bar_truss_problem/python_two_bar_truss.ipynb deleted file mode 100644 index 4739c1e56..000000000 --- a/examples/python_two_bar_truss_problem/python_two_bar_truss.ipynb +++ /dev/null @@ -1,2501 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "eea9d0bd-09a8-4ce3-8f31-a5f0addca1b4", - "metadata": { - "tags": [] - }, - "source": [ - "# DCS Parametric Python Truss Example\n", - "Example of Python project implementing the Two-Bar Truss example from R.L. Fox, Optimization Methods in Engineering Design, Addison Wesley, 1971 See e.g. https://static1.squarespace.com/static/53eacd17e4b0588f78eb723c/t/586ea636d482e91c7a76bd61/1483646550748/Optimization+Methods+in+Engineering+Design.pdf " - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "3ef57e28-30ad-4a8b-809d-77b1ce80c0fb", - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import random\n", - "import sys\n", - "import time\n", - "\n", - "from ansys.hps.client import REPError\n", - "from ansys.hps.client.jms import (Client, JobDefinition, Job, File,\n", - " FitnessDefinition, Project)" - ] - }, - { - "cell_type": "markdown", - "id": "9b6836c9-432c-4e9f-92d9-c55ea59246cd", - "metadata": {}, - "source": [ - "### Connect to DCS Services" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "392b2aac-ba4b-49e0-b18c-bff662bc46ab", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "https://ec2-18-185-40-216.eu-central-1.compute.amazonaws.com/dcs\n" - ] - } - ], - "source": [ - "client = Client(rep_url=\"https://ec2-18-185-40-216.eu-central-1.compute.amazonaws.com/dcs\", username=\"demo\", password=\"tnz\")\n", - "print(client.rep_url)" - ] - }, - { - "cell_type": "markdown", - "id": "e6dffb0d-1e8a-4899-a050-ac5b0db51df7", - "metadata": {}, - "source": [ - "### Create DCS project" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "8b58614d-f525-4fba-acd1-67cdbf26d2ef", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Project created: two_bar_truss_problem\n" - ] - } - ], - "source": [ - "# Create project\n", - "proj = Project(id=\"two_bar_truss_problem\", display_name=\"Two-bar Truss Problem\", priority=1, active=True)\n", - "proj = client.create_project(proj, replace=True)\n", - "print(f\"Project created: {proj.id}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "ed217962-2030-4f0c-89f7-b5435906f889", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Files created: [1, 2, 3]\n" - ] - } - ], - "source": [ - "# Define Files\n", - "files=[] \n", - "files.append (File( name=\"input_params\",evaluation_path=\"input_parameters.json\",\n", - " type=\"text/plain\", src=\"input_parameters.json\" ) )\n", - "files.append (File( name=\"pyscript\",evaluation_path=\"evaluate.py\",\n", - " type=\"text/plain\", src=\"evaluate.py\" ) )\n", - "files.append( File( name=\"results\", evaluation_path=\"output_parameters.json\", type=\"text/plain\", collect=True ) )\n", - "\n", - "files = proj.create_files(files)\n", - "print(f\"Files created: {[f.id for f in files]}\")\n", - "\n", - "input_file=files[0]\n", - "result_file=files[2]" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "ad708363-e8b2-459e-b004-b2be209a2db0", - "metadata": {}, - "outputs": [], - "source": [ - "# JobDefinition with simulation workflow and parameters\n", - "job_def = JobDefinition(name=\"job_definition.1\", active=True, )\n", - "\n", - "# Input params\n", - "pd = job_def.add_float_parameter_definition(name='height', lower_limit=10, upper_limit=100.0, default=30, units=\"in\" )\n", - "job_def.add_parameter_mapping(key_string='\"H\"', tokenizer=\":\", parameter_definition_name=pd.name, file_id=input_file.id)\n", - "\n", - "pd = job_def.add_float_parameter_definition(name='diameter', lower_limit=0.2, upper_limit=5, default=3, units=\"in\" )\n", - "job_def.add_parameter_mapping(key_string='\"d\"', tokenizer=\":\", parameter_definition_name=pd.name, file_id=input_file.id)\n", - "\n", - "pd = job_def.add_float_parameter_definition(name='thickness', lower_limit=0.03, upper_limit=0.6, default=0.15, units=\"in\")\n", - "job_def.add_parameter_mapping(key_string='\"t\"', tokenizer=\":\", parameter_definition_name=pd.name, file_id=input_file.id)\n", - "\n", - "pd = job_def.add_float_parameter_definition(name='separation_distance', lower_limit=40, upper_limit=150, default=60, units=\"in\" )\n", - "job_def.add_parameter_mapping(key_string='\"B\"', tokenizer=\":\", parameter_definition_name=pd.name, file_id=input_file.id)\n", - "\n", - "pd = job_def.add_float_parameter_definition(name='young_modulus', lower_limit=1E+6, upper_limit=1E+8, default=3E+7, units=\"lbs in^-2\" )\n", - "job_def.add_parameter_mapping(key_string='\"E\"', tokenizer=\":\", parameter_definition_name=pd.name, file_id=input_file.id)\n", - "\n", - "pd = job_def.add_float_parameter_definition(name='density', lower_limit=0.1, upper_limit=0.6, default=0.3, units=\"lbs in^-2\" )\n", - "job_def.add_parameter_mapping(key_string='\"rho\"', tokenizer=\":\", parameter_definition_name=pd.name, file_id=input_file.id)\n", - "\n", - "pd = job_def.add_float_parameter_definition(name='load', lower_limit=1E+1, upper_limit=1E+5, default=66E+3, units=\"lbs\" )\n", - "job_def.add_parameter_mapping(key_string='\"P\"', tokenizer=\":\", parameter_definition_name=pd.name, file_id=input_file.id)\n", - "\n", - "out_params = {\"weight\":\"lbs\", \"stress\":\"ksi\", \"buckling_stress\":\"ksi\", \"deflection\":\"in\"}\n", - "for pname, unit in out_params.items():\n", - " pd = job_def.add_float_parameter_definition(name=pname, units=unit)\n", - " job_def.add_parameter_mapping(key_string=f'\"{pname}\"', tokenizer=\":\", parameter_definition_name=pd.name, file_id=result_file.id)\n", - "\n", - "# Process step\n", - "job_def.add_task_definition( name=\"python_evaluation\", \n", - " application_name=\"Python\",\n", - " application_version=\"3.6\",\n", - " execution_command='%executable% %file:pyscript% %file:input_params%',\n", - " max_execution_time=30.0,\n", - " cpu_core_usage=0.5,\n", - " execution_level=0,\n", - " memory=100,\n", - " disk_space=5,\n", - " input_file_ids=[f.id for f in files[:2]], \n", - " output_file_ids=[f.id for f in files[2:]] \n", - " )\n", - "\n", - "# Fitness definition\n", - "fd = FitnessDefinition(error_fitness=10.0)\n", - "fd.add_fitness_term(name=\"weight\", type=\"design_objective\", weighting_factor=1.0,\n", - " expression=\"map_design_objective( values['weight'], 35, 20)\")\n", - "fd.add_fitness_term(name=\"max_stress\", type=\"limit_constraint\", weighting_factor=1.0,\n", - " expression=\"map_limit_constraint( values['stress'], 85, 10 )\") \n", - "fd.add_fitness_term(name=\"max_deflection\", type=\"limit_constraint\", weighting_factor=1.0,\n", - " expression=\"map_limit_constraint( values['deflection'], 0.25, 0.05 )\") \n", - "job_def.fitness_definition =fd\n", - "\n", - "# Create job_definition in project\n", - "job_def = proj.create_job_definitions([job_def])[0]" - ] - }, - { - "cell_type": "markdown", - "id": "3279ffa8-9a71-4cf6-8ca4-85cf38fc2b9c", - "metadata": {}, - "source": [ - " ### Create design points" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "bcb30d2b-e466-498e-ba8e-ee29ffa1d186", - "metadata": {}, - "outputs": [], - "source": [ - "dps=[]\n", - "for i in range(1000):\n", - " values = { p.name : p.lower_limit + random.random()*(p.upper_limit-p.lower_limit) for p in job_def.parameter_definitions if p.mode == 'input' }\n", - " dps.append( Job( name=f\"Job.{i}\", values=values, eval_status=\"pending\") )\n", - "dps=job_def.create_jobs(dps)" - ] - }, - { - "cell_type": "markdown", - "id": "57dd61a4-929d-40bb-bc57-db40a2a1e8df", - "metadata": {}, - "source": [ - "### Wait for the first 50 design points to be evaluated" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "127eea6d-3f11-4a19-94ea-bf9433b65962", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of evaluated design points: 448\n" - ] - } - ], - "source": [ - "dps=[]\n", - "while len(dps)<50:\n", - " dps=job_def.get_jobs(eval_status='evaluated')\n", - " print(f\"Number of evaluated design points: {len(dps)}\")\n", - " time.sleep(5)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "5c9eb1b9-f179-4851-897f-bfd7daeaaf3e", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "param: height\n", - "param: diameter\n", - "param: thickness\n", - "param: separation_distance\n", - "param: young_modulus\n", - "param: density\n", - "param: load\n", - "param: weight\n", - "param: stress\n", - "param: buckling_stress\n", - "param: deflection\n" - ] - } - ], - "source": [ - "# Extract parameter values into Pandas dataframe\n", - "values = {}\n", - "for param_name,value in dps[0].values.items():\n", - " print(f\"param: {param_name}\")\n", - " param_values = [ dp.values[param_name] for dp in dps ]\n", - " values[param_name]= param_values\n", - "values['fitness'] = [ dp.fitness for dp in dps ]\n", - "import pandas as pd\n", - "df= pd.DataFrame(values)\n", - "#print(\"---\")\n", - "#print(df)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "68e53615-8aee-430a-8d60-529b9c8f4773", - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "weight=%{x}
stress=%{y}", - "legendgroup": "", - "marker": { - "color": "#636efa", - "symbol": "circle" - }, - "mode": "markers", - "name": "", - "orientation": "v", - "showlegend": false, - "type": "scatter", - "x": [ - 20.9702810627392, - 149.955517202471, - 3.15448283631116, - 143.374856574533, - 38.6831764237474, - 65.6267558652928, - 17.7882669614455, - 212.344941077556, - 186.026297166567, - 23.8527062921677, - 109.772564706466, - 240.621639838971, - 123.498712715074, - 165.914209527243, - 23.513031863019, - 95.4030279062126, - 125.051857566488, - 113.643395465656, - 77.2845138118808, - 50.4328205425388, - 208.152154566633, - 27.8545229179977, - 16.6096133035896, - 52.4749227011756, - 519.64102363221, - 222.753813441017, - 35.5526665526544, - 43.2691624380106, - 179.957228613332, - 83.3691395132274, - 15.2404767330789, - 242.637270325024, - 105.200223325453, - 27.199199163119, - 76.4483126328326, - 82.5367176074584, - 24.6519219129739, - 87.6849919734718, - 126.57315905783, - 7.43318261333829, - 148.243990772073, - 183.381596537651, - 69.1368511807773, - 67.0569772336247, - 14.8209564011092, - 58.0501742454255, - 14.4537430894075, - 66.9124506309189, - 22.9571919380378, - 172.459066862087, - 26.6672344059823, - 97.9423169651923, - 664.696613911906, - 218.488896141219, - 92.7873784802333, - 608.344350820411 - ], - "xaxis": "x", - "y": [ - 28.3853930628393, - 33.0582081398098, - 327.413854033287, - 33.6197300542616, - 93.0755520216901, - 31.7803241764081, - 21.0919672756456, - 19.3092371728706, - 5.41914011623563, - 38.7825798334457, - 0.930723306286901, - 10.0391480096407, - 0.398127342423569, - 16.7846558068698, - 282.927643302165, - 45.8259314245232, - 14.5579417144368, - 8.10905142944274, - 36.5746724193585, - 16.3199624933817, - 22.9263664409457, - 55.8274886343227, - 40.3029881151267, - 47.5614503431114, - 12.3705461866654, - 1.95104874339684, - 65.5898895454799, - 30.3276882651067, - 13.7146572544332, - 14.3440657512304, - 23.7090129408093, - 4.70439508883872, - 8.07526003329106, - 61.4544610853529, - 15.3280457576835, - 20.3925270985706, - 255.311682918226, - 44.2227147463277, - 13.517359537665, - 8.70924728612296, - 21.1374824748093, - 9.03372217445104, - 38.7675583750402, - 2.29491328064418, - 43.0264452434725, - 23.3333903503545, - 23.8847126815448, - 112.416855329516, - 2.76187263888166, - 8.34838891301176, - 14.7737988278926, - 27.450655446117, - 0.913499623778392, - 0.81442658127991, - 1.34135894363099, - 9.25485831140574 - ], - "yaxis": "y" - } - ], - "layout": { - "autosize": true, - "legend": { - "tracegroupgap": 0 - }, - "margin": { - "t": 60 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#f2f5fa" - }, - "error_y": { - "color": "#f2f5fa" - }, - "marker": { - "line": { - "color": "rgb(17,17,17)", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "rgb(17,17,17)", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#A2B1C6", - "gridcolor": "#506784", - "linecolor": "#506784", - "minorgridcolor": "#506784", - "startlinecolor": "#A2B1C6" - }, - "baxis": { - "endlinecolor": "#A2B1C6", - "gridcolor": "#506784", - "linecolor": "#506784", - "minorgridcolor": "#506784", - "startlinecolor": "#A2B1C6" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "marker": { - "line": { - "color": "#283442" - } - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "line": { - "color": "#283442" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#506784" - }, - "line": { - "color": "rgb(17,17,17)" - } - }, - "header": { - "fill": { - "color": "#2a3f5f" - }, - "line": { - "color": "rgb(17,17,17)" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#f2f5fa", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#f2f5fa" - }, - "geo": { - "bgcolor": "rgb(17,17,17)", - "lakecolor": "rgb(17,17,17)", - "landcolor": "rgb(17,17,17)", - "showlakes": true, - "showland": true, - "subunitcolor": "#506784" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "dark" - }, - "paper_bgcolor": "rgb(17,17,17)", - "plot_bgcolor": "rgb(17,17,17)", - "polar": { - "angularaxis": { - "gridcolor": "#506784", - "linecolor": "#506784", - "ticks": "" - }, - "bgcolor": "rgb(17,17,17)", - "radialaxis": { - "gridcolor": "#506784", - "linecolor": "#506784", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "rgb(17,17,17)", - "gridcolor": "#506784", - "gridwidth": 2, - "linecolor": "#506784", - "showbackground": true, - "ticks": "", - "zerolinecolor": "#C8D4E3" - }, - "yaxis": { - "backgroundcolor": "rgb(17,17,17)", - "gridcolor": "#506784", - "gridwidth": 2, - "linecolor": "#506784", - "showbackground": true, - "ticks": "", - "zerolinecolor": "#C8D4E3" - }, - "zaxis": { - "backgroundcolor": "rgb(17,17,17)", - "gridcolor": "#506784", - "gridwidth": 2, - "linecolor": "#506784", - "showbackground": true, - "ticks": "", - "zerolinecolor": "#C8D4E3" - } - }, - "shapedefaults": { - "line": { - "color": "#f2f5fa" - } - }, - "sliderdefaults": { - "bgcolor": "#C8D4E3", - "bordercolor": "rgb(17,17,17)", - "borderwidth": 1, - "tickwidth": 0 - }, - "ternary": { - "aaxis": { - "gridcolor": "#506784", - "linecolor": "#506784", - "ticks": "" - }, - "baxis": { - "gridcolor": "#506784", - "linecolor": "#506784", - "ticks": "" - }, - "bgcolor": "rgb(17,17,17)", - "caxis": { - "gridcolor": "#506784", - "linecolor": "#506784", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "updatemenudefaults": { - "bgcolor": "#506784", - "borderwidth": 0 - }, - "xaxis": { - "automargin": true, - "gridcolor": "#283442", - "linecolor": "#506784", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "#283442", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "#283442", - "linecolor": "#506784", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "#283442", - "zerolinewidth": 2 - } - } - }, - "xaxis": { - "anchor": "y", - "autorange": true, - "domain": [ - 0, - 1 - ], - "range": [ - -36.31140921249869, - 704.1625059607159 - ], - "title": { - "text": "weight" - }, - "type": "linear" - }, - "yaxis": { - "anchor": "x", - "autorange": true, - "domain": [ - 0, - 1 - ], - "range": [ - -24.921987978785022, - 352.73396935449557 - ], - "title": { - "text": "stress" - }, - "type": "linear" - } - } - }, - "image/png": "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Z8UQgAAEIAABCEAAAhCAAAQgAAEIQAACEGg1AURiq5FxAAQgAAEIQAACEIAABCAAAQhAAAIQgAAE/COASPSvc1YMAQhAAAIQgAAEIAABCEAAAhCAAAQgAIFWE0AkthoZB0AAAhCAAAQgAAEIQAACEIAABCDw/9uxQwIAAACEYf1bkwH9BUAwHAQIEOgJOBJ7m2tMgAABAgQIECBAgAABAgQIECBA4BZwJN5kAgQIECBAgAABAgQIECBAgAABAgR6Ao7E3uYaEyBAgAABAgQIECBAgAABAgQIELgFHIk3mQABAgQIECBAgAABAgQIECBAgACBnoAjsbe5xgQIECBAgAABAgQIECBAgAABAgRuAUfiTSZAgAABAgQIECBAgAABAgQIECBAoCfgSOxtrjEBAgQIECBAgAABAgQIECBAgACBW8CReJMJECBAgAABAgQIECBAgAABAgQIEOgJOBJ7m2tMgAABAgQIECBAgAABAgQIECBA4BZwJN5kAgQIECBAgAABAgQIECBAgAABAgR6Ao7E3uYaEyBAgAABAgQIECBAgAABAgQIELgFHIk3mQABAgQIECBAgAABAgQIECBAgACBnoAjsbe5xgQIECBAgAABAgQIECBAgAABAgRuAUfiTSZAgAABAgQIECBAgAABAgQIECBAoCfgSOxtrjEBAgQIECBAgAABAgQIECBAgACBW8CReJMJECBAgAABAgQIECBAgAABAgQIEOgJOBJ7m2tMgAABAgQIECBAgAABAgQIECBA4BZwJN5kAgQIECBAgAABAgQIECBAgAABAgR6Ao7E3uYaEyBAgAABAgQIECBAgAABAgQIELgFHIk3mQABAgQIECBAgAABAgQIECBAgACBnoAjsbe5xgQIECBAgAABAgQIECBAgAABAgRuAUfiTSZAgAABAgQIECBAgAABAgQIECBAoCfgSOxtrjEBAgQIECBAgAABAgQIECBAgACBW8CReJMJECBAgAABAgQIECBAgAABAgQIEOgJOBJ7m2tMgAABAgQIECBAgAABAgQIECBA4BZwJN5kAgQIECBAgAABAgQIECBAgAABAgR6AgPGNVIQ37wl0gAAAABJRU5ErkJggg==", - "text/html": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "thickness=%{x}
weight=%{y}
stress=%{marker.color}", - "legendgroup": "", - "marker": { - "color": [ - 28.3853930628393, - 33.0582081398098, - 327.413854033287, - 33.6197300542616, - 93.0755520216901, - 31.7803241764081, - 21.0919672756456, - 19.3092371728706, - 5.41914011623563, - 38.7825798334457, - 0.930723306286901, - 10.0391480096407, - 0.398127342423569, - 16.7846558068698, - 282.927643302165, - 45.8259314245232, - 14.5579417144368, - 8.10905142944274, - 36.5746724193585, - 16.3199624933817, - 22.9263664409457, - 55.8274886343227, - 40.3029881151267, - 47.5614503431114, - 12.3705461866654, - 1.95104874339684, - 65.5898895454799, - 30.3276882651067, - 13.7146572544332, - 14.3440657512304, - 23.7090129408093, - 4.70439508883872, - 8.07526003329106, - 61.4544610853529, - 15.3280457576835, - 20.3925270985706, - 255.311682918226, - 44.2227147463277, - 13.517359537665, - 8.70924728612296, - 21.1374824748093, - 9.03372217445104, - 38.7675583750402, - 2.29491328064418, - 43.0264452434725, - 23.3333903503545, - 23.8847126815448, - 112.416855329516, - 2.76187263888166, - 8.34838891301176, - 14.7737988278926, - 27.450655446117, - 0.913499623778392, - 0.81442658127991, - 1.34135894363099, - 9.25485831140574 - ], - "coloraxis": "coloraxis", - "symbol": "circle" - }, - "mode": "markers", - "name": "", - "orientation": "v", - "showlegend": false, - "type": "scatter", - "x": [ - 0.0873188991101422, - 0.406913712633301, - 0.0415504284759611, - 0.147091422246694, - 0.19946439096537, - 0.0987675714262345, - 0.407647230837784, - 0.595268652404103, - 0.31348358690372, - 0.0503107965742326, - 0.2293806552976, - 0.585329660035992, - 0.308569463487192, - 0.530881665132301, - 0.0377860008739689, - 0.17910564721693, - 0.417887623308189, - 0.133948270994748, - 0.250333810828272, - 0.190953656168728, - 0.375120176770271, - 0.143846327169193, - 0.054092303624498, - 0.454012110130024, - 0.350735421341779, - 0.448254777935178, - 0.0728545183026535, - 0.10645738407684, - 0.251794299218377, - 0.417654009380485, - 0.172891686534645, - 0.157837055960612, - 0.369517009025725, - 0.0640533150541115, - 0.210615559997395, - 0.23348412558832, - 0.271196640872514, - 0.463322477514984, - 0.431520924719493, - 0.0313274748307664, - 0.497563556037257, - 0.558002462357405, - 0.486820546597786, - 0.386366267756154, - 0.0945950278494261, - 0.277972550754812, - 0.112997816501228, - 0.132386178573004, - 0.214108394311089, - 0.52090127187993, - 0.165830758938573, - 0.303951099159559, - 0.524329592750848, - 0.291535726452989, - 0.321410878548822, - 0.575740018714695 - ], - "xaxis": "x", - "y": [ - 20.9702810627392, - 149.955517202471, - 3.15448283631116, - 143.374856574533, - 38.6831764237474, - 65.6267558652928, - 17.7882669614455, - 212.344941077556, - 186.026297166567, - 23.8527062921677, - 109.772564706466, - 240.621639838971, - 123.498712715074, - 165.914209527243, - 23.513031863019, - 95.4030279062126, - 125.051857566488, - 113.643395465656, - 77.2845138118808, - 50.4328205425388, - 208.152154566633, - 27.8545229179977, - 16.6096133035896, - 52.4749227011756, - 519.64102363221, - 222.753813441017, - 35.5526665526544, - 43.2691624380106, - 179.957228613332, - 83.3691395132274, - 15.2404767330789, - 242.637270325024, - 105.200223325453, - 27.199199163119, - 76.4483126328326, - 82.5367176074584, - 24.6519219129739, - 87.6849919734718, - 126.57315905783, - 7.43318261333829, - 148.243990772073, - 183.381596537651, - 69.1368511807773, - 67.0569772336247, - 14.8209564011092, - 58.0501742454255, - 14.4537430894075, - 66.9124506309189, - 22.9571919380378, - 172.459066862087, - 26.6672344059823, - 97.9423169651923, - 664.696613911906, - 218.488896141219, - 92.7873784802333, - 608.344350820411 - ], - "yaxis": "y" - } - ], - "layout": { - "autosize": true, - "coloraxis": { - "colorbar": { - "title": { - "text": "stress" - } - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "legend": { - "tracegroupgap": 0 - }, - "margin": { - "t": 60 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#f2f5fa" - }, - "error_y": { - "color": "#f2f5fa" - }, - "marker": { - "line": { - "color": "rgb(17,17,17)", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "rgb(17,17,17)", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#A2B1C6", - "gridcolor": "#506784", - "linecolor": "#506784", - "minorgridcolor": "#506784", - "startlinecolor": "#A2B1C6" - }, - "baxis": { - "endlinecolor": "#A2B1C6", - "gridcolor": "#506784", - "linecolor": "#506784", - "minorgridcolor": "#506784", - "startlinecolor": "#A2B1C6" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "marker": { - "line": { - "color": "#283442" - } - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "line": { - "color": "#283442" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#506784" - }, - "line": { - "color": "rgb(17,17,17)" - } - }, - "header": { - "fill": { - "color": "#2a3f5f" - }, - "line": { - "color": "rgb(17,17,17)" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#f2f5fa", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#f2f5fa" - }, - "geo": { - "bgcolor": "rgb(17,17,17)", - "lakecolor": "rgb(17,17,17)", - "landcolor": "rgb(17,17,17)", - "showlakes": true, - "showland": true, - "subunitcolor": "#506784" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "dark" - }, - "paper_bgcolor": "rgb(17,17,17)", - "plot_bgcolor": "rgb(17,17,17)", - "polar": { - "angularaxis": { - "gridcolor": "#506784", - "linecolor": "#506784", - "ticks": "" - }, - "bgcolor": "rgb(17,17,17)", - "radialaxis": { - "gridcolor": "#506784", - "linecolor": "#506784", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "rgb(17,17,17)", - "gridcolor": "#506784", - "gridwidth": 2, - "linecolor": "#506784", - "showbackground": true, - "ticks": "", - "zerolinecolor": "#C8D4E3" - }, - "yaxis": { - "backgroundcolor": "rgb(17,17,17)", - "gridcolor": "#506784", - "gridwidth": 2, - "linecolor": "#506784", - "showbackground": true, - "ticks": "", - "zerolinecolor": "#C8D4E3" - }, - "zaxis": { - "backgroundcolor": "rgb(17,17,17)", - "gridcolor": "#506784", - "gridwidth": 2, - "linecolor": "#506784", - "showbackground": true, - "ticks": "", - "zerolinecolor": "#C8D4E3" - } - }, - "shapedefaults": { - "line": { - "color": "#f2f5fa" - } - }, - "sliderdefaults": { - "bgcolor": "#C8D4E3", - "bordercolor": "rgb(17,17,17)", - "borderwidth": 1, - "tickwidth": 0 - }, - "ternary": { - "aaxis": { - "gridcolor": "#506784", - "linecolor": "#506784", - "ticks": "" - }, - "baxis": { - "gridcolor": "#506784", - "linecolor": "#506784", - "ticks": "" - }, - "bgcolor": "rgb(17,17,17)", - "caxis": { - "gridcolor": "#506784", - "linecolor": "#506784", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "updatemenudefaults": { - "bgcolor": "#506784", - "borderwidth": 0 - }, - "xaxis": { - "automargin": true, - "gridcolor": "#283442", - "linecolor": "#506784", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "#283442", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "#283442", - "linecolor": "#506784", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "#283442", - "zerolinewidth": 2 - } - } - }, - "xaxis": { - "anchor": "y", - "autorange": true, - "domain": [ - 0, - 1 - ], - "range": [ - -0.0023724896384420616, - 0.6289686168733114 - ], - "title": { - "text": "thickness" - }, - "type": "linear" - }, - "yaxis": { - "anchor": "x", - "autorange": true, - "domain": [ - 0, - 1 - ], - "range": [ - -48.06728321809842, - 715.9183799663156 - ], - "title": { - "text": "weight" - }, - "type": "linear" - } - } - }, - "image/png": "iVBORw0KGgoAAAANSUhEUgAABRIAAAFoCAYAAAArVwcGAAAAAXNSR0IArs4c6QAAIABJREFUeF7s3Qm0HFW1//FdPd4xAxmZp4RBBARFGRIQjSMIgiIRhIeKf4RnRGLM4wmCyCBGBCEID8UBEAwGgiA+fYoyRlBwQESBBAhDyA2Zkzv2VP9VnfTN7e5709Xdu05VdX/vWq6smz619zmfc95TflRXWWPHjrWFHwQQQAABBBBAAAEEEEAAAQQQQAABBBBAYBsCFkEi5wMBBBBAAAEEEEAAAQQQQAABBBBAAAEEKgkQJFYS4nMEEEAAAQQQQAABBBBAAAEEEEAAAQQQEIJEDgECCCCAAAIIIIAAAggggAACCCCAAAIIVBQgSKxIxAAEEEAAAQQQQAABBBBAAAEEEEAAAQQQIEjkDCCAAAIIIIAAAggggAACCCCAAAIIIIBARQGCxIpEDEAAAQQQQAABBBBAAAEEEEAAAQQQQAABgkTOAAIIIIAAAggggAACCCCAAAIIIIAAAghUFCBIrEjEAAQQQAABBBBAAAEEEEAAAQQQQAABBBAgSOQMIIAAAggggAACCCCAAAIIIIAAAggggEBFAYLEikQMQAABBBBAAAEEEEAAAQQQQAABBBBAAAGCRM4AAggggAACCCCAAAIIIIAAAggggAACCFQUIEisSMQABBBAAAEEEEAAAQQQQAABBBBAAAEEECBI5AwggAACCCCAAAIIIIAAAggggAACCCCAQEUBgsSKRAxAAAEEEEAAAQQQQAABBBBAAAEEEEAAAYJEzgACCCCAAAIIIIAAAggggAACCCCAAAIIVBQgSKxIxAAEEEAAAQQQQAABBBBAAAEEEEAAAQQQIEjkDCCAAAIIIIAAAggggAACCCCAAAIIIIBARQGCxIpEDEAAAQQQQAABBBBAAAEEEEAAAQQQQAABgkTOAAIIIIAAAggggAACCCCAAAIIIIAAAghUFCBIrEjEAAQQQAABBBBAAAEEEEAAAQQQQAABBBAgSOQMIIAAAggggAACCCCAAAIIIIAAAggggEBFAYLEikQMQAABBBBAAAEEEEAAAQQQQAABBBBAAAGCRM4AAggggAACCCCAAAIIIIAAAggggAACCFQUIEisSMQABBBAAAEEEEAAAQQQQAABBBBAAAEEECBI5AwggAACCCCAAAIIIIAAAggggAACCCCAQEUBgsSKRAxAAAEEEEAAAQQQQAABBBBAAAEEEEAAAYJEzgACCCCAAAIIIIAAAggggAACCCCAAAIIVBQgSKxIxAAEEEAAAQQQQAABBBBAAAEEEEAAAQQQIEjkDCCAAAIIIIAAAggggAACCCCAAAIIIIBARQGCxIpEDEAAAQQQQAABBBBAAAEEEEAAAQQQQAABgkTOAAIIIIAAAggggAACCCCAAAIIIIAAAghUFCBIrEjEAAQQQAABBBBAAAEEEEAAAQQQQAABBBAgSOQMIIAAAggggAACCCCAAAIIIIAAAggggEBFAYLEikQMQAABBBBAAAEEEEAAAQQQQAABBBBAAAGCRM4AAggggAACCCCAAAIIIIAAAggggAACCFQUIEisSMQABBBAAAEEEEAAAQQQQAABBBBAAAEEECBI5AwggAACCCCAAAIIIIAAAggggAACCCCAQEUBgsSKRAxAAAEEEEAAAQQQQAABBBBAAAEEEEAAAYJEzgACCCCAAAIIIIAAAggggAACCCCAAAIIVBQgSKxIxAAEEEAAAQQQQAABBBBAAAEEEEAAAQQQIEjkDCCAAAIIIIAAAggggAACCCCAAAIIIIBARQGCxIpEDEAAAQQQQAABBBBAAAEEEEAAAQQQQAABgkTOAAIIIIAAAggggAACCCCAAAIIIIAAAghUFCBIrEjEAAQQQAABBBBAAAEEEEAAAQQQQAABBBAgSOQMIIAAAggggAACCCCAAAIIIIAAAggggEBFAYLEikQMQAABBBBAAAEEEEAAAQQQQAABBBBAAAGCRM4AAggggAACCCCAAAIIIIAAAggggAACCFQUIEisSMQABBBAAAEEEEAAAQQQQAABBBBAAAEEECBI5AwggAACCCCAAAIIIIAAAggggAACCCCAQEUBgsSKRAxAAAEEEEAAAQQQQAABBBBAAAEEEEAAAYJEzgACCCCAAAIIIIAAAggggAACCCCAAAIIVBQgSKxIxAAEEEAAAQQQQAABBBBAAAEEEEAAAQQQIEjkDCCAAAIIIIAAAggggAACCCCAAAIIIIBARQGCxIpEDEAAAQQQQAABBBBAAAEEEEAAAQQQQAABgkTOAAIIIIAAAggggAACCCCAAAIIIIAAAghUFCBIrEjEAAQQQAABBBBAAAEEEEAAAQQQQAABBBAgSOQMIIAAAggggAACCCCAAAII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Ejslqy4BAgQIECBAgAABAgQIECBAgACBPhIQJPbRYpoKAQIECBAgQIAAAQIECBAgQIAAgU4JCBI7JasuAQIECBAgQIAAAQIECBAgQIAAgT4SECT20WKaCgECBAgQIECAAAECBAgQIECAAIFOCQgSOyWrLgECBAgQIECAAAECBAgQIECAAIE+EhAk9tFimgoBAgQIECBAgAABAgQIECBAgACBTgkIEjslqy4BAgQIECBAgAABAgQIECBAgACBPhIQJPbRYpoKAQIECBAgQIAAAQIECBAgQIAAgU4JCBI7JasuAQIECBAgQIAAAQIECBAgQIAAgT4SECT20WKaCgECBAgQIECAAAECBAgQIECAAIFOCQgSOyWrLgECBAgQIECAAAECBAgQIECAAIE+EhAk9tFimgoBAgQIECBAgAABAgQIECBAgACBTgkIEjslqy4BAgQIECBAgAABAgQIECBAgACBPhIQJPbRYpoKAQIECBAg0DsCX91xX1x44bq44fqtsWvXw20PPHe9tgekAAECBAgQIECAQN8JCBL7bklNiAABAgQIEOgmgSuu3Bwfv/0T8eCD34ibbvzg9NAWC/7Wr98Yd969PQ4ePBiXXrJx0SktVm/RAg4gQIAAAQIECBAgsIiAINEWIUCAAAECBAh0UKDVIDF1SILEVDHHEyBAgAABAgQIpAoIElPFHE+AAAECBAgQaFKgcVbheeedP93i8KFDccvNH44rN7+tfmnzjx59NC57y1vrPx8bG4vPfXZ73Lntjmi03bNnd7z9ms3T7YvAcMOGi6f/vHv3T+pnLM4NEhvtzzzzrHrNYgybNl1WPzPy8iuuilqtVq/x9R1fm3Wm5A033hTvvW7r9M8b9Rsd3rHtrrj6mmvnzeeB+++LuW1nzqdJMocRIECAAAECBAh0sYAgsYsXx9AIECBAgACB3hc43RmJRSA4M6j75s6HY/Xq1fX7Jhav4tLmmUFiERa++lWvqQeRRXBXhIV//hcfik/93Sfjuq0fmHXPxZm1inswNgLAffuenL4v49x6RRC4Zct74t5775kVZjYur57782KMRY0n9u6NH/7g+/Mu4S76fMEFF8wKQnt/Rc2AAAECBAgQIFBdAUFiddfezAkQIECAAIESBFIubS6Ct+KswSIo3L9v36wg8VR1GlOYeUbibR//m+lAsvEgl5m1ixCyeM0NBovwcf/+fbOCv5ntXv+Gi6bH16jR6H+hkLEEXl0QIECAAAECBAiUKCBILBFbVwQIECBAgED1BHIFiUVQ9453vis+dtut9bMR574aQeLY8bGoLavNexr0YkHioz/4QT24nHkZdqOPxuXYxZ+LB8eMrlpV/9HMy6LnXsb9yCPfcyZi9ba7GRMgQIAAAQJ9LiBI7PMFNj0CBAgQIEBgaQXKDBKLS6WL0G+kVot/eeCfZ937sNkgce49GRfSa8xJoLi0e0vvBAgQIECAAIGyBQSJZYvrjwABAgQIEKiUQONMve9+Z+esYG+hpyznurT5LZdfUX8gyswzBhcLEosHvBSXNhev4uEtzbxO9UCYRtvUes306RgCBAgQIECAAIGlExAkLp29ngkQIECAAIEKCDTCtsYDSxpTTg0Si3ZFMPf885/f1MNWivqvfe3rp58C3UyQ2Hggy8zLkouzD697/wfi1lv+sv5Al+LVeIr0zLMti///mt/7/ekQcrGQsQJLb4oECBAgQIAAgb4TECT23ZKaEAECBAgQINBtAsX9Dd973dao1Wr1S4+Lh6lcuflts56yXIz5dGckNuZUhInr1r1keoqNpz4vFEwW/6+43LkIBosnKzce5HKqh60URWeOtdFJI1g83c/mXu5ctJ35ROpuWxPjIUCAAAECBAgQSBcQJKabaUGAAAECBAgQIECAAAECBAgQIECgcgKCxMotuQkTIECAAAECBAgQIECAAAECBAgQSBcQJKabaUGAAAECBAgQIECAAAECBAgQIECgcgKCxMotuQkTIECAAAECBAgQIECAAAECBAgQSBcQJKabaUGAAAECBAgQIECAAAECBAgQIECgcgKCxMotuQkTIECAAAECBAgQIECAAAECBAgQSBcQJKabaUGAAAECBAgQIECAAAECBAgQIECgcgKCxMotuQkTIECAAAECBAgQIECAAAECBAgQSBcQJKabaUGAAAECBAgQIECAAAECBAgQIECgcgKCxMotuQkTIECAAAECBAgQIECAAAECBAgQSBcQJKabaUGAAAECBAgQIECAAAECBAgQIECgcgKCxMotuQkTIECAAAECBAgQIECAAAECBAgQSBcQJKabaUGAAAECBAgQIECAAAECBAgQIECgcgKCxMotuQkTIECAAAECBAgQIECAAAECBAgQSBcQJKabaUGAAAECBAgQIECAAAECBAgQIECgcgKCxMotuQkTIECAAAECBAgQIECAAAECBAgQSBcQJKabaUGAAAECBAgQIECAAAECBAgQIECgcgKCxMotuQkTIECAAAECBAgQIECAAAECBAgQSBcQJKabaUGAAAECBAgQIECAAAECBAgQIECgcgKCxMotuQkTIECAAAECBAgQIECAAAECBAgQSBcQJKabaUGAAAECBAgQIECAAAECBAgQIECgcgKCxMotuQkTIECAAAECBAgQIECAAAECBAgQSBcQJKabaUGAAAECBAgQIECAAAECBAgQIECgcgKCxMotuQkTIECAAAECBAgQIECAAAECBAgQSBcQJKabaUGAAAECBAgQIECAAAECBAgQIECgcgKCxMotuQkTIECAAAECBAgQIECAAAECBAgQSBcQJKabaUGAAAECBAgQIECAAAECBAgQIECgcgKCxMotuQkTIECAAAECBAgQIECAAAECBAgQSBcQJKabaUGAAAECBAgQIECAAAECBAgQIECgcgKCxMotuQkTIECAAAECBAgQIECAAAECBAgQSBcQJKabaUGAAAECBAgQIECAAAECBAgQIECgcgKCxMotuQkTIECAAAECBAgQIECAAAECBAgQSBcQJKabaUGAAAECBAgQIECAAAECBAgQIECgcgKCxMotuQkTIECAAAECBAgQIECAAAECBAgQSBcQJKabaUGAAAECBAgQIECAAAECBAgQIECgcgKCxMotuQkTIECAAAECBAgQIECAAAECBAgQSBcQJKabaUGAAAECBAgQIECAAAECBAgQIECgcgKCxMotuQkTIECAAAECBAgQIECAAAECBAgQSBcQJKabaUGAAAECBAgQIECAAAECBAgQIECgcgL/D4J8KgESGo1tAAAAAElFTkSuQmCC", - "text/html": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# Plot\n", - "import plotly.express as px\n", - "fig1 = px.scatter(df, x='weight', y='stress', template=\"plotly_dark\")\n", - "fig1.show()\n", - "fig2 = px.scatter(df, x='thickness', y='weight', color='stress', template=\"plotly_dark\")\n", - "fig2.show()\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "cb054e81-f91e-429d-a01a-1e0ec3452748", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} From af6a35a820839b9ed388984fa5d02e796126392b Mon Sep 17 00:00:00 2001 From: Federico Negri Date: Thu, 14 Dec 2023 07:46:09 +0100 Subject: [PATCH 08/19] HPS doc link --- doc/source/conf.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/doc/source/conf.py b/doc/source/conf.py index f9fbc1331..185d66214 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -278,10 +278,8 @@ extlinks = { "ansys_rep_help": ( - # """https://ansyshelp.ansys.com/account/ - # secured?returnurl=/Views/Secured/corp/v231/en/rep_ug/%s.html""", """https://ansyshelp.ansys.com/account/ - secured?returnurl=/Views/Secured/corp/v231/en/rep_ug/%s.html""" # todo + secured?returnurl=/Views/Secured/hpcplat/v000/en/rep_ug/%s.html""" "ANSYS Help - ", ), } From ea7e0486f5e14d1635a7d6b729af8f049cf19681 Mon Sep 17 00:00:00 2001 From: Federico Negri Date: Thu, 14 Dec 2023 07:47:38 +0100 Subject: [PATCH 09/19] Update some old DCS terminology --- ansys/hps/client/jms/api/project_api.py | 2 +- ansys/hps/client/jms/resource/fitness_definition.py | 2 +- ansys/hps/client/jms/resource/job.py | 2 +- examples/mapdl_motorbike_frame/motorbike_frame.mac | 2 +- examples/mapdl_tyre_performance/2d_tire_geometry.iges | 2 +- examples/python_multi_process_step/project_setup.py | 2 +- tests/jms/test_fitness_definition.py | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ansys/hps/client/jms/api/project_api.py b/ansys/hps/client/jms/api/project_api.py index ddefd9732..676a401be 100644 --- a/ansys/hps/client/jms/api/project_api.py +++ b/ansys/hps/client/jms/api/project_api.py @@ -114,7 +114,7 @@ def archive_project(self, path: str, include_job_files: bool = True): Args: path (str): Where to save the archive locally. - include_job_files (bool, optional): Whether to include design point files in the + include_job_files (bool, optional): Whether to include job files in the archive. True by default. Returns: diff --git a/ansys/hps/client/jms/resource/fitness_definition.py b/ansys/hps/client/jms/resource/fitness_definition.py index 4e4a128a0..fa3178b0e 100644 --- a/ansys/hps/client/jms/resource/fitness_definition.py +++ b/ansys/hps/client/jms/resource/fitness_definition.py @@ -91,7 +91,7 @@ class FitnessDefinition(Object): fitness_term_definitions List of :class:`ansys.hps.client.jms.FitnessTermDefinition`. error_fitness : float - The default fitness value assigned to failed design points. + The default fitness value assigned to failed jobs. Examples -------- diff --git a/ansys/hps/client/jms/resource/job.py b/ansys/hps/client/jms/resource/job.py index 146af83ee..9bcc7e5a6 100644 --- a/ansys/hps/client/jms/resource/job.py +++ b/ansys/hps/client/jms/resource/job.py @@ -25,7 +25,7 @@ class Job(Object): job_definition_id : str ID of the linked job definition, see :class:`JobDefinition`. priority : int, optional - Priority with which jobs are evaluated. The default is 0, which is the highest priority. Assigning a higher value to a design point makes it a lower priority. + Priority with which jobs are evaluated. The default is 0, which is the highest priority. Assigning a higher value to a job makes it a lower priority. values : dict[str, any], optional Dictionary with (name,value) pairs for all parameters defined in the linked job definition. fitness : float, optional diff --git a/examples/mapdl_motorbike_frame/motorbike_frame.mac b/examples/mapdl_motorbike_frame/motorbike_frame.mac index 0f224231c..a67843b56 100644 --- a/examples/mapdl_motorbike_frame/motorbike_frame.mac +++ b/examples/mapdl_motorbike_frame/motorbike_frame.mac @@ -6,7 +6,7 @@ FINISH /CLEAR,START /PREP7 /NOPR -/TITLE, MOTORBIKE FRAME MODEL FOR DCS +/TITLE, MOTORBIKE FRAME MODEL FOR HPS ! OPTIMIZATION PARAMETERS ! ----------------------- diff --git a/examples/mapdl_tyre_performance/2d_tire_geometry.iges b/examples/mapdl_tyre_performance/2d_tire_geometry.iges index 897455227..daa5cb1d3 100644 --- a/examples/mapdl_tyre_performance/2d_tire_geometry.iges +++ b/examples/mapdl_tyre_performance/2d_tire_geometry.iges @@ -1,7 +1,7 @@ /COM,ANSYS RELEASE 2019 R1 BUILD 19.3BETA UP20181008 12S 2 /NOPR S 3 /PREP7 S 4 -/TITLE,Tire Performance Simulation for DCS +/TITLE,Tire Performance Simulation for HPS DOF,UX,UY,ROTY, S 6 *SET,A1,0.2500000000000E-06 S 7 *SET,M1,9.000000000000 S 8 diff --git a/examples/python_multi_process_step/project_setup.py b/examples/python_multi_process_step/project_setup.py index 0f9833a22..4fb73c31f 100644 --- a/examples/python_multi_process_step/project_setup.py +++ b/examples/python_multi_process_step/project_setup.py @@ -299,7 +299,7 @@ def main( args = parser.parse_args() - log.debug("=== DCS connection") + log.debug("=== HPS connection") client = Client(rep_url=args.url, username=args.username, password=args.password) try: diff --git a/tests/jms/test_fitness_definition.py b/tests/jms/test_fitness_definition.py index 79bc68907..43984ed0e 100644 --- a/tests/jms/test_fitness_definition.py +++ b/tests/jms/test_fitness_definition.py @@ -124,7 +124,7 @@ def test_fitness_definition_serialization(self): def test_fitness_definition_integration(self): client = self.client - proj_name = f"test_dps_FitnessDefinitionTest_{self.run_id}" + proj_name = f"test_jms_FitnessDefinitionTest_{self.run_id}" proj = Project(name=proj_name, active=True) jms_api = JmsApi(client) From 64ac60b027f0de70ed6b2c86a668bf6bbfbe8382 Mon Sep 17 00:00:00 2001 From: Federico Negri Date: Thu, 14 Dec 2023 07:49:13 +0100 Subject: [PATCH 10/19] More docstrings --- ansys/hps/client/client.py | 4 ++-- ansys/hps/client/connection.py | 2 +- ansys/hps/client/jms/schema/evaluator.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ansys/hps/client/client.py b/ansys/hps/client/client.py index 0e1d9931a..52cd8e1df 100644 --- a/ansys/hps/client/client.py +++ b/ansys/hps/client/client.py @@ -66,7 +66,7 @@ class Client(object): Examples -------- - Create client object and connect to REP with username and password + Create client object and connect to HPS with username and password >>> from ansys.hps.client import Client >>> cl = Client( @@ -75,7 +75,7 @@ class Client(object): ... password="repuser" ... ) - Create client object and connect to REP with refresh token + Create client object and connect to HPS with refresh token >>> cl = Client( ... rep_url="https://localhost:8443/rep", diff --git a/ansys/hps/client/connection.py b/ansys/hps/client/connection.py index 4036c2f68..41d94fe24 100644 --- a/ansys/hps/client/connection.py +++ b/ansys/hps/client/connection.py @@ -19,7 +19,7 @@ def create_session( verify: Union[bool, str] = True, disable_security_warnings=False, ) -> requests.Session: - """Returns a :class:`requests.Session` object configured for REP with given access token + """Returns a :class:`requests.Session` object configured for HPS with given access token Parameters ---------- diff --git a/ansys/hps/client/jms/schema/evaluator.py b/ansys/hps/client/jms/schema/evaluator.py index 0c7b94776..8b6163f02 100644 --- a/ansys/hps/client/jms/schema/evaluator.py +++ b/ansys/hps/client/jms/schema/evaluator.py @@ -71,7 +71,7 @@ class Meta: ) username = fields.String( allow_none=True, - metadata={"description": "REP user the evaluator is connected to JMS as."}, + metadata={"description": "HPS user the evaluator is connected to JMS as."}, ) platform = fields.String( allow_none=True, From a819723368cad2128772ce9d591b19bf5efd6ee0 Mon Sep 17 00:00:00 2001 From: Federico Negri Date: Thu, 14 Dec 2023 07:51:56 +0100 Subject: [PATCH 11/19] Some examples updates --- doc/source/examples/ex_cfx_static_mixer.rst | 2 +- doc/source/examples/ex_fluent_2d_heat_exchanger.rst | 2 +- doc/source/examples/ex_lsdyna_job.rst | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/source/examples/ex_cfx_static_mixer.rst b/doc/source/examples/ex_cfx_static_mixer.rst index f5dcb35bd..6df8313c2 100644 --- a/doc/source/examples/ex_cfx_static_mixer.rst +++ b/doc/source/examples/ex_cfx_static_mixer.rst @@ -3,7 +3,7 @@ CFX Static Mixer ================ -This example shows how to submit a CFX Static Mixer model to be solved on REP. +This example shows how to submit a CFX Static Mixer model to be solved on HPS. .. only:: builder_html diff --git a/doc/source/examples/ex_fluent_2d_heat_exchanger.rst b/doc/source/examples/ex_fluent_2d_heat_exchanger.rst index 229b95fb2..fd70854ec 100644 --- a/doc/source/examples/ex_fluent_2d_heat_exchanger.rst +++ b/doc/source/examples/ex_fluent_2d_heat_exchanger.rst @@ -3,7 +3,7 @@ Fluent 2d Heat Exchanger ======================== -This example shows how to submit a simple Fluent solve job to REP. The model consists of a 2D heat exchanger. +This example shows how to submit a simple Fluent solve job to HPS. The model consists of a 2D heat exchanger. .. only:: builder_html diff --git a/doc/source/examples/ex_lsdyna_job.rst b/doc/source/examples/ex_lsdyna_job.rst index baca736fa..4b649fa97 100644 --- a/doc/source/examples/ex_lsdyna_job.rst +++ b/doc/source/examples/ex_lsdyna_job.rst @@ -3,7 +3,7 @@ LS-DYNA Job Submission ====================== -This example shows how to submit an LS-DYNA job to REP. Once submitted, minimal job information are serialized to a JSON file ``rep_job.json``. +This example shows how to submit an LS-DYNA job to HPS. Once submitted, minimal job information are serialized to a JSON file ``rep_job.json``. This mimics what an application would need to store in order to subsequently monitor the job and download results. The job consists of two tasks: From 6c3e8712f270e9b6062625dcb0f60cd78cfb0380 Mon Sep 17 00:00:00 2001 From: Federico Negri Date: Thu, 14 Dec 2023 08:11:44 +0100 Subject: [PATCH 12/19] Rename REPError to HPSError --- ansys/hps/client/__init__.py | 2 +- ansys/hps/client/exceptions.py | 12 ++++++------ ansys/hps/client/jms/api/jms_api.py | 16 ++++++++-------- ansys/hps/client/jms/api/project_api.py | 6 +++--- doc/source/api/exceptions.rst | 4 ++-- doc/source/quickstart.rst | 8 ++++---- examples/cfx_static_mixer/project_setup.py | 4 ++-- .../fluent_2d_heat_exchanger/project_setup.py | 4 ++-- examples/fluent_nozzle/project_setup.py | 4 ++-- examples/lsdyna_cylinder_plate/lsdyna_job.py | 4 ++-- examples/mapdl_linked_analyses/project_setup.py | 4 ++-- examples/mapdl_motorbike_frame/project_query.py | 4 ++-- examples/mapdl_motorbike_frame/project_setup.py | 4 ++-- examples/mapdl_motorbike_frame/task_files.py | 4 ++-- examples/mapdl_tyre_performance/project_setup.py | 4 ++-- .../project_setup.py | 4 ++-- .../python_multi_process_step/project_setup.py | 4 ++-- .../project_setup.py | 4 ++-- tests/auth/test_api.py | 4 ++-- tests/jms/test_task_definition_templates.py | 8 ++++---- 20 files changed, 54 insertions(+), 54 deletions(-) diff --git a/ansys/hps/client/__init__.py b/ansys/hps/client/__init__.py index d25a96f66..3a2e3c814 100644 --- a/ansys/hps/client/__init__.py +++ b/ansys/hps/client/__init__.py @@ -16,7 +16,7 @@ ) from .auth import AuthApi from .client import Client -from .exceptions import APIError, ClientError, REPError +from .exceptions import APIError, ClientError, HPSError from .jms import JmsApi, ProjectApi from .rms import RmsApi from .warnings import UnverifiedHTTPSRequestsWarning diff --git a/ansys/hps/client/exceptions.py b/ansys/hps/client/exceptions.py index 477f71eeb..4da9165d9 100644 --- a/ansys/hps/client/exceptions.py +++ b/ansys/hps/client/exceptions.py @@ -9,35 +9,35 @@ from requests.exceptions import RequestException -class REPError(RequestException): +class HPSError(RequestException): def __init__(self, *args, **kwargs): """Base class for all rep related errors. Derives from :class:`requests.exceptions.RequestException`. Example: - >>> from ansys.hps.client import REPError + >>> from ansys.hps.client import HPSError >>> from ansys.hps.client.jms import Client >>> try: >>> client = Client(rep_url="https://127.0.0.1:8443/rep/", username="repadmin", password="wrong_psw") - >>> except REPError as e: + >>> except HPSError as e: >>> print(e) 401 Client Error: invalid_grant for: POST https://127.0.0.1:8443/rep/auth... Invalid user credentials """ self.reason = kwargs.pop("reason", None) self.description = kwargs.pop("description", None) - super(REPError, self).__init__(*args, **kwargs) + super(HPSError, self).__init__(*args, **kwargs) -class APIError(REPError): +class APIError(HPSError): def __init__(self, *args, **kwargs): """Indicate server side related errors.""" super(APIError, self).__init__(*args, **kwargs) -class ClientError(REPError): +class ClientError(HPSError): def __init__(self, *args, **kwargs): """Indicate client side related errors.""" super(ClientError, self).__init__(*args, **kwargs) diff --git a/ansys/hps/client/jms/api/jms_api.py b/ansys/hps/client/jms/api/jms_api.py index a86d33713..12449703f 100644 --- a/ansys/hps/client/jms/api/jms_api.py +++ b/ansys/hps/client/jms/api/jms_api.py @@ -9,7 +9,7 @@ from ansys.hps.client.client import Client from ansys.hps.client.common import Object -from ansys.hps.client.exceptions import REPError +from ansys.hps.client.exceptions import HPSError from ansys.hps.client.jms.resource import Operation, Permission, Project, TaskDefinitionTemplate from ansys.hps.client.jms.schema.project import ProjectSchema @@ -294,7 +294,7 @@ def create_project(client, api_url, project, replace=False, as_objects=True) -> r = client.session.post(f"{url}", data=json_data) if not r.json()["projects"]: - raise REPError(f"Failed to create the project. Request response: {r.json()}") + raise HPSError(f"Failed to create the project. Request response: {r.json()}") data = r.json()["projects"][0] if not as_objects: @@ -344,7 +344,7 @@ def _monitor(): op, done = _monitor() if not done: - raise REPError(f"Operation {operation_id} did not complete.") + raise HPSError(f"Operation {operation_id} did not complete.") return op @@ -361,14 +361,14 @@ def _copy_objects( if not op.succeeded: obj_type = objects[0].__class__ rest_name = obj_type.Meta.rest_name - raise REPError(f"Failed to copy {rest_name} with ids = {[obj.id for obj in objects]}.") + raise HPSError(f"Failed to copy {rest_name} with ids = {[obj.id for obj in objects]}.") return op.result["destination_ids"] def restore_project(jms_api, archive_path): if not os.path.exists(archive_path): - raise REPError(f"Project archive: path does not exist {archive_path}") + raise HPSError(f"Project archive: path does not exist {archive_path}") # Upload archive to FS API archive_name = os.path.basename(archive_path) @@ -398,7 +398,7 @@ def restore_project(jms_api, archive_path): op = jms_api.monitor_operation(operation_id) if not op.succeeded: - raise REPError(f"Failed to restore project from archive {archive_path}.") + raise HPSError(f"Failed to restore project from archive {archive_path}.") project_id = op.result["project_id"] log.info(f"Done restoring project, project_id = '{project_id}'") @@ -424,13 +424,13 @@ def get_fs_url(client, api_url): file_storages = get_storages(client, api_url) if not file_storages: - raise REPError(f"No file storage information.") + raise HPSError(f"No file storage information.") rest_gateways = [fs for fs in file_storages if fs["obj_type"] == "RestGateway"] rest_gateways.sort(key=lambda fs: fs["priority"]) if not rest_gateways: - raise REPError(f"No Rest Gateway defined.") + raise HPSError(f"No Rest Gateway defined.") for d in rest_gateways: url = d["url"] diff --git a/ansys/hps/client/jms/api/project_api.py b/ansys/hps/client/jms/api/project_api.py index 676a401be..df187cad8 100644 --- a/ansys/hps/client/jms/api/project_api.py +++ b/ansys/hps/client/jms/api/project_api.py @@ -9,7 +9,7 @@ from ansys.hps.client.client import Client from ansys.hps.client.common import Object -from ansys.hps.client.exceptions import REPError +from ansys.hps.client.exceptions import HPSError from ansys.hps.client.jms.resource import ( Algorithm, File, @@ -623,7 +623,7 @@ def archive_project(project_api: ProjectApi, target_path, include_job_files=True op = jms_api.monitor_operation(operation_id) if not op.succeeded: - raise REPError(f"Failed to archive project {project_api.project_id}.\n{op}") + raise HPSError(f"Failed to archive project {project_api.project_id}.\n{op}") download_link = op.result["backend_path"] @@ -632,7 +632,7 @@ def archive_project(project_api: ProjectApi, target_path, include_job_files=True log.info(f"Project archive download link: {download_link}") if not os.path.isdir(target_path): - raise REPError(f"Project archive: target path does not exist {target_path}") + raise HPSError(f"Project archive: target path does not exist {target_path}") file_path = os.path.join(target_path, download_link.rsplit("/")[-1]) log.info(f"Download archive to {file_path}") diff --git a/doc/source/api/exceptions.rst b/doc/source/api/exceptions.rst index 1e7bcbc45..48bbf8dee 100644 --- a/doc/source/api/exceptions.rst +++ b/doc/source/api/exceptions.rst @@ -6,9 +6,9 @@ HTTP requests returning an unsuccessful status code will raise: * :exc:`ansys.hps.client.ClientError` for client errors (4xx status code, e.g. bad syntax or not found) * :exc:`ansys.hps.client.APIError` for server errors (5xx status code, e.g. internal server error or not implemented) -All exceptions that the Ansys REP clients explicitly raise inherit from :exc:`ansys.hps.client.REPError`. +All exceptions that the Ansys REP clients explicitly raise inherit from :exc:`ansys.hps.client.HPSError`. -.. autoexception:: ansys.hps.client.REPError +.. autoexception:: ansys.hps.client.HPSError :members: .. autoexception:: ansys.hps.client.APIError diff --git a/doc/source/quickstart.rst b/doc/source/quickstart.rst index 9008aa381..09febea8a 100644 --- a/doc/source/quickstart.rst +++ b/doc/source/quickstart.rst @@ -311,18 +311,18 @@ Admin users with the Keycloak "manage-users" role can create new users as well a Exception handling ------------------------------------------ -All exceptions that the Ansys REP client explicitly raise inherit from :exc:`ansys.hps.client.REPError`. +All exceptions that the Ansys REP client explicitly raise inherit from :exc:`ansys.hps.client.HPSError`. Client Errors are raised for 4xx HTTP status codes, while API Errors are raised for 5xx HTTP status codes (server side errors). For example, instantiating a client with invalid credentials will return a 401 Client Error. .. code-block:: python - from ansys.hps.client import Client, REPError + from ansys.hps.client import Client, HPSError try: client = Client(rep_url="https://localhost:8443/rep/", username="repuser", password="wrong_psw") - except REPError as e: + except HPSError as e: print(e) #Output: @@ -338,7 +338,7 @@ A *get* call on a non-existing resource will return a 404 Client Error. jms_api = JmsApi(client) try: jms_api.get_project(id="non_existing_project") - except REPError as e: + except HPSError as e: print(e) #Output: diff --git a/examples/cfx_static_mixer/project_setup.py b/examples/cfx_static_mixer/project_setup.py index 7cd3ac910..15eb08ee2 100644 --- a/examples/cfx_static_mixer/project_setup.py +++ b/examples/cfx_static_mixer/project_setup.py @@ -5,7 +5,7 @@ import logging import os -from ansys.hps.client import Client, REPError, __ansys_apps_version__ +from ansys.hps.client import Client, HPSError, __ansys_apps_version__ from ansys.hps.client.jms import ( File, JmsApi, @@ -169,5 +169,5 @@ def create_project(client, name, num_jobs=20, version=__ansys_apps_version__): client=client, name=args.name, num_jobs=args.num_jobs, version=args.ansys_version ) - except REPError as e: + except HPSError as e: log.error(str(e)) diff --git a/examples/fluent_2d_heat_exchanger/project_setup.py b/examples/fluent_2d_heat_exchanger/project_setup.py index 69dd3f887..3d79f8fb8 100644 --- a/examples/fluent_2d_heat_exchanger/project_setup.py +++ b/examples/fluent_2d_heat_exchanger/project_setup.py @@ -6,7 +6,7 @@ import logging import os -from ansys.hps.client import Client, REPError, __ansys_apps_version__ +from ansys.hps.client import Client, HPSError, __ansys_apps_version__ from ansys.hps.client.jms import ( File, JmsApi, @@ -149,5 +149,5 @@ def create_project( version=args.ansys_version, use_exec_script=args.use_exec_script, ) - except REPError as e: + except HPSError as e: log.error(str(e)) diff --git a/examples/fluent_nozzle/project_setup.py b/examples/fluent_nozzle/project_setup.py index 9927d14b2..0c7f89945 100644 --- a/examples/fluent_nozzle/project_setup.py +++ b/examples/fluent_nozzle/project_setup.py @@ -5,7 +5,7 @@ import logging import os -from ansys.hps.client import Client, REPError, __ansys_apps_version__ +from ansys.hps.client import Client, HPSError, __ansys_apps_version__ from ansys.hps.client.jms import ( File, JmsApi, @@ -201,5 +201,5 @@ def create_project(client, name, num_jobs=20, version=__ansys_apps_version__): client=client, name=args.name, num_jobs=args.num_jobs, version=args.ansys_version ) - except REPError as e: + except HPSError as e: log.error(str(e)) diff --git a/examples/lsdyna_cylinder_plate/lsdyna_job.py b/examples/lsdyna_cylinder_plate/lsdyna_job.py index 2380133ed..1390aa04d 100644 --- a/examples/lsdyna_cylinder_plate/lsdyna_job.py +++ b/examples/lsdyna_cylinder_plate/lsdyna_job.py @@ -23,7 +23,7 @@ import os import time -from ansys.hps.client import Client, REPError +from ansys.hps.client import Client, HPSError from ansys.hps.client.jms import ( File, JmsApi, @@ -406,7 +406,7 @@ def download_results(app_job: REPJob): job = REPJob.load() log.info(job) download_results(job) - except REPError as e: + except HPSError as e: log.error(str(e)) except KeyboardInterrupt: log.warning("Interrupted, stopping ...") diff --git a/examples/mapdl_linked_analyses/project_setup.py b/examples/mapdl_linked_analyses/project_setup.py index 316d072db..3ff838aa0 100644 --- a/examples/mapdl_linked_analyses/project_setup.py +++ b/examples/mapdl_linked_analyses/project_setup.py @@ -24,7 +24,7 @@ import os from typing import List, Tuple -from ansys.hps.client import Client, REPError, __ansys_apps_version__ +from ansys.hps.client import Client, HPSError, __ansys_apps_version__ from ansys.hps.client.jms import ( File, JmsApi, @@ -384,5 +384,5 @@ def create_project( use_exec_script=args.use_exec_script, version=args.ansys_version, ) - except REPError as e: + except HPSError as e: log.error(str(e)) diff --git a/examples/mapdl_motorbike_frame/project_query.py b/examples/mapdl_motorbike_frame/project_query.py index aa4c09017..96e2932e8 100644 --- a/examples/mapdl_motorbike_frame/project_query.py +++ b/examples/mapdl_motorbike_frame/project_query.py @@ -10,7 +10,7 @@ import os from statistics import mean, stdev -from ansys.hps.client import Client, REPError +from ansys.hps.client import Client, HPSError from ansys.hps.client.jms import JmsApi, ProjectApi log = logging.getLogger(__name__) @@ -131,5 +131,5 @@ def download_files(client, project_name): query_stats(client=client, project_name=args.name) download_files(client=client, project_name=args.name) - except REPError as e: + except HPSError as e: log.error(str(e)) diff --git a/examples/mapdl_motorbike_frame/project_setup.py b/examples/mapdl_motorbike_frame/project_setup.py index 6444e761c..9b0f61f2c 100644 --- a/examples/mapdl_motorbike_frame/project_setup.py +++ b/examples/mapdl_motorbike_frame/project_setup.py @@ -9,7 +9,7 @@ import os import random -from ansys.hps.client import Client, REPError, __ansys_apps_version__ +from ansys.hps.client import Client, HPSError, __ansys_apps_version__ from ansys.hps.client.jms import ( File, FitnessDefinition, @@ -351,5 +351,5 @@ def create_project( use_exec_script=args.use_exec_script, ) - except REPError as e: + except HPSError as e: log.error(str(e)) diff --git a/examples/mapdl_motorbike_frame/task_files.py b/examples/mapdl_motorbike_frame/task_files.py index 6b14135bd..4e1b8eaaa 100644 --- a/examples/mapdl_motorbike_frame/task_files.py +++ b/examples/mapdl_motorbike_frame/task_files.py @@ -3,7 +3,7 @@ import logging import os -from ansys.hps.client import REPError +from ansys.hps.client import HPSError from ansys.hps.client.jms import Client, File log = logging.getLogger(__name__) @@ -134,5 +134,5 @@ def modify_task_files(client, project_name): log.info(f"HPS URL: {client.rep_url}") modify_task_files(client=client, project_name=args.name) - except REPError as e: + except HPSError as e: log.error(str(e)) diff --git a/examples/mapdl_tyre_performance/project_setup.py b/examples/mapdl_tyre_performance/project_setup.py index 972199ea5..860114bc1 100644 --- a/examples/mapdl_tyre_performance/project_setup.py +++ b/examples/mapdl_tyre_performance/project_setup.py @@ -10,7 +10,7 @@ import os import random -from ansys.hps.client import Client, REPError, __ansys_apps_version__ +from ansys.hps.client import Client, HPSError, __ansys_apps_version__ from ansys.hps.client.jms import ( File, FloatParameterDefinition, @@ -263,5 +263,5 @@ def create_project( num_jobs=args.num_jobs, use_exec_script=args.use_exec_script, ) - except REPError as e: + except HPSError as e: log.error(str(e)) diff --git a/examples/python_linked_multi_process_step/project_setup.py b/examples/python_linked_multi_process_step/project_setup.py index e847bb667..50c9a3cb3 100644 --- a/examples/python_linked_multi_process_step/project_setup.py +++ b/examples/python_linked_multi_process_step/project_setup.py @@ -8,7 +8,7 @@ import os import random -from ansys.hps.client import Client, REPError +from ansys.hps.client import Client, HPSError from ansys.hps.client.jms import ( File, FloatParameterDefinition, @@ -202,5 +202,5 @@ def main(client, num_task_definitions, num_jobs, start, inactive): start=args.start, inactive=args.inactive, ) - except REPError as e: + except HPSError as e: log.error(str(e)) diff --git a/examples/python_multi_process_step/project_setup.py b/examples/python_multi_process_step/project_setup.py index 4fb73c31f..6d3e331a1 100644 --- a/examples/python_multi_process_step/project_setup.py +++ b/examples/python_multi_process_step/project_setup.py @@ -27,7 +27,7 @@ from task_files import update_task_files -from ansys.hps.client import Client, REPError +from ansys.hps.client import Client, HPSError from ansys.hps.client.jms import ( File, IntParameterDefinition, @@ -314,5 +314,5 @@ def main( inactive=args.inactive, sequential=args.sequential, ) - except REPError as e: + except HPSError as e: log.error(str(e)) diff --git a/examples/python_two_bar_truss_problem/project_setup.py b/examples/python_two_bar_truss_problem/project_setup.py index 5ec77be0c..8493cdf95 100644 --- a/examples/python_two_bar_truss_problem/project_setup.py +++ b/examples/python_two_bar_truss_problem/project_setup.py @@ -7,7 +7,7 @@ import os import random -from ansys.hps.client import Client, REPError +from ansys.hps.client import Client, HPSError from ansys.hps.client.jms import ( File, FitnessDefinition, @@ -280,5 +280,5 @@ def main(client, num_jobs, use_exec_script) -> Project: try: main(client, num_jobs=args.num_jobs, use_exec_script=args.use_exec_script) - except REPError as e: + except HPSError as e: log.error(str(e)) diff --git a/tests/auth/test_api.py b/tests/auth/test_api.py index d1be28c28..c27d464e0 100644 --- a/tests/auth/test_api.py +++ b/tests/auth/test_api.py @@ -11,7 +11,7 @@ from keycloak import KeycloakOpenID from keycloak.exceptions import KeycloakError -from ansys.hps.client import Client, REPError +from ansys.hps.client import Client, HPSError from ansys.hps.client.auth import AuthApi, User, authenticate from tests.rep_test import REPTestCase @@ -97,7 +97,7 @@ def test_impersonate_user(self): requested_subject=new_user.id, verify=False, ) - except REPError as e: + except HPSError as e: if e.response.status_code == 501 and "Feature not enabled" in e.reason: self.skipTest( f"This test requires to enable the feature 'token-exchange' in keycloak." diff --git a/tests/jms/test_task_definition_templates.py b/tests/jms/test_task_definition_templates.py index 1f2e0a6de..9bb7f0bd7 100644 --- a/tests/jms/test_task_definition_templates.py +++ b/tests/jms/test_task_definition_templates.py @@ -13,7 +13,7 @@ from marshmallow.utils import missing -from ansys.hps.client import REPError +from ansys.hps.client import HPSError from ansys.hps.client.auth import AuthApi from ansys.hps.client.jms import JmsApi from ansys.hps.client.jms.resource import ( @@ -217,7 +217,7 @@ def test_template_permissions(self): except_obj = None try: client1_templates = jms_api1.update_task_definition_templates(client1_templates) - except REPError as e: + except HPSError as e: except_obj = e self.assertEqual(except_obj.response.status_code, 403) self.assertEqual(except_obj.description, "Access to this resource has been restricted") @@ -322,7 +322,7 @@ def test_template_anyone_permission(self): except_obj = None try: client1_templates = jms_api1.update_task_definition_templates(client1_templates) - except REPError as e: + except HPSError as e: except_obj = e self.assertEqual(except_obj.response.status_code, 403) self.assertEqual(except_obj.description, "Access to this resource has been restricted") @@ -386,7 +386,7 @@ def test_template_delete(self): except_obj = None try: client2_templates = jms_api2.delete_task_definition_templates(client2_templates) - except REPError as e: + except HPSError as e: except_obj = e self.assertIsNotNone(except_obj) self.assertEqual(except_obj.response.status_code, 403) From 57d026def1de5839ef8f958c364f0cda54f9fe70 Mon Sep 17 00:00:00 2001 From: Federico Negri Date: Thu, 14 Dec 2023 08:31:10 +0100 Subject: [PATCH 13/19] Rename client.rep_url to client.url --- ansys/hps/client/auth/api/auth_api.py | 2 +- ansys/hps/client/client.py | 35 ++++++++++++++++++------- ansys/hps/client/jms/api/jms_api.py | 6 ++--- ansys/hps/client/jms/api/project_api.py | 2 +- ansys/hps/client/rms/api/rms_api.py | 2 +- 5 files changed, 31 insertions(+), 16 deletions(-) diff --git a/ansys/hps/client/auth/api/auth_api.py b/ansys/hps/client/auth/api/auth_api.py index 60ee037c0..3fe330cc9 100644 --- a/ansys/hps/client/auth/api/auth_api.py +++ b/ansys/hps/client/auth/api/auth_api.py @@ -58,7 +58,7 @@ def __init__(self, client): @property def url(self): """Returns the API url""" - return f"{self.client.rep_url}/auth/" + return f"{self.client.url}/auth/" @property def keycloak_admin_client(self) -> KeycloakAdmin: diff --git a/ansys/hps/client/client.py b/ansys/hps/client/client.py index 52cd8e1df..47cb290bf 100644 --- a/ansys/hps/client/client.py +++ b/ansys/hps/client/client.py @@ -40,7 +40,7 @@ class Client(object): Parameters ---------- - rep_url : str + url : str The base path for the server to call, e.g. "https://127.0.0.1:8443/rep". username : str, optional Username @@ -70,7 +70,7 @@ class Client(object): >>> from ansys.hps.client import Client >>> cl = Client( - ... rep_url="https://localhost:8443/rep", + ... url="https://localhost:8443/rep", ... username="repuser", ... password="repuser" ... ) @@ -78,7 +78,7 @@ class Client(object): Create client object and connect to HPS with refresh token >>> cl = Client( - ... rep_url="https://localhost:8443/rep", + ... url="https://localhost:8443/rep", ... username="repuser", ... refresh_token="eyJhbGciOiJIUzI1NiIsInR5cC..." >>> ) @@ -87,7 +87,7 @@ class Client(object): def __init__( self, - rep_url: str = "https://127.0.0.1:8443/rep", + url: str = "https://127.0.0.1:8443/rep", username: str = None, password: str = None, *, @@ -102,11 +102,19 @@ def __init__( all_fields=True, verify: Union[bool, str] = None, disable_security_warnings: bool = True, + **kwargs, ): - self.rep_url = rep_url + rep_url = kwargs.get("rep_url", None) + if url is None and rep_url is not None: + url = rep_url + msg = "The 'rep_url'` input argument is deprecated, use 'url' instead." + warnings.warn(msg, DeprecationWarning) + log.warning(msg) + + self.url = url self.auth_url = auth_url - self.auth_api_url = (auth_url or rep_url) + f"/auth/" + self.auth_api_url = (auth_url or url) + f"/auth/" self.access_token = None self.refresh_token = None self.username = username @@ -121,7 +129,7 @@ def __init__( self.verify = False msg = ( f"Certificate verification is disabled. " - f"Unverified HTTPS requests will be made to {self.rep_url}." + f"Unverified HTTPS requests will be made to {self.url}." ) warnings.warn(msg, UnverifiedHTTPSRequestsWarning) log.warning(msg) @@ -145,7 +153,7 @@ def __init__( log.debug(f"Authenticating with '{self.grant_type}' grant type.") tokens = authenticate( - url=auth_url or rep_url, + url=auth_url or url, realm=realm, grant_type=self.grant_type, scope=scope, @@ -172,6 +180,13 @@ def __init__( self._unauthorized_num_retry = 0 self._unauthorized_max_retry = 1 + @property + def rep_url(self) -> str: + msg = "The Client 'rep_url' property is deprecated, use 'url' instead." + warnings.warn(msg, DeprecationWarning) + log.warning(msg) + return self.url + def _auto_refresh_token(self, response, *args, **kwargs): """Hook function to automatically refresh the access token and re-send the request in case of unauthorized error""" @@ -197,7 +212,7 @@ def refresh_access_token(self): # Its not recommended to give refresh tokens to client_credentials grant types # as per OAuth 2.0 RFC6749 Section 4.4.3, so handle these specially... tokens = authenticate( - url=self.auth_url or self.rep_url, + url=self.auth_url or self.url, realm=self.realm, grant_type="client_credentials", scope=self.scope, @@ -208,7 +223,7 @@ def refresh_access_token(self): else: # Other workflows for authentication generally support refresh_tokens tokens = authenticate( - url=self.auth_url or self.rep_url, + url=self.auth_url or self.url, realm=self.realm, grant_type="refresh_token", scope=self.scope, diff --git a/ansys/hps/client/jms/api/jms_api.py b/ansys/hps/client/jms/api/jms_api.py index 12449703f..21ea26fea 100644 --- a/ansys/hps/client/jms/api/jms_api.py +++ b/ansys/hps/client/jms/api/jms_api.py @@ -49,7 +49,7 @@ def __init__(self, client: Client): @property def url(self) -> str: """Returns the API url""" - return f"{self.client.rep_url}/jms/api/v1" + return f"{self.client.url}/jms/api/v1" @property def fs_url(self) -> str: @@ -374,7 +374,7 @@ def restore_project(jms_api, archive_path): archive_name = os.path.basename(archive_path) bucket = f"rep-client-restore-{uuid.uuid4()}" - fs_file_url = f"{jms_api.client.rep_url}/fs/api/v1/{bucket}/{archive_name}" + fs_file_url = f"{jms_api.client.url}/fs/api/v1/{bucket}/{archive_name}" ansfs_file_url = f"ansfs://{bucket}/{archive_name}" # noqa: E231 fs_headers = {"content-type": "application/octet-stream"} @@ -405,7 +405,7 @@ def restore_project(jms_api, archive_path): # Delete archive file on server log.info(f"Delete temporary bucket {bucket}") - r = jms_api.client.session.put(f"{jms_api.client.rep_url}/fs/api/v1/remove/{bucket}") + r = jms_api.client.session.put(f"{jms_api.client.url}/fs/api/v1/remove/{bucket}") return get_project(jms_api.client, jms_api.url, project_id) diff --git a/ansys/hps/client/jms/api/project_api.py b/ansys/hps/client/jms/api/project_api.py index df187cad8..d50f6e33d 100644 --- a/ansys/hps/client/jms/api/project_api.py +++ b/ansys/hps/client/jms/api/project_api.py @@ -80,7 +80,7 @@ def __init__(self, client: Client, project_id: str): @property def jms_api_url(self) -> str: - return f"{self.client.rep_url}/jms/api/v1" + return f"{self.client.url}/jms/api/v1" @property def url(self) -> str: diff --git a/ansys/hps/client/rms/api/rms_api.py b/ansys/hps/client/rms/api/rms_api.py index 016aa6dd2..86767b6ac 100644 --- a/ansys/hps/client/rms/api/rms_api.py +++ b/ansys/hps/client/rms/api/rms_api.py @@ -32,7 +32,7 @@ def __init__(self, client: Client): @property def url(self) -> str: """Returns the API url""" - return f"{self.client.rep_url}/rms/api/v1" + return f"{self.client.url}/rms/api/v1" def get_api_info(self): """Return info like version, build date etc of the RMS API the client is connected to""" From 105255b23767ea87c6994b30ab994e822d96f605 Mon Sep 17 00:00:00 2001 From: Federico Negri Date: Thu, 14 Dec 2023 08:44:24 +0100 Subject: [PATCH 14/19] Update resources --- ansys/hps/client/jms/resource/evaluator.py | 2 +- ansys/hps/client/jms/resource/job_definition.py | 3 +++ ansys/hps/client/jms/resource/project.py | 2 +- ansys/hps/client/jms/schema/task_definition_template.py | 6 ++---- generate_resources.py | 2 +- 5 files changed, 8 insertions(+), 7 deletions(-) diff --git a/ansys/hps/client/jms/resource/evaluator.py b/ansys/hps/client/jms/resource/evaluator.py index 4e3aa9709..8e1943988 100644 --- a/ansys/hps/client/jms/resource/evaluator.py +++ b/ansys/hps/client/jms/resource/evaluator.py @@ -69,7 +69,7 @@ class Evaluator(Object): hostname : str, optional Name of the host on which the evaluator is running. username : str, optional - REP user the evaluator is connected to JMS as. + HPS user the evaluator is connected to JMS as. platform : str, optional Operating system on which the evaluator is running. task_manager_type : str, optional diff --git a/ansys/hps/client/jms/resource/job_definition.py b/ansys/hps/client/jms/resource/job_definition.py index a8cde29c2..9529f9ba4 100644 --- a/ansys/hps/client/jms/resource/job_definition.py +++ b/ansys/hps/client/jms/resource/job_definition.py @@ -24,8 +24,11 @@ class JobDefinition(Object): Defines whether this is the active job definition in the project where evaluators will evaluate pending jobs client_hash : str, optional parameter_definition_ids : list[str] + List of parameter definition IDs. parameter_mapping_ids : list[str] + List of parameter mapping IDs. task_definition_ids : list[str] + List of task definition IDs. fitness_definition : FitnessDefinitionBase, optional A :class:`FitnessDefinition` object. diff --git a/ansys/hps/client/jms/resource/project.py b/ansys/hps/client/jms/resource/project.py index dedb9ab6c..6eac5a531 100644 --- a/ansys/hps/client/jms/resource/project.py +++ b/ansys/hps/client/jms/resource/project.py @@ -9,7 +9,7 @@ class Project(Object): Parameters ---------- id : str - Unique ID to access the project, specified on creation of the project. + Unique ID to access the project, assigned server side on creation. name : str Name of the project. active : bool diff --git a/ansys/hps/client/jms/schema/task_definition_template.py b/ansys/hps/client/jms/schema/task_definition_template.py index 0c9be3144..4bd668827 100644 --- a/ansys/hps/client/jms/schema/task_definition_template.py +++ b/ansys/hps/client/jms/schema/task_definition_template.py @@ -142,10 +142,8 @@ class Meta(ObjectSchema.Meta): execution_script_storage_id = fields.String( allow_none=True, metadata={ - "description": ( - "Storage ID of the script to execute ", - "(command or execution script is required).", - ) + "description": "Storage ID of the script to execute " + "(command or execution script is required).", }, ) execution_script_storage_bucket = fields.String( diff --git a/generate_resources.py b/generate_resources.py index 33b054c70..bba2ddc6e 100644 --- a/generate_resources.py +++ b/generate_resources.py @@ -418,7 +418,7 @@ def __init__(self, def process_resources(subpackage, resources, base_class_path="ansys.hps.client"): - target_folder = os.path.join("ansys", "rep", "client", subpackage, "resource") + target_folder = os.path.join("ansys", "hps", "client", subpackage, "resource") resources_code = {} for resource in resources: print(f"Processing resource {resource['class']}") From da46ad87d1400faa346451ed0cecc317e32cfb12 Mon Sep 17 00:00:00 2001 From: Federico Negri Date: Thu, 14 Dec 2023 08:45:51 +0100 Subject: [PATCH 15/19] Few more REP to HPS --- ansys/hps/client/auth/authenticate.py | 2 +- ansys/hps/client/jms/api/jms_api.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ansys/hps/client/auth/authenticate.py b/ansys/hps/client/auth/authenticate.py index d4f0475ea..0596c39d6 100644 --- a/ansys/hps/client/auth/authenticate.py +++ b/ansys/hps/client/auth/authenticate.py @@ -31,7 +31,7 @@ def authenticate( **kwargs, ): """ - Authenticate user with either password or refresh token against REP authentication service. + Authenticate user with either password or refresh token against HPS authentication service. If successful, the response includes access and refresh tokens. Parameters diff --git a/ansys/hps/client/jms/api/jms_api.py b/ansys/hps/client/jms/api/jms_api.py index 21ea26fea..c601ba920 100644 --- a/ansys/hps/client/jms/api/jms_api.py +++ b/ansys/hps/client/jms/api/jms_api.py @@ -373,7 +373,7 @@ def restore_project(jms_api, archive_path): # Upload archive to FS API archive_name = os.path.basename(archive_path) - bucket = f"rep-client-restore-{uuid.uuid4()}" + bucket = f"hps-client-restore-{uuid.uuid4()}" fs_file_url = f"{jms_api.client.url}/fs/api/v1/{bucket}/{archive_name}" ansfs_file_url = f"ansfs://{bucket}/{archive_name}" # noqa: E231 From 6e9b929163119f093089d57ac4e3c8956a28ee3f Mon Sep 17 00:00:00 2001 From: Federico Negri Date: Thu, 14 Dec 2023 10:21:06 +0100 Subject: [PATCH 16/19] Adjust rep_url --- ansys/hps/client/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ansys/hps/client/client.py b/ansys/hps/client/client.py index 47cb290bf..431f762aa 100644 --- a/ansys/hps/client/client.py +++ b/ansys/hps/client/client.py @@ -106,7 +106,7 @@ def __init__( ): rep_url = kwargs.get("rep_url", None) - if url is None and rep_url is not None: + if rep_url is not None: url = rep_url msg = "The 'rep_url'` input argument is deprecated, use 'url' instead." warnings.warn(msg, DeprecationWarning) From a0e9cad0183908cb9ce14b3c1e6a0aa6323d4a1d Mon Sep 17 00:00:00 2001 From: Federico Negri Date: Thu, 14 Dec 2023 10:23:45 +0100 Subject: [PATCH 17/19] Fix doc --- doc/source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/conf.py b/doc/source/conf.py index 185d66214..17d11f71d 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -279,7 +279,7 @@ extlinks = { "ansys_rep_help": ( """https://ansyshelp.ansys.com/account/ - secured?returnurl=/Views/Secured/hpcplat/v000/en/rep_ug/%s.html""" + secured?returnurl=/Views/Secured/hpcplat/v000/en/rep_ug/%s.html""", "ANSYS Help - ", ), } From b5ba2e4d55ec96996f823f164aee76aab4a93633 Mon Sep 17 00:00:00 2001 From: Federico Negri Date: Thu, 14 Dec 2023 10:25:57 +0100 Subject: [PATCH 18/19] Fix build --- .github/workflows/ci_cd.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci_cd.yml b/.github/workflows/ci_cd.yml index 05da537cc..b06e1dc0a 100644 --- a/.github/workflows/ci_cd.yml +++ b/.github/workflows/ci_cd.yml @@ -170,7 +170,7 @@ jobs: python -m pip install -r requirements/requirements_build.txt python -m build venv wheel python -m twine check dist/* - version=$(ls dist | grep pyhps | grep -E -o "[0-9]+.[0-9]+.[a-z0-9]+") + version=$(ls dist | grep ansys_pyhps | grep -E -o "[0-9]+.[0-9]+.[a-z0-9]+") echo "version=$version" >> $GITHUB_OUTPUT #- name: Upload to private PyPi # if: github.ref == 'refs/heads/main' From 43bff03ad65d0f0fc3b4f38fa9d7b40e5dc011be Mon Sep 17 00:00:00 2001 From: Federico Negri Date: Thu, 14 Dec 2023 11:25:22 +0100 Subject: [PATCH 19/19] Bump version --- ansys/hps/client/__version__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ansys/hps/client/__version__.py b/ansys/hps/client/__version__.py index 96ece0c99..337892ac5 100644 --- a/ansys/hps/client/__version__.py +++ b/ansys/hps/client/__version__.py @@ -1,4 +1,4 @@ -__version__ = "0.5.dev0" +__version__ = "0.6.dev0" __version_no_dots__ = __version__.replace(".", "") __company__ = "ANSYS, Inc." __company_short__ = "Ansys"