diff --git a/.flake8 b/.flake8
index ddc305f39..59849d82c 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, 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/.github/workflows/ci_cd.yml b/.github/workflows/ci_cd.yml
index e113a49d3..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 rep_client | 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'
@@ -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/.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 09d806410..1e06b4d99 100644
--- a/README.rst
+++ b/README.rst
@@ -1,4 +1,4 @@
-PyREP
+PyHPS
=====
|pyansys| |python| |pypi| |GH-CI| |codecov| |MIT| |black|
@@ -31,19 +31,19 @@ PyREP
:alt: Black
-A Python client for Ansys REP - Remote Execution Platform
+A Python client library for the Ansys HPC Platform Services.
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
@@ -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 90%
rename from ansys/rep/client/__init__.py
rename to ansys/hps/client/__init__.py
index d25a96f66..3a2e3c814 100644
--- a/ansys/rep/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/rep/client/__version__.py b/ansys/hps/client/__version__.py
similarity index 92%
rename from ansys/rep/client/__version__.py
rename to ansys/hps/client/__version__.py
index 96ece0c99..337892ac5 100644
--- a/ansys/rep/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"
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 93%
rename from ansys/rep/client/auth/api/auth_api.py
rename to ansys/hps/client/auth/api/auth_api.py
index 887ee4d91..3fe330cc9 100644
--- a/ansys/rep/client/auth/api/auth_api.py
+++ b/ansys/hps/client/auth/api/auth_api.py
@@ -24,15 +24,15 @@ class AuthApi:
Parameters
----------
client : Client
- A REP client object.
+ An HPS client object.
Examples
--------
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"
... )
@@ -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:
@@ -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/rep/client/auth/authenticate.py b/ansys/hps/client/auth/authenticate.py
similarity index 98%
rename from ansys/rep/client/auth/authenticate.py
rename to ansys/hps/client/auth/authenticate.py
index d4f0475ea..0596c39d6 100644
--- a/ansys/rep/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/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 96%
rename from ansys/rep/client/auth/resource/user.py
rename to ansys/hps/client/auth/resource/user.py
index aa27bd7ac..8076d5e0d 100644
--- a/ansys/rep/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/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 94%
rename from ansys/rep/client/auth/schema/user.py
rename to ansys/hps/client/auth/schema/user.py
index f2a9f7839..0efca4c1e 100644
--- a/ansys/rep/client/auth/schema/user.py
+++ b/ansys/hps/client/auth/schema/user.py
@@ -8,7 +8,7 @@
from marshmallow import fields
-from ansys.rep.client.common.base_schema import BaseSchema
+from ansys.hps.client.common.base_schema import BaseSchema
class UserSchema(BaseSchema):
diff --git a/ansys/rep/client/client.py b/ansys/hps/client/client.py
similarity index 86%
rename from ansys/rep/client/client.py
rename to ansys/hps/client/client.py
index 23e76d8b9..431f762aa 100644
--- a/ansys/rep/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.
@@ -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
@@ -66,19 +66,19 @@ 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.rep.client import Client
+ >>> from ansys.hps.client import Client
>>> cl = Client(
- ... rep_url="https://localhost:8443/rep",
+ ... url="https://localhost:8443/rep",
... username="repuser",
... 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",
+ ... 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 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/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 96%
rename from ansys/rep/client/connection.py
rename to ansys/hps/client/connection.py
index 8858232d7..41d94fe24 100644
--- a/ansys/rep/client/connection.py
+++ b/ansys/hps/client/connection.py
@@ -19,12 +19,12 @@ 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
----------
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/rep/client/exceptions.py b/ansys/hps/client/exceptions.py
similarity index 90%
rename from ansys/rep/client/exceptions.py
rename to ansys/hps/client/exceptions.py
index 4b4b4955d..4da9165d9 100644
--- a/ansys/rep/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.rep.client import REPError
- >>> from ansys.rep.client.jms import Client
+ >>> 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/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 96%
rename from ansys/rep/client/jms/api/base.py
rename to ansys/hps/client/jms/api/base.py
index cff4ca783..acf831250 100644
--- a/ansys/rep/client/jms/api/base.py
+++ b/ansys/hps/client/jms/api/base.py
@@ -4,8 +4,8 @@
from requests import Session
-from ansys.rep.client.common import Object
-from ansys.rep.client.exceptions import ClientError
+from ansys.hps.client.common import Object
+from ansys.hps.client.exceptions import ClientError
log = logging.getLogger(__name__)
@@ -133,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"
+ 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/rep/client/jms/api/jms_api.py b/ansys/hps/client/jms/api/jms_api.py
similarity index 91%
rename from ansys/rep/client/jms/api/jms_api.py
rename to ansys/hps/client/jms/api/jms_api.py
index 8c47b143c..c601ba920 100644
--- a/ansys/rep/client/jms/api/jms_api.py
+++ b/ansys/hps/client/jms/api/jms_api.py
@@ -7,11 +7,11 @@
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
+from ansys.hps.client.client import Client
+from ansys.hps.client.common import Object
+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
from .base import copy_objects as base_copy_objects
from .base import create_objects, delete_objects, get_object, get_objects, update_objects
@@ -25,15 +25,15 @@ class JmsApi(object):
Parameters
----------
client : Client
- A REP client object.
+ An HPS client object.
Examples
--------
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"
... )
@@ -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:
@@ -126,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)
@@ -137,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(
@@ -153,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)
@@ -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,20 +361,20 @@ 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)
- bucket = f"rep-client-restore-{uuid.uuid4()}"
- fs_file_url = f"{jms_api.client.rep_url}/fs/api/v1/{bucket}/{archive_name}"
+ 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
fs_headers = {"content-type": "application/octet-stream"}
@@ -398,14 +398,14 @@ 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}'")
# 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)
@@ -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/rep/client/jms/api/project_api.py b/ansys/hps/client/jms/api/project_api.py
similarity index 96%
rename from ansys/rep/client/jms/api/project_api.py
rename to ansys/hps/client/jms/api/project_api.py
index e789a01c6..d50f6e33d 100644
--- a/ansys/rep/client/jms/api/project_api.py
+++ b/ansys/hps/client/jms/api/project_api.py
@@ -7,10 +7,10 @@
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 (
+from ansys.hps.client.client import Client
+from ansys.hps.client.common import Object
+from ansys.hps.client.exceptions import HPSError
+from ansys.hps.client.jms.resource import (
Algorithm,
File,
Job,
@@ -37,15 +37,15 @@ class ProjectApi:
Parameters
----------
client : Client
- A REP client object.
+ An HPS client object.
project_id : str
ID of the project
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"
... )
@@ -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:
@@ -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:
@@ -128,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)
@@ -284,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)
@@ -317,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)
@@ -329,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.
@@ -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/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 97%
rename from ansys/rep/client/jms/resource/algorithm.py
rename to ansys/hps/client/jms/resource/algorithm.py
index 03affe6b2..75329adfe 100644
--- a/ansys/rep/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/rep/client/jms/resource/evaluator.py b/ansys/hps/client/jms/resource/evaluator.py
similarity index 98%
rename from ansys/rep/client/jms/resource/evaluator.py
rename to ansys/hps/client/jms/resource/evaluator.py
index ceb48601a..8e1943988 100644
--- a/ansys/rep/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
@@ -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/rep/client/jms/resource/file.py b/ansys/hps/client/jms/resource/file.py
similarity index 98%
rename from ansys/rep/client/jms/resource/file.py
rename to ansys/hps/client/jms/resource/file.py
index 76fca663b..65c9fa044 100644
--- a/ansys/rep/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/rep/client/jms/resource/fitness_definition.py b/ansys/hps/client/jms/resource/fitness_definition.py
similarity index 95%
rename from ansys/rep/client/jms/resource/fitness_definition.py
rename to ansys/hps/client/jms/resource/fitness_definition.py
index 6a1e3a9f4..fa3178b0e 100644
--- a/ansys/rep/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,9 +89,9 @@ 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.
+ The default fitness value assigned to failed jobs.
Examples
--------
diff --git a/ansys/rep/client/jms/resource/job.py b/ansys/hps/client/jms/resource/job.py
similarity index 95%
rename from ansys/rep/client/jms/resource/job.py
rename to ansys/hps/client/jms/resource/job.py
index 0954f82cc..9bcc7e5a6 100644
--- a/ansys/rep/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):
@@ -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/ansys/rep/client/jms/resource/job_definition.py b/ansys/hps/client/jms/resource/job_definition.py
similarity index 93%
rename from ansys/rep/client/jms/resource/job_definition.py
rename to ansys/hps/client/jms/resource/job_definition.py
index 2a5c70940..9529f9ba4 100644
--- a/ansys/rep/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):
@@ -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/rep/client/jms/resource/license_context.py b/ansys/hps/client/jms/resource/license_context.py
similarity index 94%
rename from ansys/rep/client/jms/resource/license_context.py
rename to ansys/hps/client/jms/resource/license_context.py
index 97a8f64d2..15fbeaea0 100644
--- a/ansys/rep/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/rep/client/jms/resource/operation.py b/ansys/hps/client/jms/resource/operation.py
similarity index 97%
rename from ansys/rep/client/jms/resource/operation.py
rename to ansys/hps/client/jms/resource/operation.py
index 67536e054..dce0ebec7 100644
--- a/ansys/rep/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/rep/client/jms/resource/parameter_definition.py b/ansys/hps/client/jms/resource/parameter_definition.py
similarity index 99%
rename from ansys/rep/client/jms/resource/parameter_definition.py
rename to ansys/hps/client/jms/resource/parameter_definition.py
index 405f4f80d..fadaec34f 100644
--- a/ansys/rep/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/rep/client/jms/resource/parameter_mapping.py b/ansys/hps/client/jms/resource/parameter_mapping.py
similarity index 98%
rename from ansys/rep/client/jms/resource/parameter_mapping.py
rename to ansys/hps/client/jms/resource/parameter_mapping.py
index 422ea1e07..9987bf640 100644
--- a/ansys/rep/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/rep/client/jms/resource/permission.py b/ansys/hps/client/jms/resource/permission.py
similarity index 95%
rename from ansys/rep/client/jms/resource/permission.py
rename to ansys/hps/client/jms/resource/permission.py
index 327eb8285..d8d1a95b0 100644
--- a/ansys/rep/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/rep/client/jms/resource/project.py b/ansys/hps/client/jms/resource/project.py
similarity index 91%
rename from ansys/rep/client/jms/resource/project.py
rename to ansys/hps/client/jms/resource/project.py
index d6582531b..6eac5a531 100644
--- a/ansys/rep/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):
@@ -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/rep/client/jms/resource/selection.py b/ansys/hps/client/jms/resource/selection.py
similarity index 97%
rename from ansys/rep/client/jms/resource/selection.py
rename to ansys/hps/client/jms/resource/selection.py
index 00095ceca..052c83c07 100644
--- a/ansys/rep/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/rep/client/jms/resource/task.py b/ansys/hps/client/jms/resource/task.py
similarity index 99%
rename from ansys/rep/client/jms/resource/task.py
rename to ansys/hps/client/jms/resource/task.py
index fe3660091..18a9fddde 100644
--- a/ansys/rep/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/rep/client/jms/resource/task_definition.py b/ansys/hps/client/jms/resource/task_definition.py
similarity index 99%
rename from ansys/rep/client/jms/resource/task_definition.py
rename to ansys/hps/client/jms/resource/task_definition.py
index 3a48e202e..d484a974e 100644
--- a/ansys/rep/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/rep/client/jms/resource/task_definition_template.py b/ansys/hps/client/jms/resource/task_definition_template.py
similarity index 99%
rename from ansys/rep/client/jms/resource/task_definition_template.py
rename to ansys/hps/client/jms/resource/task_definition_template.py
index b4dc8f321..4475815b6 100644
--- a/ansys/rep/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/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 93%
rename from ansys/rep/client/jms/schema/algorithm.py
rename to ansys/hps/client/jms/schema/algorithm.py
index b9ffceb3a..bf23e6740 100644
--- a/ansys/rep/client/jms/schema/algorithm.py
+++ b/ansys/hps/client/jms/schema/algorithm.py
@@ -8,7 +8,7 @@
from marshmallow import fields
-from ansys.rep.client.common import ObjectSchemaWithModificationInfo
+from ansys.hps.client.common import ObjectSchemaWithModificationInfo
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 97%
rename from ansys/rep/client/jms/schema/evaluator.py
rename to ansys/hps/client/jms/schema/evaluator.py
index 30d91f6e2..8b6163f02 100644
--- a/ansys/rep/client/jms/schema/evaluator.py
+++ b/ansys/hps/client/jms/schema/evaluator.py
@@ -10,7 +10,7 @@
from marshmallow import fields
from marshmallow.validate import OneOf
-from ansys.rep.client.common import ObjectSchema, RestrictedValue
+from ansys.hps.client.common import ObjectSchema, RestrictedValue
project_assignment_modes = ["disabled", "all_active", "project_list"]
@@ -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,
diff --git a/ansys/rep/client/jms/schema/file.py b/ansys/hps/client/jms/schema/file.py
similarity index 97%
rename from ansys/rep/client/jms/schema/file.py
rename to ansys/hps/client/jms/schema/file.py
index 98069692c..61c3856a4 100644
--- a/ansys/rep/client/jms/schema/file.py
+++ b/ansys/hps/client/jms/schema/file.py
@@ -8,7 +8,7 @@
from marshmallow import fields
-from ansys.rep.client.common import ObjectSchemaWithModificationInfo
+from ansys.hps.client.common import ObjectSchemaWithModificationInfo
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 96%
rename from ansys/rep/client/jms/schema/fitness_definition.py
rename to ansys/hps/client/jms/schema/fitness_definition.py
index 20a45f0ab..f634fa945 100644
--- a/ansys/rep/client/jms/schema/fitness_definition.py
+++ b/ansys/hps/client/jms/schema/fitness_definition.py
@@ -9,7 +9,7 @@
from marshmallow import fields
from marshmallow.validate import OneOf
-from ansys.rep.client.common import ObjectSchema
+from ansys.hps.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 97%
rename from ansys/rep/client/jms/schema/job.py
rename to ansys/hps/client/jms/schema/job.py
index 34ab89176..ad646449c 100644
--- a/ansys/rep/client/jms/schema/job.py
+++ b/ansys/hps/client/jms/schema/job.py
@@ -9,7 +9,7 @@
from marshmallow import fields
from marshmallow.validate import OneOf
-from ansys.rep.client.common import ObjectSchemaWithModificationInfo
+from ansys.hps.client.common import ObjectSchemaWithModificationInfo
from .object_reference import IdReference, IdReferenceList
diff --git a/ansys/rep/client/jms/schema/job_definition.py b/ansys/hps/client/jms/schema/job_definition.py
similarity index 96%
rename from ansys/rep/client/jms/schema/job_definition.py
rename to ansys/hps/client/jms/schema/job_definition.py
index 0180e130a..14e8dbe1e 100644
--- a/ansys/rep/client/jms/schema/job_definition.py
+++ b/ansys/hps/client/jms/schema/job_definition.py
@@ -9,7 +9,7 @@
from marshmallow import fields
-from ansys.rep.client.common import ObjectSchemaWithModificationInfo
+from ansys.hps.client.common import ObjectSchemaWithModificationInfo
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 92%
rename from ansys/rep/client/jms/schema/license_context.py
rename to ansys/hps/client/jms/schema/license_context.py
index 149751ae2..4f73e014b 100644
--- a/ansys/rep/client/jms/schema/license_context.py
+++ b/ansys/hps/client/jms/schema/license_context.py
@@ -8,7 +8,7 @@
from marshmallow import fields
-from ansys.rep.client.common import BaseSchema
+from ansys.hps.client.common import BaseSchema
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 92%
rename from ansys/rep/client/jms/schema/operation.py
rename to ansys/hps/client/jms/schema/operation.py
index 1ec3533c8..7b2e37c88 100644
--- a/ansys/rep/client/jms/schema/operation.py
+++ b/ansys/hps/client/jms/schema/operation.py
@@ -1,6 +1,6 @@
from marshmallow import fields
-from ansys.rep.client.common import ObjectSchema
+from ansys.hps.client.common import ObjectSchema
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 98%
rename from ansys/rep/client/jms/schema/parameter_definition.py
rename to ansys/hps/client/jms/schema/parameter_definition.py
index 4842181a0..d9f660ef0 100644
--- a/ansys/rep/client/jms/schema/parameter_definition.py
+++ b/ansys/hps/client/jms/schema/parameter_definition.py
@@ -10,7 +10,7 @@
from marshmallow import fields
from marshmallow_oneofschema import OneOfSchema
-from ansys.rep.client.common import ObjectSchemaWithModificationInfo
+from ansys.hps.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 96%
rename from ansys/rep/client/jms/schema/parameter_mapping.py
rename to ansys/hps/client/jms/schema/parameter_mapping.py
index 22f3ac39c..243cb6c78 100644
--- a/ansys/rep/client/jms/schema/parameter_mapping.py
+++ b/ansys/hps/client/jms/schema/parameter_mapping.py
@@ -9,7 +9,7 @@
from marshmallow import fields
-from ansys.rep.client.common import ObjectSchemaWithModificationInfo
+from ansys.hps.client.common import ObjectSchemaWithModificationInfo
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 92%
rename from ansys/rep/client/jms/schema/permission.py
rename to ansys/hps/client/jms/schema/permission.py
index 891f11bd6..0375e140d 100644
--- a/ansys/rep/client/jms/schema/permission.py
+++ b/ansys/hps/client/jms/schema/permission.py
@@ -1,6 +1,6 @@
from marshmallow import fields
-from ansys.rep.client.common import BaseSchema
+from ansys.hps.client.common import BaseSchema
class PermissionSchema(BaseSchema):
diff --git a/ansys/rep/client/jms/schema/project.py b/ansys/hps/client/jms/schema/project.py
similarity index 96%
rename from ansys/rep/client/jms/schema/project.py
rename to ansys/hps/client/jms/schema/project.py
index 046fe3af4..0f575eaab 100644
--- a/ansys/rep/client/jms/schema/project.py
+++ b/ansys/hps/client/jms/schema/project.py
@@ -8,7 +8,7 @@
from marshmallow import fields
-from ansys.rep.client.common import BaseSchema
+from ansys.hps.client.common import BaseSchema
class ProjectSchema(BaseSchema):
diff --git a/ansys/rep/client/jms/schema/selection.py b/ansys/hps/client/jms/schema/selection.py
similarity index 93%
rename from ansys/rep/client/jms/schema/selection.py
rename to ansys/hps/client/jms/schema/selection.py
index 9bc19c4b5..f84c1205c 100644
--- a/ansys/rep/client/jms/schema/selection.py
+++ b/ansys/hps/client/jms/schema/selection.py
@@ -8,7 +8,7 @@
from marshmallow import fields
-from ansys.rep.client.common import ObjectSchemaWithModificationInfo
+from ansys.hps.client.common import ObjectSchemaWithModificationInfo
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 98%
rename from ansys/rep/client/jms/schema/task.py
rename to ansys/hps/client/jms/schema/task.py
index a5ce57f86..63cb6f15a 100644
--- a/ansys/rep/client/jms/schema/task.py
+++ b/ansys/hps/client/jms/schema/task.py
@@ -8,7 +8,7 @@
from marshmallow import fields
-from ansys.rep.client.common import ObjectSchemaWithModificationInfo
+from ansys.hps.client.common import ObjectSchemaWithModificationInfo
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 98%
rename from ansys/rep/client/jms/schema/task_definition.py
rename to ansys/hps/client/jms/schema/task_definition.py
index d104ea11c..a312f415d 100644
--- a/ansys/rep/client/jms/schema/task_definition.py
+++ b/ansys/hps/client/jms/schema/task_definition.py
@@ -8,7 +8,7 @@
from marshmallow import fields
-from ansys.rep.client.common import BaseSchema, ObjectSchemaWithModificationInfo, RestrictedValue
+from ansys.hps.client.common import BaseSchema, ObjectSchemaWithModificationInfo, RestrictedValue
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 96%
rename from ansys/rep/client/jms/schema/task_definition_template.py
rename to ansys/hps/client/jms/schema/task_definition_template.py
index 227b58352..4bd668827 100644
--- a/ansys/rep/client/jms/schema/task_definition_template.py
+++ b/ansys/hps/client/jms/schema/task_definition_template.py
@@ -8,7 +8,7 @@
from marshmallow import fields, validate
-from ansys.rep.client.common import BaseSchema, ObjectSchema
+from ansys.hps.client.common import BaseSchema, ObjectSchema
from .task_definition import HpcResourcesSchema, SoftwareSchema
@@ -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/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 98%
rename from ansys/rep/client/rms/api/base.py
rename to ansys/hps/client/rms/api/base.py
index 4aa39c6ce..a51fcdfe3 100644
--- a/ansys/rep/client/rms/api/base.py
+++ b/ansys/hps/client/rms/api/base.py
@@ -7,7 +7,7 @@
from pydantic import create_model
from requests import Session
-from ansys.rep.client.exceptions import ClientError
+from ansys.hps.client.exceptions import ClientError
from ..models import (
Cluster,
diff --git a/ansys/rep/client/rms/api/rms_api.py b/ansys/hps/client/rms/api/rms_api.py
similarity index 88%
rename from ansys/rep/client/rms/api/rms_api.py
rename to ansys/hps/client/rms/api/rms_api.py
index 7f0c74ec4..86767b6ac 100644
--- a/ansys/rep/client/rms/api/rms_api.py
+++ b/ansys/hps/client/rms/api/rms_api.py
@@ -1,8 +1,9 @@
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,
EvaluatorConfigurationUpdate,
@@ -21,7 +22,7 @@ class RmsApi(object):
Parameters
----------
client : Client
- A REP client object.
+ An HPS client object.
"""
def __init__(self, client: Client):
@@ -31,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"""
@@ -77,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"
... )
@@ -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]
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
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..48bbf8dee 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.HPSError`.
-.. autoexception:: ansys.rep.client.REPError
+.. autoexception:: ansys.hps.client.HPSError
: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 d41fc8b6f..17d11f71d 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__)))
@@ -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 = []
@@ -281,12 +279,7 @@
extlinks = {
"ansys_rep_help": (
"""https://ansyshelp.ansys.com/account/
- secured?returnurl=/Views/Secured/corp/v231/en/rep_ug/%s.html""",
+ secured?returnurl=/Views/Secured/hpcplat/v000/en/rep_ug/%s.html""",
"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/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:
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..09febea8a 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
@@ -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,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.rep.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.rep.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:
@@ -333,12 +333,12 @@ 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:
jms_api.get_project(id="non_existing_project")
- except REPError as e:
+ except HPSError as e:
print(e)
#Output:
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 a0e864267..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.rep.client import REPError
-from ansys.rep.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/cfx_static_mixer/project_setup.py b/examples/cfx_static_mixer/project_setup.py
index 65c8de903..15eb08ee2 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, HPSError, __ansys_apps_version__
+from ansys.hps.client.jms import (
File,
JmsApi,
Job,
@@ -162,12 +162,12 @@ 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
)
- 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 06d9b8a6e..3d79f8fb8 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, HPSError, __ansys_apps_version__
+from ansys.hps.client.jms import (
File,
JmsApi,
Job,
@@ -138,16 +138,16 @@ 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,
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 9f958aafe..0c7f89945 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, HPSError, __ansys_apps_version__
+from ansys.hps.client.jms import (
File,
JmsApi,
Job,
@@ -194,12 +194,12 @@ 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
)
- 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 9735801f8..1390aa04d 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, HPSError
+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"
)
@@ -407,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 58281b3d1..3ff838aa0 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, HPSError, __ansys_apps_version__
+from ansys.hps.client.jms import (
File,
JmsApi,
Job,
@@ -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:
@@ -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/motorbike_frame.ipynb b/examples/mapdl_motorbike_frame/motorbike_frame.ipynb
deleted file mode 100644
index 9ab08c8c2..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.rep.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/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_motorbike_frame/project_query.py b/examples/mapdl_motorbike_frame/project_query.py
index 8d96d6c5e..96e2932e8 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, HPSError
+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):
@@ -124,12 +124,12 @@ 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)
- 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 8075beecf..9b0f61f2c 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, HPSError, __ansys_apps_version__
+from ansys.hps.client.jms import (
File,
FitnessDefinition,
FloatParameterDefinition,
@@ -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,
@@ -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 885055a5f..4e1b8eaaa 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 HPSError
+from ansys.hps.client.jms import Client, File
log = logging.getLogger(__name__)
@@ -129,10 +129,10 @@ 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:
+ except HPSError as e:
log.error(str(e))
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/mapdl_tyre_performance/project_setup.py b/examples/mapdl_tyre_performance/project_setup.py
index a5343ccb1..860114bc1 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, HPSError, __ansys_apps_version__
+from ansys.hps.client.jms import (
File,
FloatParameterDefinition,
JmsApi,
@@ -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,
@@ -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 ecf152b61..50c9a3cb3 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, HPSError
+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"]]
@@ -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(
@@ -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 4a9db69d2..6d3e331a1 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, HPSError
+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(
@@ -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:
@@ -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_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..8493cdf95 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, HPSError
+from ansys.hps.client.jms import (
File,
FitnessDefinition,
FloatParameterDefinition,
@@ -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/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 00d4194ec..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.rep.client import REPError\n",
- "from ansys.rep.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
-}
diff --git a/generate_resources.py b/generate_resources.py
index 5140ba4d3..bba2ddc6e 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,16 +416,16 @@ 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")
+ target_folder = os.path.join("ansys", "hps", "client", subpackage, "resource")
resources_code = {}
for resource in resources:
print(f"Processing resource {resource['class']}")
# 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 082ee67a3..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):
@@ -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/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/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=[
diff --git a/tests/auth/test_api.py b/tests/auth/test_api.py
index 722845ed8..c27d464e0 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, HPSError
+from ansys.hps.client.auth import AuthApi, User, authenticate
from tests.rep_test import REPTestCase
log = logging.getLogger(__name__)
@@ -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/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..43984ed0e 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,
)
@@ -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)
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..9bb7f0bd7 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 HPSError
+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__)
@@ -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)
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__)