{"id":146986,"name":"ConStrain","description":"A data-driven knowledge-integrated framework that automatically verifies that building system controls function as intended.","url":"https://github.com/pnnl/constrain","last_synced_at":"2026-04-08T03:30:23.853Z","repository":{"id":162867500,"uuid":"626583761","full_name":"pnnl/ConStrain","owner":"pnnl","description":"Control Strainer (ConStrain) is a data-driven knowledge-integrated framework that automatically verifies that building system controls function as intended.","archived":false,"fork":false,"pushed_at":"2026-03-19T03:53:00.000Z","size":67031,"stargazers_count":9,"open_issues_count":24,"forks_count":3,"subscribers_count":7,"default_branch":"develop","last_synced_at":"2026-03-19T08:09:35.191Z","etag":null,"topics":["bms","building","commissioning","data","hvac","simulation","verification"],"latest_commit_sha":null,"homepage":"https://pnnl.github.io/ConStrain/index.html","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pnnl.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-04-11T19:00:17.000Z","updated_at":"2026-03-19T03:51:38.000Z","dependencies_parsed_at":"2023-09-27T04:17:26.798Z","dependency_job_id":"8c56ebee-7918-4ad6-9e7f-27dca42bba02","html_url":"https://github.com/pnnl/ConStrain","commit_stats":{"total_commits":549,"total_committers":9,"mean_commits":61.0,"dds":0.5992714025500911,"last_synced_commit":"001a848c4aeae042e3b8582cc55f96bc9aa5472f"},"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/pnnl/ConStrain","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pnnl%2FConStrain","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pnnl%2FConStrain/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pnnl%2FConStrain/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pnnl%2FConStrain/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pnnl","download_url":"https://codeload.github.com/pnnl/ConStrain/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pnnl%2FConStrain/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30713587,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-19T05:29:31.190Z","status":"ssl_error","status_checked_at":"2026-03-19T05:28:25.821Z","response_time":57,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"owner":{"login":"pnnl","name":"Pacific Northwest National Laboratory (Public)","uuid":"10872965","kind":"organization","description":"This Org is intended for the hosting of approved released PNNL software repositories for public use and collaboration.","email":"dev-central@pnnl.gov","website":"http://www.pnnl.gov/","location":"United States of America","twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/10872965?v=4","repositories_count":351,"last_synced_at":"2024-10-29T10:16:17.647Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/pnnl","funding_links":[],"total_stars":3780,"followers":298,"following":0,"created_at":"2022-11-09T10:22:26.506Z","updated_at":"2024-10-29T10:16:17.647Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pnnl","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pnnl/repositories"},"packages":[],"commits":{"id":1452635,"full_name":"pnnl/constrain","default_branch":"develop","total_commits":798,"total_committers":10,"total_bot_commits":2,"total_bot_committers":1,"mean_commits":79.8,"dds":0.6954887218045113,"past_year_total_commits":47,"past_year_total_committers":4,"past_year_total_bot_commits":2,"past_year_total_bot_committers":1,"past_year_mean_commits":11.75,"past_year_dds":0.4893617021276596,"last_synced_at":"2026-04-05T02:03:37.592Z","last_synced_commit":"a71906fa46dd12846a97ef1c94f2542b6f6b103d","created_at":"2023-12-06T00:09:31.779Z","updated_at":"2026-04-05T02:02:21.285Z","committers":[{"name":"Xuechen (Jerry) Lei","email":"xuechen.lei@pnnl.gov","login":"leijerry888","count":243},{"name":"Lerond, Jeremy","email":"jeremy.lerond@pnnl.gov","login":"lymereJ","count":240},{"name":"yunjoonjung","email":"yunjoon.jung@pnnl.gov","login":"yunjoonjung-PNNL","count":233},{"name":"FanFeng","email":"fengfan6696@gmail.com","login":"Fan-Feng","count":44},{"name":"Julian Slane","email":"julian.slane-holloway@pnnl.gov","login":"jslane-h","count":22},{"name":"Jeremy Lerond","email":"lero023@constance7a.local","login":null,"count":5},{"name":"Jeremy Lerond","email":"lero023@constance01.pnl.gov","login":null,"count":5},{"name":"Yan Chen","email":"yan.chen@pnnl.gov","login":"yanchenpnnl","count":3},{"name":"copilot-swe-agent[bot]","email":"198982749+Copilot","login":"Copilot","count":2},{"name":"Jeremy Lerond","email":"lero023@constance03.pnl.gov","login":null,"count":1}],"past_year_committers":[{"name":"lymereJ","email":"jeremy.lerond@gmail.com","login":"lymereJ","count":24},{"name":"yunjoonjung","email":"yunjoon.jung@pnnl.gov","login":"yunjoonjung-PNNL","count":12},{"name":"Xuechen (Jerry) Lei","email":"xuechen.lei@pnnl.gov","login":"leijerry888","count":9},{"name":"copilot-swe-agent[bot]","email":"198982749+Copilot","login":"Copilot","count":2}],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/pnnl%2Fconstrain/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-04-07T00:00:11.408Z","repositories_count":6211373,"commits_count":920244725,"contributors_count":35656387,"owners_count":1142853,"icon_url":"https://github.com/github.png","host_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories"}},"issues_stats":{"full_name":"pnnl/constrain","html_url":"https://github.com/pnnl/constrain","last_synced_at":"2026-04-05T02:01:33.450Z","status":"active","issues_count":22,"pull_requests_count":138,"avg_time_to_close_issue":1921186.5,"avg_time_to_close_pull_request":2337497.373737374,"issues_closed_count":4,"pull_requests_closed_count":99,"pull_request_authors_count":7,"issue_authors_count":8,"avg_comments_per_issue":0.2727272727272727,"avg_comments_per_pull_request":0.3115942028985507,"merged_pull_requests_count":97,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":8,"past_year_pull_requests_count":32,"past_year_avg_time_to_close_issue":857051.0,"past_year_avg_time_to_close_pull_request":1388824.7857142857,"past_year_issues_closed_count":1,"past_year_pull_requests_closed_count":14,"past_year_pull_request_authors_count":6,"past_year_issue_authors_count":6,"past_year_avg_comments_per_issue":0.5,"past_year_avg_comments_per_pull_request":0.28125,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":13,"created_at":"2023-12-06T00:09:38.735Z","updated_at":"2026-04-05T02:01:33.450Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/pnnl%2Fconstrain","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/pnnl%2Fconstrain/issues","issue_labels_count":{"bug":2},"pull_request_labels_count":{"DO NOT MERGE":2,"enhancement":1},"issue_author_associations_count":{"COLLABORATOR":17,"NONE":4,"CONTRIBUTOR":1},"pull_request_author_associations_count":{"COLLABORATOR":135,"NONE":2,"CONTRIBUTOR":1},"issue_authors":{"lymereJ":10,"leijerry888":3,"yunjoonjung-PNNL":3,"AdamRJensen":2,"FWuellhorst":1,"lazlop":1,"wehuang16":1,"jslane-h":1},"pull_request_authors":{"lymereJ":56,"leijerry888":29,"yunjoonjung-PNNL":26,"jslane-h":21,"Fan-Feng":3,"AdamRJensen":2,"Copilot":1},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-04-07T00:00:09.463Z","repositories_count":14118440,"issues_count":34499516,"pull_requests_count":112639646,"authors_count":11228092,"icon_url":"https://github.com/github.png","host_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories","owners_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/owners","authors_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors"},"past_year_issue_labels_count":{"bug":2},"past_year_pull_request_labels_count":{"DO NOT MERGE":1},"past_year_issue_author_associations_count":{"NONE":4,"COLLABORATOR":3,"CONTRIBUTOR":1},"past_year_pull_request_author_associations_count":{"COLLABORATOR":29,"NONE":2,"CONTRIBUTOR":1},"past_year_issue_authors":{"AdamRJensen":2,"leijerry888":2,"FWuellhorst":1,"lazlop":1,"lymereJ":1,"wehuang16":1},"past_year_pull_request_authors":{"leijerry888":11,"lymereJ":10,"yunjoonjung-PNNL":7,"AdamRJensen":2,"Copilot":1,"jslane-h":1},"maintainers":[{"login":"lymereJ","count":66,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/lymereJ"},{"login":"leijerry888","count":32,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/leijerry888"},{"login":"yunjoonjung-PNNL","count":29,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/yunjoonjung-PNNL"},{"login":"jslane-h","count":22,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/jslane-h"},{"login":"Fan-Feng","count":3,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/Fan-Feng"}],"active_maintainers":[{"login":"leijerry888","count":13,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/leijerry888"},{"login":"lymereJ","count":11,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/lymereJ"},{"login":"yunjoonjung-PNNL","count":7,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/yunjoonjung-PNNL"},{"login":"jslane-h","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/jslane-h"}]},"events":{"total":{"ReleaseEvent":1,"DeleteEvent":1,"PullRequestEvent":65,"ForkEvent":2,"IssuesEvent":10,"WatchEvent":4,"IssueCommentEvent":18,"PushEvent":317,"PullRequestReviewEvent":169,"PullRequestReviewCommentEvent":161,"CreateEvent":42},"last_year":{"PullRequestEvent":24,"IssuesEvent":6,"WatchEvent":3,"IssueCommentEvent":6,"PushEvent":110,"PullRequestReviewCommentEvent":30,"PullRequestReviewEvent":32,"CreateEvent":16}},"keywords":["bms","building","commissioning","data","hvac","simulation","verification"],"dependencies":[{"ecosystem":"actions","filepath":".github/workflows/docs.yml","sha":null,"kind":"manifest","created_at":"2023-09-27T04:17:26.441Z","updated_at":"2023-09-27T04:17:26.441Z","repository_link":"https://github.com/pnnl/ConStrain/blob/develop/.github/workflows/docs.yml","dependencies":[{"id":13966178657,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false},{"id":13966178658,"package_name":"actions/setup-python","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":13966178659,"package_name":"peaceiris/actions-gh-pages","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/unit_tests.yml","sha":null,"kind":"manifest","created_at":"2023-09-27T04:17:26.498Z","updated_at":"2023-09-27T04:17:26.498Z","repository_link":"https://github.com/pnnl/ConStrain/blob/develop/.github/workflows/unit_tests.yml","dependencies":[{"id":13966178660,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false},{"id":13966178661,"package_name":"actions/setup-python","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":13966178662,"package_name":"actions/upload-artifact","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"pypi","filepath":"requirements.txt","sha":null,"kind":"manifest","created_at":"2023-09-27T04:17:26.518Z","updated_at":"2023-09-27T04:17:26.518Z","repository_link":"https://github.com/pnnl/ConStrain/blob/develop/requirements.txt","dependencies":[{"id":13966178663,"package_name":"matplotlib","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":13966178664,"package_name":"seaborn","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":13966178665,"package_name":"pandas","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":13966178666,"package_name":"eppy","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":13966179287,"package_name":"fuzzywuzzy","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":13966179288,"package_name":"scikit-learn","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":13966179289,"package_name":"scipy","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":13966179290,"package_name":"tqdm","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":13966179291,"package_name":"uuid","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"pypi","filepath":"setup.py","sha":null,"kind":"manifest","created_at":"2023-09-27T04:17:26.693Z","updated_at":"2023-09-27T04:17:26.693Z","repository_link":"https://github.com/pnnl/ConStrain/blob/develop/setup.py","dependencies":[{"id":13966179304,"package_name":"numpy","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":13966179305,"package_name":"matplotlib","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":13966179306,"package_name":"pandas","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":13966179307,"package_name":"seaborn","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":13966179308,"package_name":"scipy","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":13966179309,"package_name":"eppy","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":13966179310,"package_name":"fuzzywuzzy","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":13966179311,"package_name":"tqdm","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":13966179312,"package_name":"scikit-learn","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false}]}],"score":5.799092654460527,"created_at":"2023-12-06T00:01:06.910Z","updated_at":"2026-04-08T03:30:23.868Z","avatar_url":"https://github.com/pnnl.png","language":"Jupyter Notebook","category":"Consumption","sub_category":"Buildings and Heating","monthly_downloads":0,"total_dependent_repos":0,"total_dependent_packages":0,"readme":"# \u003cspan style=\"color:orange\"\u003e_Con_\u003c/span\u003etrol \u003cspan style=\"color:orange\"\u003e_Strain_\u003c/span\u003eer (\u003cspan style=\"color:orange\"\u003e_ConStrain_\u003c/span\u003e): A Data-driven Control Verification Framework (formally known as \u003cspan style=\"color:orange\"\u003e_ANIMATE_\u003c/span\u003e)\n\n\u003c!-- # ANIMATE: a dAtadriveN buildIng perforMance verificATion framEwork --\u003e\n\nUnit tests status: ![Tests](https://github.com/pnnl/ConStrain/actions/workflows/unit_tests.yml/badge.svg)\n\n# Background and Motivation\n\nAdvances in building control have shown significant potential for improving building energy performance and decarbonization. Studies show that designs utilizing optimized controls that are properly tuned could cut commercial building energy consumption by approximately 29% - equivalent to 4-5 Quads, or 4-5% of the energy consumed in the United States. Driven by the significant control-related energy-saving potential, commercial building energy codes (such as ASHRAE 90.1) have progressed with many control-related addenda. For example, from the publication of 90.1-2004 to 90.1-2016 (four code cycles), 30% of the new requirements are related to building control (with most of them focused on HVAC system control).\n\nHowever, one of the challenges to realizing those savings is the correct implementation of such advanced control strategies and regularly verifying their actual operational performance. A field study found that only 50% of systems observed have their control system correctly configured to meet the energy codes requirement, and control-related compliance verification is typically not included in the commissioning (Cx) scope. The current control verification is often manually conducted, which is time-consuming, ad-hoc, incomplete, and error-prone.\n\n# What is _ConStrain_?\n\nConStrain is a data-driven knowledge-integrated framework that automatically verifies that controls function as intended. The figure below shows an overview of ConStrain and how it can be used. ConStrain was born out of the need of automating the verification of time-series data describing the behavior of building components, especially the control functions.\n\nConStrain is designed around three key features: building control knowledge integration, analytics, and automation. The framework includes three major components: a control verification algorithm library (rule-based, procedure-based, and AI-based), an automated preparation process and verification case generation, a standardized performance evaluation and reporting process.\n\nWhile the development of ConStrain was motivated by use cases with building energy modeling (BEM), it is now evolved for more application scenarios towards real building control verification.\n\n![Overview of ConStrain](constrain_overview.png)\n\n# Who shall be interested in this framework?\n\n- Cx agent – reduce effort and cost, while increasing rigor.\n- Building operator – implement Continuous Commissioning (CCx) to avoid performance drift.\n- Authority having jurisdiction (AHJ) – achieve better compliance rates for control provisions in code.\n- Mechanical engineer/energy modeler – ensure that chosen systems and their controls will comply with code.\n- Energy code/control guideline developer – identify ambiguity in code languages.\n- BEM software developer – identify control related issues in simulation engine.\n\n# Current Version of _ConStrain_?\n\nThe current version of ConStrain includes the framework implementation, a preliminary development and implementation of the verification library (based on ASHRAE 90.1-2016 control related requirement), and the test cases of verification algorithms using prototype building models. The current list of implemented verification algorithms includes supply air temperature control, economizer high limit, integrated economizer control, zone temperature control (dead band), zone temperature control (setback), hot water temperature reset, chilled water temperature reset, etc.\n\nA newly released API helps users to use ConStrain more easily. An API workflow demo is provided at `demo/api_demo` and `test/api/test_workflow.py`\n\nSee the Publications section for more information and example of uses of the framework.\n\n## Get Started\n\n- Demos are located in `demo/`\n- Visit [API documentation page](https://pnnl.github.io/ConStrain/) to learn about how to use the ConStrain API.\n- Visit [Guideline 36 Verification Items List](./design/g36_lib_contents.md) to learn more about the ASHRAE Guideline 36 related verification in ConStrain verification library.\n- Visit [Local Loop Verification Items List](./design/local_loop_verification_items_list.md) to learn more about local loop performance verification library.\n- Visit [Brick Integration Doc](./design/brick_integration_doc.md) to learn more about the beta version of brick schema integration API.\n\n\u003c!-- ## Note\n\n- Currently the master branch is setup to run simulation and verification batches in parralel on PNNL's PIC platform. Updates are expected to properly expose setup options for different environments and use cases.\n\n## Key files in the repository\n\n| File                                         | Description                                                                          |\n| -------------------------------------------- | ------------------------------------------------------------------------------------ |\n| src/library.py                               | verification library                                                                 |\n| src/run_sim_for_cases.py                     | idf file instrumenter and runner                                                     |\n| src/run_verification_case.py                 | batch verification cases runner                                                      |\n| src/summarize_md.py                          | batch verification cases results report generator                                    |\n| src/verification_cases_split.py              | split instantiated verification cases by idf with batch size limit                   |\n| schema/library.json                          | verification library meta data                                                       |\n| schema/library_verification_cases.json       | library verification test cases input file (outdated)                                |\n| other files in src/                          | verification framework implementation                                                |\n| test_cases/                                  | verification test cases input and related files                                      |\n| test_cases/verif_mtd_pp/create_test_cases.py | verification case instantiator                                                       |\n| demo/verification_approach_demo              | 3 different verification methods demo outputs                                        |\n| demo/library_item_demo                       | verification cases demo run in Ipython Notebook with associated case definition json | --\u003e\n\n## Publications\n\n- [Chen Y., M. Wetter, X. Lei, J. Lerond, P.K. Anand, Y. Jung, P. Ehrlich, and D.L. Vrabie. 2023. \"Control Performance Verification – The Hidden Opportunity of Ensuring High Performance of Building Control System.\" In Building Simulation 2023 Conference](https://publications.ibpsa.org/conference/paper/?id=bs2023_1660)\n- Lei X., J. Lerond, Y. Jung, and Y. Chen. 2023. \"Development of an Application Programming Interface for a Building Systems Control Performance Verification Framework.\" In 2023 ASHRAE Annual Conference\n- [Chen Y., J. Lerond, X. Lei, and M.I. Rosenberg. 2021. \"A Knowledge-based Framework for Building Energy Model Performance Verification.\" In Building Simulation 2021 Conference](https://publications.ibpsa.org/conference/paper/?id=bs2021_30725)\n\n## Referencing\n\nIf you wish to cite ConStrain in academic work please use: Lei, X., Lerond, J., Jung, Y. J., \u0026 Chen, Y. (2025). ConStrain (Version 0.6.0) [Computer software]. https://github.com/pnnl/ConStrain\n\n\u003c!-- Pending DOI for new ConStrain --\u003e\n","funding_links":[],"readme_doi_urls":[],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":[],"project_url":"https://ost.ecosyste.ms/api/v1/projects/146986","html_url":"https://ost.ecosyste.ms/projects/146986"}