Skip to content

Commit f8d9190

Browse files
fix(operator): fix Outputs class generated operators (#2755)
Co-authored-by: PyAnsys CI Bot <[email protected]>
1 parent e19a7d9 commit f8d9190

File tree

792 files changed

+5343
-4726
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

792 files changed

+5343
-4726
lines changed

src/ansys/dpf/core/core.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -311,12 +311,12 @@ def _deep_copy(dpf_entity, server=None):
311311
if stream_type == 1:
312312
out = serializer.get_output(0, types.bytes)
313313
else:
314-
out = serializer.outputs.serialized_string # Required for retro with 241
315-
deserializer.connect(-1, stream_type)
316-
deserializer.connect(0, out)
314+
out = serializer.outputs.serialized_string1 # Required for retro with 241
315+
deserializer.inputs.stream_type.connect(stream_type)
316+
deserializer.inputs.serialized_string1.connect(out)
317317
type_map = types_enum_to_types()
318318
output_type = list(type_map.keys())[list(type_map.values()).index(dpf_entity.__class__)]
319-
return deserializer.get_output(1, output_type)
319+
return deserializer.get_output(pin=1, output_type=output_type)
320320

321321

322322
class BaseService:

src/ansys/dpf/core/dpf_operator.py

Lines changed: 51 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,13 @@
2222

2323
"""Operator."""
2424

25+
from __future__ import annotations
26+
2527
from enum import Enum
2628
import logging
2729
import os
2830
import traceback
31+
from typing import TYPE_CHECKING
2932
import warnings
3033

3134
import numpy
@@ -58,6 +61,10 @@
5861
operator_grpcapi,
5962
)
6063

64+
if TYPE_CHECKING: # pragma: no cover
65+
from ansys.dpf.core.inputs import _Inputs
66+
from ansys.dpf.core.server import AnyServerType
67+
6168
LOG = logging.getLogger(__name__)
6269
LOG.setLevel("DEBUG")
6370

@@ -90,19 +97,31 @@ class Operator:
9097
9198
Parameters
9299
----------
93-
name : str
100+
name:
94101
Name of the operator. For example, ``"U"``. You can use the
95102
``"html_doc"`` operator to retrieve a list of existing operators.
96103
97-
config : Config, optional
104+
config:
98105
The Configuration allows to customize how the operation
99106
will be processed by the operator. The default is ``None``.
100107
101-
server : server.DPFServer, optional
108+
server:
102109
Server with the channel connected to the remote or local instance. The
103110
default is ``None``, in which case an attempt is made to use the global
104111
server.
105112
113+
operator:
114+
An existing operator reference to wrap. If an operator reference is provided,
115+
the name, server, inputs_type, and outputs_type parameters are ignored.
116+
117+
inputs_type:
118+
The class to use for the inputs of the operator. If not specified,
119+
the default Inputs class is used.
120+
121+
outputs_type:
122+
The class to use for the outputs of the operator. If not specified,
123+
the default Outputs class is used.
124+
106125
Examples
107126
--------
108127
Create an operator from the library of operators.
@@ -119,12 +138,22 @@ class Operator:
119138
120139
"""
121140

122-
def __init__(self, name=None, config=None, server=None, operator=None):
141+
def __init__(
142+
self,
143+
name: str = None,
144+
config: Config = None,
145+
server: AnyServerType = None,
146+
operator: Operator | int = None,
147+
inputs_type: type[_Inputs] = Inputs,
148+
outputs_type: type[_Outputs] = Outputs,
149+
):
123150
"""Initialize the operator with its name by connecting to a stub."""
124151
self.name = name
125152
self._internal_obj = None
126153
self._description = None
127154
self._inputs = None
155+
self._inputs_class = inputs_type
156+
self._outputs_class = outputs_type
128157
self._id = None
129158

130159
# step 1: get server
@@ -168,9 +197,14 @@ def __init__(self, name=None, config=None, server=None, operator=None):
168197
)
169198

170199
self._spec = Specification(operator_name=self.name, server=self._server)
171-
# add dynamic inputs
172-
if len(self._spec.inputs) > 0 and self._inputs is None:
173-
self._inputs = Inputs(self._spec.inputs, self)
200+
# add dynamic inputs if no specific Inputs subclass is used
201+
if len(self._spec.inputs) > 0:
202+
if self._inputs_class == Inputs:
203+
self._inputs = self._inputs_class(self._spec.inputs, self)
204+
else:
205+
self._inputs = self._inputs_class(self)
206+
else:
207+
self._inputs = None
174208

175209
# step4: if object exists: take instance (config)
176210
if config:
@@ -219,8 +253,13 @@ def _add_sub_res_operators(self, sub_results):
219253

220254
@property
221255
def _outputs(self):
222-
if self._spec and len(self._spec.outputs) != 0:
223-
return Outputs(self._spec.outputs, self)
256+
if self._outputs_class == Outputs:
257+
if self._spec and len(self._spec.outputs) != 0:
258+
return self._outputs_class(self._spec.outputs, self)
259+
else:
260+
return None
261+
else:
262+
return self._outputs_class(self)
224263

225264
@_outputs.setter
226265
def _outputs(self, value):
@@ -831,6 +870,9 @@ def _find_outputs_corresponding_pins(
831870
# Type match
832871
if input_type_name == python_name:
833872
corresponding_pins.append(pin)
873+
# Treat bytes as str
874+
elif input_type_name == "bytes" and python_name == "str":
875+
corresponding_pins.append(pin)
834876
# if the inpt has multiple potential outputs, find which ones can match
835877
elif isinstance(inpt, (_Outputs, Operator, Result)):
836878
if isinstance(inpt, Operator):

src/ansys/dpf/core/inputs.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424

2525
from enum import Enum
2626
from textwrap import wrap
27-
from typing import Generic, TypeVar
27+
from typing import Generic, TypeVar, Union
2828
import warnings
2929
import weakref
3030

@@ -73,7 +73,7 @@ def __init__(self, spec, pin, operator, count_ellipsis=-1):
7373
self.name += str(self._count_ellipsis + 1)
7474
self._update_doc_str(docstr, self.name)
7575

76-
def connect(self, inpt: T):
76+
def connect(self, inpt: Union[T, Output[T]]):
7777
"""Connect any input (entity or operator output) to a specified input pin of this operator."""
7878
from pathlib import Path
7979

src/ansys/dpf/core/operators/averaging/elemental_difference.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,6 @@ class elemental_difference(Operator):
7272
>>> result_field = op.outputs.field()
7373
"""
7474

75-
_inputs: InputsElementalDifference
76-
_outputs: OutputsElementalDifference
77-
7875
def __init__(
7976
self,
8077
field=None,
@@ -84,9 +81,13 @@ def __init__(
8481
config=None,
8582
server=None,
8683
):
87-
super().__init__(name="elemental_difference", config=config, server=server)
88-
self._inputs = InputsElementalDifference(self)
89-
self._outputs = OutputsElementalDifference(self)
84+
super().__init__(
85+
name="elemental_difference",
86+
config=config,
87+
server=server,
88+
inputs_type=InputsElementalDifference,
89+
outputs_type=OutputsElementalDifference,
90+
)
9091
if field is not None:
9192
self.inputs.field.connect(field)
9293
if mesh_scoping is not None:

src/ansys/dpf/core/operators/averaging/elemental_difference_fc.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,6 @@ class elemental_difference_fc(Operator):
7676
>>> result_fields_container = op.outputs.fields_container()
7777
"""
7878

79-
_inputs: InputsElementalDifferenceFc
80-
_outputs: OutputsElementalDifferenceFc
81-
8279
def __init__(
8380
self,
8481
fields_container=None,
@@ -88,9 +85,13 @@ def __init__(
8885
config=None,
8986
server=None,
9087
):
91-
super().__init__(name="elemental_difference_fc", config=config, server=server)
92-
self._inputs = InputsElementalDifferenceFc(self)
93-
self._outputs = OutputsElementalDifferenceFc(self)
88+
super().__init__(
89+
name="elemental_difference_fc",
90+
config=config,
91+
server=server,
92+
inputs_type=InputsElementalDifferenceFc,
93+
outputs_type=OutputsElementalDifferenceFc,
94+
)
9495
if fields_container is not None:
9596
self.inputs.fields_container.connect(fields_container)
9697
if mesh is not None:

src/ansys/dpf/core/operators/averaging/elemental_fraction_fc.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,6 @@ class elemental_fraction_fc(Operator):
7575
>>> result_fields_container = op.outputs.fields_container()
7676
"""
7777

78-
_inputs: InputsElementalFractionFc
79-
_outputs: OutputsElementalFractionFc
80-
8178
def __init__(
8279
self,
8380
fields_container=None,
@@ -88,9 +85,13 @@ def __init__(
8885
config=None,
8986
server=None,
9087
):
91-
super().__init__(name="elemental_fraction_fc", config=config, server=server)
92-
self._inputs = InputsElementalFractionFc(self)
93-
self._outputs = OutputsElementalFractionFc(self)
88+
super().__init__(
89+
name="elemental_fraction_fc",
90+
config=config,
91+
server=server,
92+
inputs_type=InputsElementalFractionFc,
93+
outputs_type=OutputsElementalFractionFc,
94+
)
9495
if fields_container is not None:
9596
self.inputs.fields_container.connect(fields_container)
9697
if mesh is not None:

src/ansys/dpf/core/operators/averaging/elemental_mean.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,6 @@ class elemental_mean(Operator):
6868
>>> result_field = op.outputs.field()
6969
"""
7070

71-
_inputs: InputsElementalMean
72-
_outputs: OutputsElementalMean
73-
7471
def __init__(
7572
self,
7673
field=None,
@@ -80,9 +77,13 @@ def __init__(
8077
config=None,
8178
server=None,
8279
):
83-
super().__init__(name="entity_average", config=config, server=server)
84-
self._inputs = InputsElementalMean(self)
85-
self._outputs = OutputsElementalMean(self)
80+
super().__init__(
81+
name="entity_average",
82+
config=config,
83+
server=server,
84+
inputs_type=InputsElementalMean,
85+
outputs_type=OutputsElementalMean,
86+
)
8687
if field is not None:
8788
self.inputs.field.connect(field)
8889
if collapse_shell_layers is not None:

src/ansys/dpf/core/operators/averaging/elemental_mean_fc.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,6 @@ class elemental_mean_fc(Operator):
9393
>>> result_fields_container = op.outputs.fields_container()
9494
"""
9595

96-
_inputs: InputsElementalMeanFc
97-
_outputs: OutputsElementalMeanFc
98-
9996
def __init__(
10097
self,
10198
fields_container=None,
@@ -108,9 +105,13 @@ def __init__(
108105
config=None,
109106
server=None,
110107
):
111-
super().__init__(name="entity_average_fc", config=config, server=server)
112-
self._inputs = InputsElementalMeanFc(self)
113-
self._outputs = OutputsElementalMeanFc(self)
108+
super().__init__(
109+
name="entity_average_fc",
110+
config=config,
111+
server=server,
112+
inputs_type=InputsElementalMeanFc,
113+
outputs_type=OutputsElementalMeanFc,
114+
)
114115
if fields_container is not None:
115116
self.inputs.fields_container.connect(fields_container)
116117
if collapse_shell_layers is not None:

src/ansys/dpf/core/operators/averaging/elemental_nodal_to_nodal.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,6 @@ class elemental_nodal_to_nodal(Operator):
8484
>>> result_weight = op.outputs.weight()
8585
"""
8686

87-
_inputs: InputsElementalNodalToNodal
88-
_outputs: OutputsElementalNodalToNodal
89-
9087
def __init__(
9188
self,
9289
field=None,
@@ -98,9 +95,13 @@ def __init__(
9895
config=None,
9996
server=None,
10097
):
101-
super().__init__(name="elemental_nodal_To_nodal", config=config, server=server)
102-
self._inputs = InputsElementalNodalToNodal(self)
103-
self._outputs = OutputsElementalNodalToNodal(self)
98+
super().__init__(
99+
name="elemental_nodal_To_nodal",
100+
config=config,
101+
server=server,
102+
inputs_type=InputsElementalNodalToNodal,
103+
outputs_type=OutputsElementalNodalToNodal,
104+
)
104105
if field is not None:
105106
self.inputs.field.connect(field)
106107
if mesh_scoping is not None:

src/ansys/dpf/core/operators/averaging/elemental_nodal_to_nodal_elemental.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,15 +59,14 @@ class elemental_nodal_to_nodal_elemental(Operator):
5959
>>> result_field = op.outputs.field()
6060
"""
6161

62-
_inputs: InputsElementalNodalToNodalElemental
63-
_outputs: OutputsElementalNodalToNodalElemental
64-
6562
def __init__(self, field=None, mesh_scoping=None, config=None, server=None):
6663
super().__init__(
67-
name="ElementalNodal_To_NodalElemental", config=config, server=server
64+
name="ElementalNodal_To_NodalElemental",
65+
config=config,
66+
server=server,
67+
inputs_type=InputsElementalNodalToNodalElemental,
68+
outputs_type=OutputsElementalNodalToNodalElemental,
6869
)
69-
self._inputs = InputsElementalNodalToNodalElemental(self)
70-
self._outputs = OutputsElementalNodalToNodalElemental(self)
7170
if field is not None:
7271
self.inputs.field.connect(field)
7372
if mesh_scoping is not None:

0 commit comments

Comments
 (0)