Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/citrine/__version__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "3.20.0"
__version__ = "3.21.0"
2 changes: 2 additions & 0 deletions src/citrine/gemd_queries/criteria.py
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,7 @@ class TagsCriteria(Serializable['TagsCriteria'], Criteria):
- AND_TAGS_FILTER_TYPE: All specified tags must be present
- OR_TAGS_FILTER_TYPE: At least one of the specified tags must be present
- NOT_TAGS_FILTER_TYPE: None of the specified tags should be present

"""

tags = properties.Set(properties.String, 'tags')
Expand All @@ -200,6 +201,7 @@ class ConnectivityClassCriteria(Serializable['ConnectivityClassCriteria'], Crite
Whether the material is consumed.
is_produced: Optional[bool]
Whether the material is produced.

"""

is_consumed = properties.Optional(properties.Boolean, 'is_consumed')
Expand Down
1 change: 1 addition & 0 deletions src/citrine/informatics/design_spaces/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# flake8: noqa
from .data_source_design_space import *
from .design_space import *
from .design_space_settings import *
from .enumerated_design_space import *
from .formulation_design_space import *
from .product_design_space import *
Expand Down
64 changes: 64 additions & 0 deletions src/citrine/informatics/design_spaces/design_space_settings.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
from typing import Optional, Union
from uuid import UUID

from gemd.enumeration.base_enumeration import BaseEnumeration

from citrine._rest.resource import Resource
from citrine._serialization import properties


__all__ = ["DefaultDesignSpaceMode", "DesignSpaceSettings"]


class DefaultDesignSpaceMode(BaseEnumeration):
"""The type of default design space to create.

* ATTRIBUTE results in a product design space containing dimensions required by the predictor
* HIERARCHICAL results in a hierarchical design space resembling the shape of training data
"""

ATTRIBUTE = 'ATTRIBUTE'
HIERARCHICAL = 'HIERARCHICAL'


class DesignSpaceSettings(Resource["DesignSpaceSettings"]):
"""The configuration used to produce a default design space."""

predictor_id = properties.UUID("predictor_id")
predictor_version = properties.Optional(
properties.Union([properties.Integer(), properties.String()]),
'predictor_version'
)
mode = properties.Optional(properties.Enumeration(DefaultDesignSpaceMode), "mode")
exclude_intermediates = properties.Optional(properties.Boolean(), "exclude_intermediates")
include_ingredient_fraction_constraints = properties.Optional(
properties.Boolean(), "include_ingredient_fraction_constraints"
)
include_label_fraction_constraints = properties.Optional(
properties.Boolean(), "include_label_fraction_constraints"
)
include_label_count_constraints = properties.Optional(
properties.Boolean(), "include_label_count_constraints"
)
include_parameter_constraints = properties.Optional(
properties.Boolean(), "include_parameter_constraints"
)

def __init__(self,
*,
predictor_id: Union[UUID, str],
predictor_version: Optional[Union[int, str]] = None,
mode: Optional[DefaultDesignSpaceMode] = None,
exclude_intermediates: Optional[bool] = None,
include_ingredient_fraction_constraints: Optional[bool] = None,
include_label_fraction_constraints: Optional[bool] = None,
include_label_count_constraints: Optional[bool] = None,
include_parameter_constraints: Optional[bool] = None):
self.predictor_id = predictor_id
self.predictor_version = predictor_version
self.mode = mode
self.exclude_intermediates = exclude_intermediates
self.include_ingredient_fraction_constraints = include_ingredient_fraction_constraints
self.include_label_fraction_constraints = include_label_fraction_constraints
self.include_label_count_constraints = include_label_count_constraints
self.include_parameter_constraints = include_parameter_constraints
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from citrine.informatics.dimensions import Dimension
from citrine.informatics.design_spaces import FormulationDesignSpace
from citrine.informatics.design_spaces.design_space import DesignSpace
from citrine.informatics.design_spaces.design_space_settings import DesignSpaceSettings

__all__ = [
"TemplateLink",
Expand Down Expand Up @@ -150,6 +151,8 @@ class HierarchicalDesignSpace(EngineResource["HierarchicalDesignSpace"], DesignS

"""

_settings = properties.Optional(properties.Object(DesignSpaceSettings), "metadata.settings")
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These settings are just metadata intended to be carried to DS registration, not for users to tinker with. The only effect messing with them will have is screwing up filtering in the UI.


root = properties.Object(MaterialNodeDefinition, "data.instance.root")
subspaces = properties.List(
properties.Object(MaterialNodeDefinition), "data.instance.subspaces"
Expand Down Expand Up @@ -179,6 +182,9 @@ def __init__(
def _post_dump(self, data: dict) -> dict:
data = super()._post_dump(data)

if self._settings:
data["settings"] = self._settings.dump()
Comment on lines +185 to +186
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note that for registration, they're added in a different place than they're read. This is intentional.


root_node = data["instance"]["root"]
data["instance"]["root"] = self.__unwrap_node(root_node)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from citrine._rest.engine_resource import EngineResource
from citrine._serialization import properties
from citrine.informatics.design_spaces.design_space import DesignSpace
from citrine.informatics.design_spaces.design_space_settings import DesignSpaceSettings
from citrine.informatics.dimensions import Dimension

__all__ = ['ProductDesignSpace']
Expand All @@ -28,6 +29,8 @@ class ProductDesignSpace(EngineResource['ProductDesignSpace'], DesignSpace):

"""

_settings = properties.Optional(properties.Object(DesignSpaceSettings), "metadata.settings")
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See above.


subspaces = properties.List(properties.Object(DesignSpace), 'data.instance.subspaces',
default=[])
dimensions = properties.Optional(
Expand All @@ -50,6 +53,10 @@ def __init__(self,

def _post_dump(self, data: dict) -> dict:
data = super()._post_dump(data)

if self._settings:
data["settings"] = self._settings.dump()
Comment on lines +57 to +58
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See above.


for i, subspace in enumerate(data['instance']['subspaces']):
if isinstance(subspace, dict):
# embedded design spaces are not modules, so only serialize their config
Expand Down
43 changes: 16 additions & 27 deletions src/citrine/resources/design_space.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,28 +3,16 @@
from typing import Iterable, Optional, TypeVar, Union
from uuid import UUID

from gemd.enumeration.base_enumeration import BaseEnumeration

from citrine._utils.functions import format_escaped_url
from citrine.informatics.design_spaces import DesignSpace, EnumeratedDesignSpace, \
HierarchicalDesignSpace
from citrine.informatics.design_spaces import DefaultDesignSpaceMode, DesignSpace, \
DesignSpaceSettings, EnumeratedDesignSpace, HierarchicalDesignSpace
from citrine._rest.collection import Collection
from citrine._session import Session

CreationType = TypeVar('CreationType', bound=DesignSpace)


class DefaultDesignSpaceMode(BaseEnumeration):
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Although the class definition is moved, since it's still being imported here, it will not break user imports.

"""The type of default design space to create.

* ATTRIBUTE results in a product design space containing dimensions required by the predictor
* HIERARCHICAL results in a hierarchical design space resembling the shape of training data
"""

ATTRIBUTE = 'ATTRIBUTE'
HIERARCHICAL = 'HIERARCHICAL'


class DesignSpaceCollection(Collection[DesignSpace]):
"""Represents the collection of design spaces as well as the resources belonging to it.

Expand Down Expand Up @@ -154,7 +142,7 @@ def list_archived(self, *, per_page: int = 20) -> Iterable[DesignSpace]:

def create_default(self,
*,
predictor_id: UUID,
predictor_id: Union[UUID, str],
predictor_version: Optional[Union[int, str]] = None,
mode: DefaultDesignSpaceMode = DefaultDesignSpaceMode.ATTRIBUTE,
include_ingredient_fraction_constraints: bool = False,
Expand Down Expand Up @@ -209,19 +197,20 @@ def create_default(self,

"""
path = f'projects/{self.project_id}/design-spaces/default'
payload = {
"predictor_id": str(predictor_id),
"mode": mode.value,
"include_ingredient_fraction_constraints": include_ingredient_fraction_constraints,
"include_label_fraction_constraints": include_label_fraction_constraints,
"include_label_count_constraints": include_label_count_constraints,
"include_parameter_constraints": include_parameter_constraints
}
if predictor_version:
payload["predictor_version"] = predictor_version
settings = DesignSpaceSettings(
predictor_id=predictor_id,
predictor_version=predictor_version,
mode=mode,
include_ingredient_fraction_constraints=include_ingredient_fraction_constraints,
include_label_fraction_constraints=include_label_fraction_constraints,
include_label_count_constraints=include_label_count_constraints,
include_parameter_constraints=include_parameter_constraints
)

data = self.session.post_resource(path, json=payload, version=self._api_version)
return self.build(DesignSpace.wrap_instance(data["instance"]))
data = self.session.post_resource(path, json=settings.dump(), version=self._api_version)
ds = self.build(DesignSpace.wrap_instance(data["instance"]))
ds._settings = settings
return ds

def convert_to_hierarchical(
self,
Expand Down
Loading
Loading