Skip to content

Commit 7ffbdde

Browse files
committed
Add imports to Configuration
1 parent 8e7fdb1 commit 7ffbdde

File tree

6 files changed

+206
-162
lines changed

6 files changed

+206
-162
lines changed

ymmsl/conversion/convert_v0_1_to_v0_2.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ def convert_v0_1_to_v0_2(config: v0_1.PartialConfiguration) -> v0_2.Configuratio
2525
resume = deepcopy(config.resume)
2626

2727
return v0_2.Configuration(
28-
description, model, settings, programs, resources, checkpoints, resume)
28+
description, None, model, settings, programs, resources, checkpoints,
29+
resume)
2930

3031

3132
def convert_component(component: v0_1.Component) -> v0_2.Component:

ymmsl/io.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,9 @@
2525
v0_1_MulticastConduit,
2626
v0_2.BaseEnv, v0_2.CheckpointRangeRule, v0_2.CheckpointAtRule,
2727
v0_2.CheckpointRule, v0_2.Checkpoints, v0_2.Component, v0_2.Configuration,
28-
v0_2.Document, v0_1.ExecutionModel, v0_2.Identifier, v0_2.KeepsStateForNextUse,
29-
v0_2.Model, v0_2.MPICoresResReq, v0_2.MPINodesResReq, v0_2.Ports, v0_2.Program,
28+
v0_2.Document, v0_1.ExecutionModel, v0_2.Identifier, v0_2.ImportKind,
29+
v0_2.ImportStatement, v0_2.KeepsStateForNextUse, v0_2.Model,
30+
v0_2.MPICoresResReq, v0_2.MPINodesResReq, v0_2.Ports, v0_2.Program,
3031
v0_2.Reference, v0_2.ResourceRequirements, v0_2.Settings, v0_2.ThreadedResReq)
3132

3233

ymmsl/v0_2/__init__.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from ymmsl.v0_2.checkpoint import (
22
CheckpointRule, CheckpointRangeRule, CheckpointAtRule, Checkpoints)
3+
from ymmsl.v0_2.imports import ImportKind, ImportStatement
34
from ymmsl.v0_2.ports import Operator, Port, Ports
45
from ymmsl.v0_2.program import BaseEnv, ExecutionModel, KeepsStateForNextUse
56
from ymmsl.v0_2.identity import Identifier, Reference, ReferencePart
@@ -18,8 +19,8 @@
1819
__all__ = [
1920
'BaseEnv', 'CheckpointRule', 'CheckpointRangeRule', 'CheckpointAtRule',
2021
'Checkpoints', 'Component', 'Ports', 'Conduit', 'Configuration', 'Document',
21-
'ExecutionModel', 'Identifier', 'Implementation', 'KeepsStateForNextUse',
22-
'Model', 'MPICoresResReq', 'MPINodesResReq', 'Operator', 'Port', 'Ports',
23-
'Program', 'Reference', 'ReferencePart', 'ResourceRequirements', 'Settings',
24-
'SettingValue', 'ThreadedResReq'
25-
]
22+
'ExecutionModel', 'Identifier', 'Implementation', 'ImportKind',
23+
'ImportStatement', 'KeepsStateForNextUse', 'Model', 'MPICoresResReq',
24+
'MPINodesResReq', 'Operator', 'Port', 'Ports', 'Program', 'Reference',
25+
'ReferencePart', 'ResourceRequirements', 'Settings', 'SettingValue',
26+
'ThreadedResReq']

ymmsl/v0_2/configuration.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from ymmsl.v0_2.checkpoint import Checkpoints
1111
from ymmsl.v0_2.resources import ResourceRequirements
1212
from ymmsl.v0_2.identity import Reference
13+
from ymmsl.v0_2.imports import ImportStatement
1314
from ymmsl.v0_2.settings import Settings
1415
from ymmsl.v0_2.document import Document
1516
from ymmsl.v0_2.implementation import Implementation
@@ -25,6 +26,7 @@ class Configuration(Document):
2526
2627
Attributes:
2728
description: A human-readable description of the configuration
29+
imports: A list of import statements
2830
models: A list of possibly connected models to run
2931
settings: Settings to run the models with
3032
programs: Programs to use to run the model. Dictionary mapping program names (as
@@ -36,6 +38,7 @@ class Configuration(Document):
3638
"""
3739
def __init__(
3840
self, description: str,
41+
imports: Optional[Sequence[ImportStatement]] = None,
3942
models: Optional[Union[Model, Sequence[Model]]] = None,
4043
settings: Optional[Settings] = None,
4144
programs: Optional[Union[
@@ -54,15 +57,20 @@ def __init__(
5457
5558
Args:
5659
description: Human-readable description
60+
imports: A list of import statements
61+
models: A list of possibly connected models to run
5762
settings: Settings to run the model with.
63+
programs: Programs to use when running the model
5864
resources: Resources to allocate for the model components.
5965
checkpoints: When each component should create a snapshot
6066
resume: What snapshot each component should resume from
61-
6267
"""
6368
self.description = description
6469

65-
# TODO: imports
70+
if imports is None:
71+
self.imports: List[ImportStatement] = list()
72+
else:
73+
self.imports = list(imports)
6674

6775
if models is None:
6876
self.models: Sequence[Model] = list()
@@ -131,6 +139,8 @@ def check_consistent(self) -> None:
131139

132140
# TODO: check that resources and implementation both do or don't MPI
133141

142+
# TODO: no two implementations (programs or models) with the same name
143+
134144
if errors:
135145
raise RuntimeError(
136146
'The configuration is internally inconsistent. The following'
@@ -151,6 +161,12 @@ def update(self, overlay: 'Configuration') -> None:
151161
elif overlay.description:
152162
self.description += '\n\n' + overlay.description
153163

164+
if not self.imports:
165+
self.imports = overlay.imports
166+
else:
167+
if overlay.imports:
168+
self.imports.extend(overlay.imports)
169+
154170
if self.models and overlay.models:
155171
raise RuntimeError(
156172
'Multiple ymmsl files containing models specified. Please'
@@ -267,6 +283,10 @@ def _yatiml_sweeten(cls, node: yatiml.Node) -> None:
267283
# output multi-line string in literal mode
268284
cast(yaml.ScalarNode, descr.yaml_node).style = '|'
269285

286+
imports = node.get_attribute('imports')
287+
if imports.is_sequence() and imports.is_empty():
288+
node.remove_attribute('imports')
289+
270290
models = node.get_attribute('models')
271291
if models.is_sequence() and models.is_empty():
272292
node.remove_attribute('models')

ymmsl/v0_2/tests/conftest.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def test_config4() -> Configuration:
6767
Ref('bf2smc'): Path('/path/to/snapshots/bf2smc.pack')}
6868

6969
return Configuration(
70-
description, None, None, None, resources, checkpoints, resume)
70+
description, None, None, None, None, resources, checkpoints, resume)
7171

7272

7373
@pytest.fixture
@@ -156,7 +156,7 @@ def test_config6() -> Configuration:
156156
MPINodesResReq(Reference('submodel.mpi_nodes1'), 10, 16),
157157
MPINodesResReq(Reference('submodel.mpi_nodes2'), 10, 4, 4)]
158158

159-
return Configuration('config6', [model1, model2], None, None, resources)
159+
return Configuration('config6', None, [model1, model2], None, None, resources)
160160

161161

162162
@pytest.fixture
@@ -166,7 +166,7 @@ def test_config7() -> Configuration:
166166
'missing_resources', None, [Component('singlethreaded', Ports(), 'b')])
167167
resources = [ThreadedResReq(Ref('got_resources.singlethreaded'), 1)]
168168

169-
return Configuration('test_config7', [model1, model2], None, None, resources)
169+
return Configuration('test_config7', None, [model1, model2], None, None, resources)
170170

171171

172172
@pytest.fixture
@@ -205,7 +205,7 @@ def test_config8() -> Configuration:
205205
MPICoresResReq(Reference('impl_with_ports'), 4, 4),
206206
]
207207

208-
return Configuration('config8', [model1, model2], None, programs, resources)
208+
return Configuration('config8', None, [model1, model2], None, programs, resources)
209209

210210

211211
@pytest.fixture
@@ -250,4 +250,4 @@ def test_config9() -> Configuration:
250250
ThreadedResReq(Reference('impl_extra_ports'), 1),
251251
]
252252

253-
return Configuration('config9', [model1, model2], None, programs, resources)
253+
return Configuration('config9', None, [model1, model2], None, programs, resources)

0 commit comments

Comments
 (0)