Skim name conflicts - #939

Merged
jpn-- merged 14 commits into
ActivitySim:mainfrom
driftlesslabs:skim-name-conflicts
Jul 29, 2025
Merged

Skim name conflicts#939
jpn-- merged 14 commits into
ActivitySim:mainfrom
driftlesslabs:skim-name-conflicts

Conversation

@jpn--

Copy link
Copy Markdown
Member

The SkimDataset structure requires every variable to have a unique name. It also merges OMX variables based on time period, so that e.g. BIKETIME__AM and BIKETIME__PM, which would be 2-d arrays in the OMX file, become just two different parts of a 3-d array called BIKETIME in the SkimDataset. This is problematic when the skims also contain a 2-d array called BIKETIME, as that has no temporal dimension, and it gets loaded into a 2-d array in the SkimDataset, with the same name as the 3-d array, and thus one is overwritten and lost.

A workaround was added via the omx_ignore_patterns setting in #867, which allows the user to not load certain skims, but this relies on the model developer or user to set this up correctly.

This PR includes a skims input check to identify this overwriting condition, and raise an error if it is happening, so that the user can correct the condition via (1) the omx_ignore_patterns setting, (2) revising the skim generation process to not create the overlapping named skims in the file in the first place, or (3) renaming one or both skims if the users actually wants both skims variables in the model. The error message generated includes a link to instructions and discussion of these alternatives.

Enhancements to Skim Dataset Handling:

  • Added conflict detection for skim variables with both time-dependent and time-agnostic versions. If conflicts are found, the system now raises an error with detailed instructions for resolution. (activitysim/core/skim_dataset.py, activitysim/core/skim_dict_factory.py) [1][2]
  • Introduced a skim_conflicts attribute in the skim dictionary factory to track and warn about duplicate skim names and conflicts. (activitysim/core/skim_dict_factory.py) [1][2]
  • Enhanced checks for OMX file consistency, including verifying matrix shapes and ensuring unique skim names across files. (activitysim/core/skim_dict_factory.py) [1][2]

Workflow and Dependency Updates:

  • Updated the GitHub Actions workflow to allow manual triggering via workflow_dispatch while maintaining existing conditions for automatic builds. (.github/workflows/branch-docs.yml)
  • Added re and defaultdict imports to support new functionality for skim conflict detection and regex-based ignore rules. (activitysim/core/skim_dataset.py, activitysim/core/skim_dict_factory.py) [1][2]

Documentation Updates:

  • Added a new section on skims to the user guide, explaining their structure, usage, and naming conventions. Highlighted the deprecation of the three-zone system and provided recommendations for resolving skim conflicts. (docs/users-guide/model_anatomy.rst) [1][2]

These changes aim to improve the robustness of skim data handling, provide clearer guidance to users, and ensure compatibility with future updates.

@jpn--
jpn-- requested a review from dhensleMay 13, 2025 18:15

@dhensledhensle left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Code looks great and the error message output is fantastic. However, this functionality is missing a unit test. I suggest 3 parts to the CI test using omx files with duplicate names: (1) data should load but emit warning if not sharrow, (2) run should crash if using sharrow, (3) run should continue if using sharrow but omx_ignore_patterns is set correctly.

@jpn--

Copy link
Copy Markdown
MemberAuthor

@dhensle I added CI testing exactly per your recommendation. Thanks!

@jpn--
jpn-- requested a review from dhensleJuly 29, 2025 16:32

@dhensledhensle left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looks great, thanks Jeff!

@jpn--
jpn-- merged commit 1027026 into ActivitySim:mainJul 29, 2025
16 of 17 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@jpn--@dhensle
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Skim name conflicts - #939

Merged
jpn-- merged 14 commits into
ActivitySim:mainfrom
driftlesslabs:skim-name-conflicts
Jul 29, 2025
Merged

Skim name conflicts#939
jpn-- merged 14 commits into
ActivitySim:mainfrom
driftlesslabs:skim-name-conflicts

Conversation

@jpn--

Copy link
Copy Markdown
Member

The SkimDataset structure requires every variable to have a unique name. It also merges OMX variables based on time period, so that e.g. BIKETIME__AM and BIKETIME__PM, which would be 2-d arrays in the OMX file, become just two different parts of a 3-d array called BIKETIME in the SkimDataset. This is problematic when the skims also contain a 2-d array called BIKETIME, as that has no temporal dimension, and it gets loaded into a 2-d array in the SkimDataset, with the same name as the 3-d array, and thus one is overwritten and lost.

A workaround was added via the omx_ignore_patterns setting in #867, which allows the user to not load certain skims, but this relies on the model developer or user to set this up correctly.

This PR includes a skims input check to identify this overwriting condition, and raise an error if it is happening, so that the user can correct the condition via (1) the omx_ignore_patterns setting, (2) revising the skim generation process to not create the overlapping named skims in the file in the first place, or (3) renaming one or both skims if the users actually wants both skims variables in the model. The error message generated includes a link to instructions and discussion of these alternatives.

Enhancements to Skim Dataset Handling:

  • Added conflict detection for skim variables with both time-dependent and time-agnostic versions. If conflicts are found, the system now raises an error with detailed instructions for resolution. (activitysim/core/skim_dataset.py, activitysim/core/skim_dict_factory.py) [1][2]
  • Introduced a skim_conflicts attribute in the skim dictionary factory to track and warn about duplicate skim names and conflicts. (activitysim/core/skim_dict_factory.py) [1][2]
  • Enhanced checks for OMX file consistency, including verifying matrix shapes and ensuring unique skim names across files. (activitysim/core/skim_dict_factory.py) [1][2]

Workflow and Dependency Updates:

  • Updated the GitHub Actions workflow to allow manual triggering via workflow_dispatch while maintaining existing conditions for automatic builds. (.github/workflows/branch-docs.yml)
  • Added re and defaultdict imports to support new functionality for skim conflict detection and regex-based ignore rules. (activitysim/core/skim_dataset.py, activitysim/core/skim_dict_factory.py) [1][2]

Documentation Updates:

  • Added a new section on skims to the user guide, explaining their structure, usage, and naming conventions. Highlighted the deprecation of the three-zone system and provided recommendations for resolving skim conflicts. (docs/users-guide/model_anatomy.rst) [1][2]

These changes aim to improve the robustness of skim data handling, provide clearer guidance to users, and ensure compatibility with future updates.

@jpn--
jpn-- requested a review from dhensleMay 13, 2025 18:15

@dhensledhensle left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Code looks great and the error message output is fantastic. However, this functionality is missing a unit test. I suggest 3 parts to the CI test using omx files with duplicate names: (1) data should load but emit warning if not sharrow, (2) run should crash if using sharrow, (3) run should continue if using sharrow but omx_ignore_patterns is set correctly.

@jpn--

Copy link
Copy Markdown
MemberAuthor

@dhensle I added CI testing exactly per your recommendation. Thanks!

@jpn--
jpn-- requested a review from dhensleJuly 29, 2025 16:32

@dhensledhensle left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looks great, thanks Jeff!

@jpn--
jpn-- merged commit 1027026 into ActivitySim:mainJul 29, 2025
16 of 17 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@jpn--@dhensle
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Skim name conflicts - #939

Merged
jpn-- merged 14 commits into
ActivitySim:mainfrom
driftlesslabs:skim-name-conflicts
Jul 29, 2025
Merged

Skim name conflicts#939
jpn-- merged 14 commits into
ActivitySim:mainfrom
driftlesslabs:skim-name-conflicts

Conversation

@jpn--

Copy link
Copy Markdown
Member

The SkimDataset structure requires every variable to have a unique name. It also merges OMX variables based on time period, so that e.g. BIKETIME__AM and BIKETIME__PM, which would be 2-d arrays in the OMX file, become just two different parts of a 3-d array called BIKETIME in the SkimDataset. This is problematic when the skims also contain a 2-d array called BIKETIME, as that has no temporal dimension, and it gets loaded into a 2-d array in the SkimDataset, with the same name as the 3-d array, and thus one is overwritten and lost.

A workaround was added via the omx_ignore_patterns setting in #867, which allows the user to not load certain skims, but this relies on the model developer or user to set this up correctly.

This PR includes a skims input check to identify this overwriting condition, and raise an error if it is happening, so that the user can correct the condition via (1) the omx_ignore_patterns setting, (2) revising the skim generation process to not create the overlapping named skims in the file in the first place, or (3) renaming one or both skims if the users actually wants both skims variables in the model. The error message generated includes a link to instructions and discussion of these alternatives.

Enhancements to Skim Dataset Handling:

  • Added conflict detection for skim variables with both time-dependent and time-agnostic versions. If conflicts are found, the system now raises an error with detailed instructions for resolution. (activitysim/core/skim_dataset.py, activitysim/core/skim_dict_factory.py) [1][2]
  • Introduced a skim_conflicts attribute in the skim dictionary factory to track and warn about duplicate skim names and conflicts. (activitysim/core/skim_dict_factory.py) [1][2]
  • Enhanced checks for OMX file consistency, including verifying matrix shapes and ensuring unique skim names across files. (activitysim/core/skim_dict_factory.py) [1][2]

Workflow and Dependency Updates:

  • Updated the GitHub Actions workflow to allow manual triggering via workflow_dispatch while maintaining existing conditions for automatic builds. (.github/workflows/branch-docs.yml)
  • Added re and defaultdict imports to support new functionality for skim conflict detection and regex-based ignore rules. (activitysim/core/skim_dataset.py, activitysim/core/skim_dict_factory.py) [1][2]

Documentation Updates:

  • Added a new section on skims to the user guide, explaining their structure, usage, and naming conventions. Highlighted the deprecation of the three-zone system and provided recommendations for resolving skim conflicts. (docs/users-guide/model_anatomy.rst) [1][2]

These changes aim to improve the robustness of skim data handling, provide clearer guidance to users, and ensure compatibility with future updates.

@jpn--
jpn-- requested a review from dhensleMay 13, 2025 18:15

@dhensledhensle left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Code looks great and the error message output is fantastic. However, this functionality is missing a unit test. I suggest 3 parts to the CI test using omx files with duplicate names: (1) data should load but emit warning if not sharrow, (2) run should crash if using sharrow, (3) run should continue if using sharrow but omx_ignore_patterns is set correctly.

@jpn--

Copy link
Copy Markdown
MemberAuthor

@dhensle I added CI testing exactly per your recommendation. Thanks!

@jpn--
jpn-- requested a review from dhensleJuly 29, 2025 16:32

@dhensledhensle left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looks great, thanks Jeff!

@jpn--
jpn-- merged commit 1027026 into ActivitySim:mainJul 29, 2025
16 of 17 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@jpn--@dhensle
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Skim name conflicts - #939

Merged
jpn-- merged 14 commits into
ActivitySim:mainfrom
driftlesslabs:skim-name-conflicts
Jul 29, 2025
Merged

Skim name conflicts#939
jpn-- merged 14 commits into
ActivitySim:mainfrom
driftlesslabs:skim-name-conflicts

Conversation

@jpn--

Copy link
Copy Markdown
Member

The SkimDataset structure requires every variable to have a unique name. It also merges OMX variables based on time period, so that e.g. BIKETIME__AM and BIKETIME__PM, which would be 2-d arrays in the OMX file, become just two different parts of a 3-d array called BIKETIME in the SkimDataset. This is problematic when the skims also contain a 2-d array called BIKETIME, as that has no temporal dimension, and it gets loaded into a 2-d array in the SkimDataset, with the same name as the 3-d array, and thus one is overwritten and lost.

A workaround was added via the omx_ignore_patterns setting in #867, which allows the user to not load certain skims, but this relies on the model developer or user to set this up correctly.

This PR includes a skims input check to identify this overwriting condition, and raise an error if it is happening, so that the user can correct the condition via (1) the omx_ignore_patterns setting, (2) revising the skim generation process to not create the overlapping named skims in the file in the first place, or (3) renaming one or both skims if the users actually wants both skims variables in the model. The error message generated includes a link to instructions and discussion of these alternatives.

Enhancements to Skim Dataset Handling:

  • Added conflict detection for skim variables with both time-dependent and time-agnostic versions. If conflicts are found, the system now raises an error with detailed instructions for resolution. (activitysim/core/skim_dataset.py, activitysim/core/skim_dict_factory.py) [1][2]
  • Introduced a skim_conflicts attribute in the skim dictionary factory to track and warn about duplicate skim names and conflicts. (activitysim/core/skim_dict_factory.py) [1][2]
  • Enhanced checks for OMX file consistency, including verifying matrix shapes and ensuring unique skim names across files. (activitysim/core/skim_dict_factory.py) [1][2]

Workflow and Dependency Updates:

  • Updated the GitHub Actions workflow to allow manual triggering via workflow_dispatch while maintaining existing conditions for automatic builds. (.github/workflows/branch-docs.yml)
  • Added re and defaultdict imports to support new functionality for skim conflict detection and regex-based ignore rules. (activitysim/core/skim_dataset.py, activitysim/core/skim_dict_factory.py) [1][2]

Documentation Updates:

  • Added a new section on skims to the user guide, explaining their structure, usage, and naming conventions. Highlighted the deprecation of the three-zone system and provided recommendations for resolving skim conflicts. (docs/users-guide/model_anatomy.rst) [1][2]

These changes aim to improve the robustness of skim data handling, provide clearer guidance to users, and ensure compatibility with future updates.

@jpn--
jpn-- requested a review from dhensleMay 13, 2025 18:15

@dhensledhensle left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Code looks great and the error message output is fantastic. However, this functionality is missing a unit test. I suggest 3 parts to the CI test using omx files with duplicate names: (1) data should load but emit warning if not sharrow, (2) run should crash if using sharrow, (3) run should continue if using sharrow but omx_ignore_patterns is set correctly.

@jpn--

Copy link
Copy Markdown
MemberAuthor

@dhensle I added CI testing exactly per your recommendation. Thanks!

@jpn--
jpn-- requested a review from dhensleJuly 29, 2025 16:32

@dhensledhensle left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looks great, thanks Jeff!

@jpn--
jpn-- merged commit 1027026 into ActivitySim:mainJul 29, 2025
16 of 17 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@jpn--@dhensle
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Skim name conflicts - #939

Merged
jpn-- merged 14 commits into
ActivitySim:mainfrom
driftlesslabs:skim-name-conflicts
Jul 29, 2025
Merged

Skim name conflicts#939
jpn-- merged 14 commits into
ActivitySim:mainfrom
driftlesslabs:skim-name-conflicts

Conversation

@jpn--

Copy link
Copy Markdown
Member

The SkimDataset structure requires every variable to have a unique name. It also merges OMX variables based on time period, so that e.g. BIKETIME__AM and BIKETIME__PM, which would be 2-d arrays in the OMX file, become just two different parts of a 3-d array called BIKETIME in the SkimDataset. This is problematic when the skims also contain a 2-d array called BIKETIME, as that has no temporal dimension, and it gets loaded into a 2-d array in the SkimDataset, with the same name as the 3-d array, and thus one is overwritten and lost.

A workaround was added via the omx_ignore_patterns setting in #867, which allows the user to not load certain skims, but this relies on the model developer or user to set this up correctly.

This PR includes a skims input check to identify this overwriting condition, and raise an error if it is happening, so that the user can correct the condition via (1) the omx_ignore_patterns setting, (2) revising the skim generation process to not create the overlapping named skims in the file in the first place, or (3) renaming one or both skims if the users actually wants both skims variables in the model. The error message generated includes a link to instructions and discussion of these alternatives.

Enhancements to Skim Dataset Handling:

  • Added conflict detection for skim variables with both time-dependent and time-agnostic versions. If conflicts are found, the system now raises an error with detailed instructions for resolution. (activitysim/core/skim_dataset.py, activitysim/core/skim_dict_factory.py) [1][2]
  • Introduced a skim_conflicts attribute in the skim dictionary factory to track and warn about duplicate skim names and conflicts. (activitysim/core/skim_dict_factory.py) [1][2]
  • Enhanced checks for OMX file consistency, including verifying matrix shapes and ensuring unique skim names across files. (activitysim/core/skim_dict_factory.py) [1][2]

Workflow and Dependency Updates:

  • Updated the GitHub Actions workflow to allow manual triggering via workflow_dispatch while maintaining existing conditions for automatic builds. (.github/workflows/branch-docs.yml)
  • Added re and defaultdict imports to support new functionality for skim conflict detection and regex-based ignore rules. (activitysim/core/skim_dataset.py, activitysim/core/skim_dict_factory.py) [1][2]

Documentation Updates:

  • Added a new section on skims to the user guide, explaining their structure, usage, and naming conventions. Highlighted the deprecation of the three-zone system and provided recommendations for resolving skim conflicts. (docs/users-guide/model_anatomy.rst) [1][2]

These changes aim to improve the robustness of skim data handling, provide clearer guidance to users, and ensure compatibility with future updates.

@jpn--
jpn-- requested a review from dhensleMay 13, 2025 18:15

@dhensledhensle left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Code looks great and the error message output is fantastic. However, this functionality is missing a unit test. I suggest 3 parts to the CI test using omx files with duplicate names: (1) data should load but emit warning if not sharrow, (2) run should crash if using sharrow, (3) run should continue if using sharrow but omx_ignore_patterns is set correctly.

@jpn--

Copy link
Copy Markdown
MemberAuthor

@dhensle I added CI testing exactly per your recommendation. Thanks!

@jpn--
jpn-- requested a review from dhensleJuly 29, 2025 16:32

@dhensledhensle left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looks great, thanks Jeff!

@jpn--
jpn-- merged commit 1027026 into ActivitySim:mainJul 29, 2025
16 of 17 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@jpn--@dhensle
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Skim name conflicts - #939

Merged
jpn-- merged 14 commits into
ActivitySim:mainfrom
driftlesslabs:skim-name-conflicts
Jul 29, 2025
Merged

Skim name conflicts#939
jpn-- merged 14 commits into
ActivitySim:mainfrom
driftlesslabs:skim-name-conflicts

Conversation

@jpn--

Copy link
Copy Markdown
Member

The SkimDataset structure requires every variable to have a unique name. It also merges OMX variables based on time period, so that e.g. BIKETIME__AM and BIKETIME__PM, which would be 2-d arrays in the OMX file, become just two different parts of a 3-d array called BIKETIME in the SkimDataset. This is problematic when the skims also contain a 2-d array called BIKETIME, as that has no temporal dimension, and it gets loaded into a 2-d array in the SkimDataset, with the same name as the 3-d array, and thus one is overwritten and lost.

A workaround was added via the omx_ignore_patterns setting in #867, which allows the user to not load certain skims, but this relies on the model developer or user to set this up correctly.

This PR includes a skims input check to identify this overwriting condition, and raise an error if it is happening, so that the user can correct the condition via (1) the omx_ignore_patterns setting, (2) revising the skim generation process to not create the overlapping named skims in the file in the first place, or (3) renaming one or both skims if the users actually wants both skims variables in the model. The error message generated includes a link to instructions and discussion of these alternatives.

Enhancements to Skim Dataset Handling:

  • Added conflict detection for skim variables with both time-dependent and time-agnostic versions. If conflicts are found, the system now raises an error with detailed instructions for resolution. (activitysim/core/skim_dataset.py, activitysim/core/skim_dict_factory.py) [1][2]
  • Introduced a skim_conflicts attribute in the skim dictionary factory to track and warn about duplicate skim names and conflicts. (activitysim/core/skim_dict_factory.py) [1][2]
  • Enhanced checks for OMX file consistency, including verifying matrix shapes and ensuring unique skim names across files. (activitysim/core/skim_dict_factory.py) [1][2]

Workflow and Dependency Updates:

  • Updated the GitHub Actions workflow to allow manual triggering via workflow_dispatch while maintaining existing conditions for automatic builds. (.github/workflows/branch-docs.yml)
  • Added re and defaultdict imports to support new functionality for skim conflict detection and regex-based ignore rules. (activitysim/core/skim_dataset.py, activitysim/core/skim_dict_factory.py) [1][2]

Documentation Updates:

  • Added a new section on skims to the user guide, explaining their structure, usage, and naming conventions. Highlighted the deprecation of the three-zone system and provided recommendations for resolving skim conflicts. (docs/users-guide/model_anatomy.rst) [1][2]

These changes aim to improve the robustness of skim data handling, provide clearer guidance to users, and ensure compatibility with future updates.

@jpn--
jpn-- requested a review from dhensleMay 13, 2025 18:15

@dhensledhensle left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Code looks great and the error message output is fantastic. However, this functionality is missing a unit test. I suggest 3 parts to the CI test using omx files with duplicate names: (1) data should load but emit warning if not sharrow, (2) run should crash if using sharrow, (3) run should continue if using sharrow but omx_ignore_patterns is set correctly.

@jpn--

Copy link
Copy Markdown
MemberAuthor

@dhensle I added CI testing exactly per your recommendation. Thanks!

@jpn--
jpn-- requested a review from dhensleJuly 29, 2025 16:32

@dhensledhensle left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looks great, thanks Jeff!

@jpn--
jpn-- merged commit 1027026 into ActivitySim:mainJul 29, 2025
16 of 17 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@jpn--@dhensle
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Skim name conflicts - #939

Merged
jpn-- merged 14 commits into
ActivitySim:mainfrom
driftlesslabs:skim-name-conflicts
Jul 29, 2025
Merged

Skim name conflicts#939
jpn-- merged 14 commits into
ActivitySim:mainfrom
driftlesslabs:skim-name-conflicts

Conversation

@jpn--

Copy link
Copy Markdown
Member

The SkimDataset structure requires every variable to have a unique name. It also merges OMX variables based on time period, so that e.g. BIKETIME__AM and BIKETIME__PM, which would be 2-d arrays in the OMX file, become just two different parts of a 3-d array called BIKETIME in the SkimDataset. This is problematic when the skims also contain a 2-d array called BIKETIME, as that has no temporal dimension, and it gets loaded into a 2-d array in the SkimDataset, with the same name as the 3-d array, and thus one is overwritten and lost.

A workaround was added via the omx_ignore_patterns setting in #867, which allows the user to not load certain skims, but this relies on the model developer or user to set this up correctly.

This PR includes a skims input check to identify this overwriting condition, and raise an error if it is happening, so that the user can correct the condition via (1) the omx_ignore_patterns setting, (2) revising the skim generation process to not create the overlapping named skims in the file in the first place, or (3) renaming one or both skims if the users actually wants both skims variables in the model. The error message generated includes a link to instructions and discussion of these alternatives.

Enhancements to Skim Dataset Handling:

  • Added conflict detection for skim variables with both time-dependent and time-agnostic versions. If conflicts are found, the system now raises an error with detailed instructions for resolution. (activitysim/core/skim_dataset.py, activitysim/core/skim_dict_factory.py) [1][2]
  • Introduced a skim_conflicts attribute in the skim dictionary factory to track and warn about duplicate skim names and conflicts. (activitysim/core/skim_dict_factory.py) [1][2]
  • Enhanced checks for OMX file consistency, including verifying matrix shapes and ensuring unique skim names across files. (activitysim/core/skim_dict_factory.py) [1][2]

Workflow and Dependency Updates:

  • Updated the GitHub Actions workflow to allow manual triggering via workflow_dispatch while maintaining existing conditions for automatic builds. (.github/workflows/branch-docs.yml)
  • Added re and defaultdict imports to support new functionality for skim conflict detection and regex-based ignore rules. (activitysim/core/skim_dataset.py, activitysim/core/skim_dict_factory.py) [1][2]

Documentation Updates:

  • Added a new section on skims to the user guide, explaining their structure, usage, and naming conventions. Highlighted the deprecation of the three-zone system and provided recommendations for resolving skim conflicts. (docs/users-guide/model_anatomy.rst) [1][2]

These changes aim to improve the robustness of skim data handling, provide clearer guidance to users, and ensure compatibility with future updates.

@jpn--
jpn-- requested a review from dhensleMay 13, 2025 18:15

@dhensledhensle left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Code looks great and the error message output is fantastic. However, this functionality is missing a unit test. I suggest 3 parts to the CI test using omx files with duplicate names: (1) data should load but emit warning if not sharrow, (2) run should crash if using sharrow, (3) run should continue if using sharrow but omx_ignore_patterns is set correctly.

@jpn--

Copy link
Copy Markdown
MemberAuthor

@dhensle I added CI testing exactly per your recommendation. Thanks!

@jpn--
jpn-- requested a review from dhensleJuly 29, 2025 16:32

@dhensledhensle left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looks great, thanks Jeff!

@jpn--
jpn-- merged commit 1027026 into ActivitySim:mainJul 29, 2025
16 of 17 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@jpn--@dhensle
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Skim name conflicts - #939

Merged
jpn-- merged 14 commits into
ActivitySim:mainfrom
driftlesslabs:skim-name-conflicts
Jul 29, 2025
Merged

Skim name conflicts#939
jpn-- merged 14 commits into
ActivitySim:mainfrom
driftlesslabs:skim-name-conflicts

Conversation

@jpn--

Copy link
Copy Markdown
Member

The SkimDataset structure requires every variable to have a unique name. It also merges OMX variables based on time period, so that e.g. BIKETIME__AM and BIKETIME__PM, which would be 2-d arrays in the OMX file, become just two different parts of a 3-d array called BIKETIME in the SkimDataset. This is problematic when the skims also contain a 2-d array called BIKETIME, as that has no temporal dimension, and it gets loaded into a 2-d array in the SkimDataset, with the same name as the 3-d array, and thus one is overwritten and lost.

A workaround was added via the omx_ignore_patterns setting in #867, which allows the user to not load certain skims, but this relies on the model developer or user to set this up correctly.

This PR includes a skims input check to identify this overwriting condition, and raise an error if it is happening, so that the user can correct the condition via (1) the omx_ignore_patterns setting, (2) revising the skim generation process to not create the overlapping named skims in the file in the first place, or (3) renaming one or both skims if the users actually wants both skims variables in the model. The error message generated includes a link to instructions and discussion of these alternatives.

Enhancements to Skim Dataset Handling:

  • Added conflict detection for skim variables with both time-dependent and time-agnostic versions. If conflicts are found, the system now raises an error with detailed instructions for resolution. (activitysim/core/skim_dataset.py, activitysim/core/skim_dict_factory.py) [1][2]
  • Introduced a skim_conflicts attribute in the skim dictionary factory to track and warn about duplicate skim names and conflicts. (activitysim/core/skim_dict_factory.py) [1][2]
  • Enhanced checks for OMX file consistency, including verifying matrix shapes and ensuring unique skim names across files. (activitysim/core/skim_dict_factory.py) [1][2]

Workflow and Dependency Updates:

  • Updated the GitHub Actions workflow to allow manual triggering via workflow_dispatch while maintaining existing conditions for automatic builds. (.github/workflows/branch-docs.yml)
  • Added re and defaultdict imports to support new functionality for skim conflict detection and regex-based ignore rules. (activitysim/core/skim_dataset.py, activitysim/core/skim_dict_factory.py) [1][2]

Documentation Updates:

  • Added a new section on skims to the user guide, explaining their structure, usage, and naming conventions. Highlighted the deprecation of the three-zone system and provided recommendations for resolving skim conflicts. (docs/users-guide/model_anatomy.rst) [1][2]

These changes aim to improve the robustness of skim data handling, provide clearer guidance to users, and ensure compatibility with future updates.

@jpn--
jpn-- requested a review from dhensleMay 13, 2025 18:15

@dhensledhensle left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Code looks great and the error message output is fantastic. However, this functionality is missing a unit test. I suggest 3 parts to the CI test using omx files with duplicate names: (1) data should load but emit warning if not sharrow, (2) run should crash if using sharrow, (3) run should continue if using sharrow but omx_ignore_patterns is set correctly.

@jpn--

Copy link
Copy Markdown
MemberAuthor

@dhensle I added CI testing exactly per your recommendation. Thanks!

@jpn--
jpn-- requested a review from dhensleJuly 29, 2025 16:32

@dhensledhensle left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looks great, thanks Jeff!

@jpn--
jpn-- merged commit 1027026 into ActivitySim:mainJul 29, 2025
16 of 17 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@jpn--@dhensle