Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add new transitive_parameters method to accelerate library loading #314

Merged
merged 8 commits into from
May 20, 2024
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
4 changes: 2 additions & 2 deletions .github/workflows/cd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ jobs:
with:
ref: ${{github.event.pull_request.head.ref}}
- name: setup-python
uses: actions/setup-python@v4
uses: actions/setup-python@v5
with:
python-version: '3.11'
# # update repo visualization for docs
Expand Down Expand Up @@ -66,7 +66,7 @@ jobs:
- name: checkout
uses: actions/checkout@v4
- name: setup-python
uses: actions/setup-python@v4
uses: actions/setup-python@v5
# install poetry and build dist
- name: install-poetry
uses: snok/install-poetry@v1
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ jobs:
- name: checkout
uses: actions/checkout@v4
- name: setup-python
uses: actions/setup-python@v4
uses: actions/setup-python@v5
with:
python-version: 3.11
- name: install-poetry
Expand All @@ -37,7 +37,7 @@ jobs:
- name: checkout
uses: actions/checkout@v4
- name: setup-python
uses: actions/setup-python@v4
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: install-poetry
Expand Down
4 changes: 2 additions & 2 deletions buildingmotif/database/table_connection.py
Original file line number Diff line number Diff line change
Expand Up @@ -460,9 +460,9 @@ def check_template_dependency_relationship(self, dep: DepsAssociation):
from buildingmotif.dataclasses import Template

templ = Template.load(template_id)
params = templ.inline_dependencies().parameters
params = templ.transitive_parameters
dep_templ = Template.load(dependency_id)
dep_params = dep_templ.inline_dependencies().parameters
dep_params = dep_templ.transitive_parameters

# check parameters are valid
if not set(args.values()).issubset(params):
Expand Down
20 changes: 20 additions & 0 deletions buildingmotif/dataclasses/template.py
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,26 @@ def to_inline(self, preserve_args: Optional[List[str]] = None) -> "Template":
replace_nodes(templ.body, to_replace)
return templ

@property
def transitive_parameters(self) -> Set[str]:
"""Get all parameters used in this template and its dependencies.

:return: set of all parameters
:rtype: Set[str]
"""
params = set(self.parameters)
for dep in self.get_dependencies():
transitive_params = dep.template.transitive_parameters
rename_params: Dict[str, str] = {
ours: theirs for ours, theirs in dep.args.items()
}
name_prefix = dep.args.get("name")
for param in transitive_params:
if param not in dep.args and param != "name":
rename_params[param] = f"{name_prefix}-{param}"
params.update(rename_params.values())
return params

def inline_dependencies(self) -> "Template":
"""Copies this template with all dependencies recursively inlined.

Expand Down
10 changes: 10 additions & 0 deletions tests/unit/test_template_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ def test_template_inline_dependencies(bm: BuildingMOTIF):
templ = lib.get_template_by_name("single-zone-vav-ahu")
assert len(templ.get_dependencies()) == 2
inlined = templ.inline_dependencies()
transitive_params = templ.transitive_parameters
assert len(inlined.get_dependencies()) == 0
preserved_params = {
"name",
Expand All @@ -116,6 +117,7 @@ def test_template_inline_dependencies(bm: BuildingMOTIF):
"oad-sen",
}
assert inlined.parameters == preserved_params
assert transitive_params == preserved_params

# test optional 'name' param on dependency; this should
# preserve optionality of all params in the dependency
Expand All @@ -125,8 +127,10 @@ def test_template_inline_dependencies(bm: BuildingMOTIF):
assert set(templ.optional_args) == {"d"}
assert len(templ.get_dependencies()) == 3
inlined = templ.inline_dependencies()
transitive_params = templ.transitive_parameters
assert len(inlined.get_dependencies()) == 0
assert inlined.parameters == {"name", "b", "c", "b-bp", "c-cp", "d", "d-dp"}
assert transitive_params == inlined.parameters
assert set(inlined.optional_args) == {"d", "d-dp"}

# test optional non-'name' parameter on dependency; this should
Expand All @@ -136,32 +140,38 @@ def test_template_inline_dependencies(bm: BuildingMOTIF):
assert set(templ.optional_args) == {"b-bp"}
assert len(templ.get_dependencies()) == 1
inlined = templ.inline_dependencies()
transitive_params = templ.transitive_parameters
assert len(inlined.get_dependencies()) == 0
assert inlined.parameters == {"name", "b", "b-bp"}
assert transitive_params == inlined.parameters
assert set(inlined.optional_args) == {"b-bp"}

# test inlining 2 or more levels
parent = lib.get_template_by_name("Parent")
assert parent.parameters == {"name", "level1"}
inlined = parent.inline_dependencies()
transitive_params = parent.transitive_parameters
assert inlined.parameters == {
"name",
"level1",
"level1-level2",
"level1-level2-level3",
}
assert transitive_params == inlined.parameters
assert len(inlined.optional_args) == 0

# test inlining 2 or more levels with optional params
parent = lib.get_template_by_name("Parent-opt")
assert parent.parameters == {"name", "level1"}
inlined = parent.inline_dependencies()
transitive_params = parent.transitive_parameters
assert inlined.parameters == {
"name",
"level1",
"level1-level2",
"level1-level2-level3",
}
assert transitive_params == inlined.parameters
assert set(inlined.optional_args) == {
"level1",
"level1-level2",
Expand Down
Loading