Support explicit_chunk for mode-choice components - #1088

Merged
jpn-- merged 3 commits into
ActivitySim:mainfrom
vincentgong7:feature/explicit-chunk-mode-choice
Aug 5, 2026
Merged

Support explicit_chunk for mode-choice components#1088
jpn-- merged 3 commits into
ActivitySim:mainfrom
vincentgong7:feature/explicit-chunk-mode-choice

Conversation

@vincentgong7

@vincentgong7vincentgong7 commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

Description

What

Plumb the existing explicit_chunk setting through to the mode-choice components
(tour_mode_choice, trip_mode_choice), matching how location, destination, and scheduling
components already use it.

Why

explicit_chunk (a fixed per-chunk chooser count, active under chunk_training_mode: explicit) lets a
component run with a deterministic, bounded memory footprint. Location/destination/scheduling
components honor it via LocationComponentSettings.explicit_chunk, but mode-choice components never
received it — the field didn't exist on their settings class and mode_choice_simulate /
simple_simulate neither accepted nor forwarded it.

On memory-constrained machines the adaptive chunker grows each chunk toward its memory budget, so peak
RSS is roughly constant regardless of sample size — which can OOM large models even after subsampling.
Fixed explicit_chunk sizes bound the peak. This change makes that strategy usable for mode choice too;
for us it was the last unchunkable core step when fitting a full-sample run (8.1M trips, 7787 zones) onto
a 64 GB node.

What changed (backward-compatible — default 0 = unchanged behavior)

  • TemplatedLogitComponentSettings: new explicit_chunk: float = 0 field (the base for mode-choice
    settings; mirrors the field already on LocationComponentSettings).
  • mode_choice_simulate(...): new explicit_chunk_size parameter, forwarded to simple_simulate.
  • run_tour_mode_choice_simulate(...) and trip_mode_choice(...): pass
    explicit_chunk_size=model_settings.explicit_chunk.
  • simple_simulate(...): new explicit_chunk_size parameter, forwarded to
    chunk.adaptive_chunked_choosers.

4 files changed, 16 insertions(+), 1 deletion(-).

Usage

# settings.yamlchunk_training_mode: explicit# tour_mode_choice.yaml / trip_mode_choice.yamlexplicit_chunk: 5000

Testing

Verified on a full-sample run (8.1M trips, 7787 zones) on a 64 GB node: tour/trip mode choice ran with a
bounded per-chunk memory footprint under explicit_chunk: 5000; with the default (0) behavior is
identical to before.

Acknowledgement

This work was supported by the XCarcity project. https://xcarcity.nl

Location, destination, and scheduling components already honor the
`explicit_chunk` setting (a fixed chunk size, used when
chunk_training_mode: explicit), but mode-choice components did not:
the setting was never plumbed from the component settings into
simple_simulate's chunk loop.
This wires it through: add `explicit_chunk` to
TemplatedLogitComponentSettings (the base for mode-choice settings),
and pass it via mode_choice_simulate -> simple_simulate ->
adaptive_chunked_choosers. Defaults to 0 (unchanged behavior).
This lets tour_mode_choice and trip_mode_choice run with a fixed,
bounded per-chunk memory footprint, which is what makes large samples
fit on memory-constrained machines under chunk_training_mode: explicit.

CopilotAI 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.

Pull request overview

This PR extends ActivitySim’s existing explicit_chunk chunking control to mode-choice components, allowing deterministic, bounded chooser chunk sizes during tour/trip mode choice simulation (via chunk_training_mode: explicit).

Changes:

  • Add explicit_chunk to TemplatedLogitComponentSettings so mode-choice settings can declare fixed chunk sizing.
  • Add/forward explicit_chunk_size through mode_choice_simulate(...) and simple_simulate(...) into chunk.adaptive_chunked_choosers(...).
  • Wire model_settings.explicit_chunk into tour and trip mode choice simulation calls.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.

FileDescription
activitysim/core/simulate.pyAdds explicit_chunk_size to simple_simulate and forwards it to the chooser chunking generator.
activitysim/core/configuration/logit.pyAdds explicit_chunk to TemplatedLogitComponentSettings so templated/segmented logit components (incl. mode choice) can configure fixed chunking.
activitysim/abm/models/util/mode.pyThreads explicit_chunk_size through mode_choice_simulate and passes model_settings.explicit_chunk from tour mode choice runner.
activitysim/abm/models/trip_mode_choice.pyPasses model_settings.explicit_chunk into mode_choice_simulate for trip mode choice.
Comments suppressed due to low confidence (1)

activitysim/abm/models/util/mode.py:43

  • The mode_choice_simulate docstring parameter list is now out of sync with the function signature: it still mentions chunk_size (which is not a parameter) and doesn't document explicit_chunk_size or the updated optional type for compute_settings. This can mislead callers when enabling explicit chunking.
 explicit_chunk_size: float = 0,
):
"""
common method for both tour_mode_choice and trip_mode_choice

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@vincentgong7

Copy link
Copy Markdown
ContributorAuthor

Hi @jpn-- , I wonder if you can check this PR. If everything is good, can it be merged?

jpn--and others added 2 commits July 30, 2026 14:08
Remove the stale `chunk_size` entry (not a parameter), mark compute_settings
as optional, and document the new explicit_chunk_size argument. Addresses the
automated review note on PR ActivitySim#1088.
vincentgong7 added a commit to vincentgong7/activitysim that referenced this pull request Jul 31, 2026
Remove the stale `chunk_size` entry (not a parameter), mark compute_settings
as optional, and document the new explicit_chunk_size argument. Addresses the
automated review note on PR ActivitySim#1088.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@vincentgong7
vincentgong7force-pushed the feature/explicit-chunk-mode-choice branch from 779fc91 to 706bc39CompareJuly 31, 2026 11:53
@vincentgong7

Copy link
Copy Markdown
ContributorAuthor

Synced the mode_choice_simulate docstring in 706bc39 to address the automated review note: removed the stale chunk_size entry (no longer a parameter), documented the new explicit_chunk_size argument, and marked compute_settings as optional. No functional change. CI is green and the PR is mergeable — @jpn-- would appreciate a review/merge when you have a moment. Thanks!

@jpn--
jpn-- merged commit da0d9b1 into ActivitySim:mainAug 5, 2026
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.

3 participants

@vincentgong7@jpn--
, '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

Support explicit_chunk for mode-choice components - #1088

Merged
jpn-- merged 3 commits into
ActivitySim:mainfrom
vincentgong7:feature/explicit-chunk-mode-choice
Aug 5, 2026
Merged

Support explicit_chunk for mode-choice components#1088
jpn-- merged 3 commits into
ActivitySim:mainfrom
vincentgong7:feature/explicit-chunk-mode-choice

Conversation

@vincentgong7

@vincentgong7vincentgong7 commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

Description

What

Plumb the existing explicit_chunk setting through to the mode-choice components
(tour_mode_choice, trip_mode_choice), matching how location, destination, and scheduling
components already use it.

Why

explicit_chunk (a fixed per-chunk chooser count, active under chunk_training_mode: explicit) lets a
component run with a deterministic, bounded memory footprint. Location/destination/scheduling
components honor it via LocationComponentSettings.explicit_chunk, but mode-choice components never
received it — the field didn't exist on their settings class and mode_choice_simulate /
simple_simulate neither accepted nor forwarded it.

On memory-constrained machines the adaptive chunker grows each chunk toward its memory budget, so peak
RSS is roughly constant regardless of sample size — which can OOM large models even after subsampling.
Fixed explicit_chunk sizes bound the peak. This change makes that strategy usable for mode choice too;
for us it was the last unchunkable core step when fitting a full-sample run (8.1M trips, 7787 zones) onto
a 64 GB node.

What changed (backward-compatible — default 0 = unchanged behavior)

  • TemplatedLogitComponentSettings: new explicit_chunk: float = 0 field (the base for mode-choice
    settings; mirrors the field already on LocationComponentSettings).
  • mode_choice_simulate(...): new explicit_chunk_size parameter, forwarded to simple_simulate.
  • run_tour_mode_choice_simulate(...) and trip_mode_choice(...): pass
    explicit_chunk_size=model_settings.explicit_chunk.
  • simple_simulate(...): new explicit_chunk_size parameter, forwarded to
    chunk.adaptive_chunked_choosers.

4 files changed, 16 insertions(+), 1 deletion(-).

Usage

# settings.yamlchunk_training_mode: explicit# tour_mode_choice.yaml / trip_mode_choice.yamlexplicit_chunk: 5000

Testing

Verified on a full-sample run (8.1M trips, 7787 zones) on a 64 GB node: tour/trip mode choice ran with a
bounded per-chunk memory footprint under explicit_chunk: 5000; with the default (0) behavior is
identical to before.

Acknowledgement

This work was supported by the XCarcity project. https://xcarcity.nl

Location, destination, and scheduling components already honor the
`explicit_chunk` setting (a fixed chunk size, used when
chunk_training_mode: explicit), but mode-choice components did not:
the setting was never plumbed from the component settings into
simple_simulate's chunk loop.
This wires it through: add `explicit_chunk` to
TemplatedLogitComponentSettings (the base for mode-choice settings),
and pass it via mode_choice_simulate -> simple_simulate ->
adaptive_chunked_choosers. Defaults to 0 (unchanged behavior).
This lets tour_mode_choice and trip_mode_choice run with a fixed,
bounded per-chunk memory footprint, which is what makes large samples
fit on memory-constrained machines under chunk_training_mode: explicit.

CopilotAI 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.

Pull request overview

This PR extends ActivitySim’s existing explicit_chunk chunking control to mode-choice components, allowing deterministic, bounded chooser chunk sizes during tour/trip mode choice simulation (via chunk_training_mode: explicit).

Changes:

  • Add explicit_chunk to TemplatedLogitComponentSettings so mode-choice settings can declare fixed chunk sizing.
  • Add/forward explicit_chunk_size through mode_choice_simulate(...) and simple_simulate(...) into chunk.adaptive_chunked_choosers(...).
  • Wire model_settings.explicit_chunk into tour and trip mode choice simulation calls.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.

FileDescription
activitysim/core/simulate.pyAdds explicit_chunk_size to simple_simulate and forwards it to the chooser chunking generator.
activitysim/core/configuration/logit.pyAdds explicit_chunk to TemplatedLogitComponentSettings so templated/segmented logit components (incl. mode choice) can configure fixed chunking.
activitysim/abm/models/util/mode.pyThreads explicit_chunk_size through mode_choice_simulate and passes model_settings.explicit_chunk from tour mode choice runner.
activitysim/abm/models/trip_mode_choice.pyPasses model_settings.explicit_chunk into mode_choice_simulate for trip mode choice.
Comments suppressed due to low confidence (1)

activitysim/abm/models/util/mode.py:43

  • The mode_choice_simulate docstring parameter list is now out of sync with the function signature: it still mentions chunk_size (which is not a parameter) and doesn't document explicit_chunk_size or the updated optional type for compute_settings. This can mislead callers when enabling explicit chunking.
 explicit_chunk_size: float = 0,
):
"""
common method for both tour_mode_choice and trip_mode_choice

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@vincentgong7

Copy link
Copy Markdown
ContributorAuthor

Hi @jpn-- , I wonder if you can check this PR. If everything is good, can it be merged?

jpn--and others added 2 commits July 30, 2026 14:08
Remove the stale `chunk_size` entry (not a parameter), mark compute_settings
as optional, and document the new explicit_chunk_size argument. Addresses the
automated review note on PR ActivitySim#1088.
vincentgong7 added a commit to vincentgong7/activitysim that referenced this pull request Jul 31, 2026
Remove the stale `chunk_size` entry (not a parameter), mark compute_settings
as optional, and document the new explicit_chunk_size argument. Addresses the
automated review note on PR ActivitySim#1088.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@vincentgong7
vincentgong7force-pushed the feature/explicit-chunk-mode-choice branch from 779fc91 to 706bc39CompareJuly 31, 2026 11:53
@vincentgong7

Copy link
Copy Markdown
ContributorAuthor

Synced the mode_choice_simulate docstring in 706bc39 to address the automated review note: removed the stale chunk_size entry (no longer a parameter), documented the new explicit_chunk_size argument, and marked compute_settings as optional. No functional change. CI is green and the PR is mergeable — @jpn-- would appreciate a review/merge when you have a moment. Thanks!

@jpn--
jpn-- merged commit da0d9b1 into ActivitySim:mainAug 5, 2026
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.

3 participants

@vincentgong7@jpn--
, '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

Support explicit_chunk for mode-choice components - #1088

Merged
jpn-- merged 3 commits into
ActivitySim:mainfrom
vincentgong7:feature/explicit-chunk-mode-choice
Aug 5, 2026
Merged

Support explicit_chunk for mode-choice components#1088
jpn-- merged 3 commits into
ActivitySim:mainfrom
vincentgong7:feature/explicit-chunk-mode-choice

Conversation

@vincentgong7

@vincentgong7vincentgong7 commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

Description

What

Plumb the existing explicit_chunk setting through to the mode-choice components
(tour_mode_choice, trip_mode_choice), matching how location, destination, and scheduling
components already use it.

Why

explicit_chunk (a fixed per-chunk chooser count, active under chunk_training_mode: explicit) lets a
component run with a deterministic, bounded memory footprint. Location/destination/scheduling
components honor it via LocationComponentSettings.explicit_chunk, but mode-choice components never
received it — the field didn't exist on their settings class and mode_choice_simulate /
simple_simulate neither accepted nor forwarded it.

On memory-constrained machines the adaptive chunker grows each chunk toward its memory budget, so peak
RSS is roughly constant regardless of sample size — which can OOM large models even after subsampling.
Fixed explicit_chunk sizes bound the peak. This change makes that strategy usable for mode choice too;
for us it was the last unchunkable core step when fitting a full-sample run (8.1M trips, 7787 zones) onto
a 64 GB node.

What changed (backward-compatible — default 0 = unchanged behavior)

  • TemplatedLogitComponentSettings: new explicit_chunk: float = 0 field (the base for mode-choice
    settings; mirrors the field already on LocationComponentSettings).
  • mode_choice_simulate(...): new explicit_chunk_size parameter, forwarded to simple_simulate.
  • run_tour_mode_choice_simulate(...) and trip_mode_choice(...): pass
    explicit_chunk_size=model_settings.explicit_chunk.
  • simple_simulate(...): new explicit_chunk_size parameter, forwarded to
    chunk.adaptive_chunked_choosers.

4 files changed, 16 insertions(+), 1 deletion(-).

Usage

# settings.yamlchunk_training_mode: explicit# tour_mode_choice.yaml / trip_mode_choice.yamlexplicit_chunk: 5000

Testing

Verified on a full-sample run (8.1M trips, 7787 zones) on a 64 GB node: tour/trip mode choice ran with a
bounded per-chunk memory footprint under explicit_chunk: 5000; with the default (0) behavior is
identical to before.

Acknowledgement

This work was supported by the XCarcity project. https://xcarcity.nl

Location, destination, and scheduling components already honor the
`explicit_chunk` setting (a fixed chunk size, used when
chunk_training_mode: explicit), but mode-choice components did not:
the setting was never plumbed from the component settings into
simple_simulate's chunk loop.
This wires it through: add `explicit_chunk` to
TemplatedLogitComponentSettings (the base for mode-choice settings),
and pass it via mode_choice_simulate -> simple_simulate ->
adaptive_chunked_choosers. Defaults to 0 (unchanged behavior).
This lets tour_mode_choice and trip_mode_choice run with a fixed,
bounded per-chunk memory footprint, which is what makes large samples
fit on memory-constrained machines under chunk_training_mode: explicit.

CopilotAI 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.

Pull request overview

This PR extends ActivitySim’s existing explicit_chunk chunking control to mode-choice components, allowing deterministic, bounded chooser chunk sizes during tour/trip mode choice simulation (via chunk_training_mode: explicit).

Changes:

  • Add explicit_chunk to TemplatedLogitComponentSettings so mode-choice settings can declare fixed chunk sizing.
  • Add/forward explicit_chunk_size through mode_choice_simulate(...) and simple_simulate(...) into chunk.adaptive_chunked_choosers(...).
  • Wire model_settings.explicit_chunk into tour and trip mode choice simulation calls.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.

FileDescription
activitysim/core/simulate.pyAdds explicit_chunk_size to simple_simulate and forwards it to the chooser chunking generator.
activitysim/core/configuration/logit.pyAdds explicit_chunk to TemplatedLogitComponentSettings so templated/segmented logit components (incl. mode choice) can configure fixed chunking.
activitysim/abm/models/util/mode.pyThreads explicit_chunk_size through mode_choice_simulate and passes model_settings.explicit_chunk from tour mode choice runner.
activitysim/abm/models/trip_mode_choice.pyPasses model_settings.explicit_chunk into mode_choice_simulate for trip mode choice.
Comments suppressed due to low confidence (1)

activitysim/abm/models/util/mode.py:43

  • The mode_choice_simulate docstring parameter list is now out of sync with the function signature: it still mentions chunk_size (which is not a parameter) and doesn't document explicit_chunk_size or the updated optional type for compute_settings. This can mislead callers when enabling explicit chunking.
 explicit_chunk_size: float = 0,
):
"""
common method for both tour_mode_choice and trip_mode_choice

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@vincentgong7

Copy link
Copy Markdown
ContributorAuthor

Hi @jpn-- , I wonder if you can check this PR. If everything is good, can it be merged?

jpn--and others added 2 commits July 30, 2026 14:08
Remove the stale `chunk_size` entry (not a parameter), mark compute_settings
as optional, and document the new explicit_chunk_size argument. Addresses the
automated review note on PR ActivitySim#1088.
vincentgong7 added a commit to vincentgong7/activitysim that referenced this pull request Jul 31, 2026
Remove the stale `chunk_size` entry (not a parameter), mark compute_settings
as optional, and document the new explicit_chunk_size argument. Addresses the
automated review note on PR ActivitySim#1088.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@vincentgong7
vincentgong7force-pushed the feature/explicit-chunk-mode-choice branch from 779fc91 to 706bc39CompareJuly 31, 2026 11:53
@vincentgong7

Copy link
Copy Markdown
ContributorAuthor

Synced the mode_choice_simulate docstring in 706bc39 to address the automated review note: removed the stale chunk_size entry (no longer a parameter), documented the new explicit_chunk_size argument, and marked compute_settings as optional. No functional change. CI is green and the PR is mergeable — @jpn-- would appreciate a review/merge when you have a moment. Thanks!

@jpn--
jpn-- merged commit da0d9b1 into ActivitySim:mainAug 5, 2026
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.

3 participants

@vincentgong7@jpn--
, '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

Support explicit_chunk for mode-choice components - #1088

Merged
jpn-- merged 3 commits into
ActivitySim:mainfrom
vincentgong7:feature/explicit-chunk-mode-choice
Aug 5, 2026
Merged

Support explicit_chunk for mode-choice components#1088
jpn-- merged 3 commits into
ActivitySim:mainfrom
vincentgong7:feature/explicit-chunk-mode-choice

Conversation

@vincentgong7

@vincentgong7vincentgong7 commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

Description

What

Plumb the existing explicit_chunk setting through to the mode-choice components
(tour_mode_choice, trip_mode_choice), matching how location, destination, and scheduling
components already use it.

Why

explicit_chunk (a fixed per-chunk chooser count, active under chunk_training_mode: explicit) lets a
component run with a deterministic, bounded memory footprint. Location/destination/scheduling
components honor it via LocationComponentSettings.explicit_chunk, but mode-choice components never
received it — the field didn't exist on their settings class and mode_choice_simulate /
simple_simulate neither accepted nor forwarded it.

On memory-constrained machines the adaptive chunker grows each chunk toward its memory budget, so peak
RSS is roughly constant regardless of sample size — which can OOM large models even after subsampling.
Fixed explicit_chunk sizes bound the peak. This change makes that strategy usable for mode choice too;
for us it was the last unchunkable core step when fitting a full-sample run (8.1M trips, 7787 zones) onto
a 64 GB node.

What changed (backward-compatible — default 0 = unchanged behavior)

  • TemplatedLogitComponentSettings: new explicit_chunk: float = 0 field (the base for mode-choice
    settings; mirrors the field already on LocationComponentSettings).
  • mode_choice_simulate(...): new explicit_chunk_size parameter, forwarded to simple_simulate.
  • run_tour_mode_choice_simulate(...) and trip_mode_choice(...): pass
    explicit_chunk_size=model_settings.explicit_chunk.
  • simple_simulate(...): new explicit_chunk_size parameter, forwarded to
    chunk.adaptive_chunked_choosers.

4 files changed, 16 insertions(+), 1 deletion(-).

Usage

# settings.yamlchunk_training_mode: explicit# tour_mode_choice.yaml / trip_mode_choice.yamlexplicit_chunk: 5000

Testing

Verified on a full-sample run (8.1M trips, 7787 zones) on a 64 GB node: tour/trip mode choice ran with a
bounded per-chunk memory footprint under explicit_chunk: 5000; with the default (0) behavior is
identical to before.

Acknowledgement

This work was supported by the XCarcity project. https://xcarcity.nl

Location, destination, and scheduling components already honor the
`explicit_chunk` setting (a fixed chunk size, used when
chunk_training_mode: explicit), but mode-choice components did not:
the setting was never plumbed from the component settings into
simple_simulate's chunk loop.
This wires it through: add `explicit_chunk` to
TemplatedLogitComponentSettings (the base for mode-choice settings),
and pass it via mode_choice_simulate -> simple_simulate ->
adaptive_chunked_choosers. Defaults to 0 (unchanged behavior).
This lets tour_mode_choice and trip_mode_choice run with a fixed,
bounded per-chunk memory footprint, which is what makes large samples
fit on memory-constrained machines under chunk_training_mode: explicit.

CopilotAI 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.

Pull request overview

This PR extends ActivitySim’s existing explicit_chunk chunking control to mode-choice components, allowing deterministic, bounded chooser chunk sizes during tour/trip mode choice simulation (via chunk_training_mode: explicit).

Changes:

  • Add explicit_chunk to TemplatedLogitComponentSettings so mode-choice settings can declare fixed chunk sizing.
  • Add/forward explicit_chunk_size through mode_choice_simulate(...) and simple_simulate(...) into chunk.adaptive_chunked_choosers(...).
  • Wire model_settings.explicit_chunk into tour and trip mode choice simulation calls.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.

FileDescription
activitysim/core/simulate.pyAdds explicit_chunk_size to simple_simulate and forwards it to the chooser chunking generator.
activitysim/core/configuration/logit.pyAdds explicit_chunk to TemplatedLogitComponentSettings so templated/segmented logit components (incl. mode choice) can configure fixed chunking.
activitysim/abm/models/util/mode.pyThreads explicit_chunk_size through mode_choice_simulate and passes model_settings.explicit_chunk from tour mode choice runner.
activitysim/abm/models/trip_mode_choice.pyPasses model_settings.explicit_chunk into mode_choice_simulate for trip mode choice.
Comments suppressed due to low confidence (1)

activitysim/abm/models/util/mode.py:43

  • The mode_choice_simulate docstring parameter list is now out of sync with the function signature: it still mentions chunk_size (which is not a parameter) and doesn't document explicit_chunk_size or the updated optional type for compute_settings. This can mislead callers when enabling explicit chunking.
 explicit_chunk_size: float = 0,
):
"""
common method for both tour_mode_choice and trip_mode_choice

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@vincentgong7

Copy link
Copy Markdown
ContributorAuthor

Hi @jpn-- , I wonder if you can check this PR. If everything is good, can it be merged?

jpn--and others added 2 commits July 30, 2026 14:08
Remove the stale `chunk_size` entry (not a parameter), mark compute_settings
as optional, and document the new explicit_chunk_size argument. Addresses the
automated review note on PR ActivitySim#1088.
vincentgong7 added a commit to vincentgong7/activitysim that referenced this pull request Jul 31, 2026
Remove the stale `chunk_size` entry (not a parameter), mark compute_settings
as optional, and document the new explicit_chunk_size argument. Addresses the
automated review note on PR ActivitySim#1088.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@vincentgong7
vincentgong7force-pushed the feature/explicit-chunk-mode-choice branch from 779fc91 to 706bc39CompareJuly 31, 2026 11:53
@vincentgong7

Copy link
Copy Markdown
ContributorAuthor

Synced the mode_choice_simulate docstring in 706bc39 to address the automated review note: removed the stale chunk_size entry (no longer a parameter), documented the new explicit_chunk_size argument, and marked compute_settings as optional. No functional change. CI is green and the PR is mergeable — @jpn-- would appreciate a review/merge when you have a moment. Thanks!

@jpn--
jpn-- merged commit da0d9b1 into ActivitySim:mainAug 5, 2026
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.

3 participants

@vincentgong7@jpn--
, '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

Support explicit_chunk for mode-choice components - #1088

Merged
jpn-- merged 3 commits into
ActivitySim:mainfrom
vincentgong7:feature/explicit-chunk-mode-choice
Aug 5, 2026
Merged

Support explicit_chunk for mode-choice components#1088
jpn-- merged 3 commits into
ActivitySim:mainfrom
vincentgong7:feature/explicit-chunk-mode-choice

Conversation

@vincentgong7

@vincentgong7vincentgong7 commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

Description

What

Plumb the existing explicit_chunk setting through to the mode-choice components
(tour_mode_choice, trip_mode_choice), matching how location, destination, and scheduling
components already use it.

Why

explicit_chunk (a fixed per-chunk chooser count, active under chunk_training_mode: explicit) lets a
component run with a deterministic, bounded memory footprint. Location/destination/scheduling
components honor it via LocationComponentSettings.explicit_chunk, but mode-choice components never
received it — the field didn't exist on their settings class and mode_choice_simulate /
simple_simulate neither accepted nor forwarded it.

On memory-constrained machines the adaptive chunker grows each chunk toward its memory budget, so peak
RSS is roughly constant regardless of sample size — which can OOM large models even after subsampling.
Fixed explicit_chunk sizes bound the peak. This change makes that strategy usable for mode choice too;
for us it was the last unchunkable core step when fitting a full-sample run (8.1M trips, 7787 zones) onto
a 64 GB node.

What changed (backward-compatible — default 0 = unchanged behavior)

  • TemplatedLogitComponentSettings: new explicit_chunk: float = 0 field (the base for mode-choice
    settings; mirrors the field already on LocationComponentSettings).
  • mode_choice_simulate(...): new explicit_chunk_size parameter, forwarded to simple_simulate.
  • run_tour_mode_choice_simulate(...) and trip_mode_choice(...): pass
    explicit_chunk_size=model_settings.explicit_chunk.
  • simple_simulate(...): new explicit_chunk_size parameter, forwarded to
    chunk.adaptive_chunked_choosers.

4 files changed, 16 insertions(+), 1 deletion(-).

Usage

# settings.yamlchunk_training_mode: explicit# tour_mode_choice.yaml / trip_mode_choice.yamlexplicit_chunk: 5000

Testing

Verified on a full-sample run (8.1M trips, 7787 zones) on a 64 GB node: tour/trip mode choice ran with a
bounded per-chunk memory footprint under explicit_chunk: 5000; with the default (0) behavior is
identical to before.

Acknowledgement

This work was supported by the XCarcity project. https://xcarcity.nl

Location, destination, and scheduling components already honor the
`explicit_chunk` setting (a fixed chunk size, used when
chunk_training_mode: explicit), but mode-choice components did not:
the setting was never plumbed from the component settings into
simple_simulate's chunk loop.
This wires it through: add `explicit_chunk` to
TemplatedLogitComponentSettings (the base for mode-choice settings),
and pass it via mode_choice_simulate -> simple_simulate ->
adaptive_chunked_choosers. Defaults to 0 (unchanged behavior).
This lets tour_mode_choice and trip_mode_choice run with a fixed,
bounded per-chunk memory footprint, which is what makes large samples
fit on memory-constrained machines under chunk_training_mode: explicit.

CopilotAI 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.

Pull request overview

This PR extends ActivitySim’s existing explicit_chunk chunking control to mode-choice components, allowing deterministic, bounded chooser chunk sizes during tour/trip mode choice simulation (via chunk_training_mode: explicit).

Changes:

  • Add explicit_chunk to TemplatedLogitComponentSettings so mode-choice settings can declare fixed chunk sizing.
  • Add/forward explicit_chunk_size through mode_choice_simulate(...) and simple_simulate(...) into chunk.adaptive_chunked_choosers(...).
  • Wire model_settings.explicit_chunk into tour and trip mode choice simulation calls.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.

FileDescription
activitysim/core/simulate.pyAdds explicit_chunk_size to simple_simulate and forwards it to the chooser chunking generator.
activitysim/core/configuration/logit.pyAdds explicit_chunk to TemplatedLogitComponentSettings so templated/segmented logit components (incl. mode choice) can configure fixed chunking.
activitysim/abm/models/util/mode.pyThreads explicit_chunk_size through mode_choice_simulate and passes model_settings.explicit_chunk from tour mode choice runner.
activitysim/abm/models/trip_mode_choice.pyPasses model_settings.explicit_chunk into mode_choice_simulate for trip mode choice.
Comments suppressed due to low confidence (1)

activitysim/abm/models/util/mode.py:43

  • The mode_choice_simulate docstring parameter list is now out of sync with the function signature: it still mentions chunk_size (which is not a parameter) and doesn't document explicit_chunk_size or the updated optional type for compute_settings. This can mislead callers when enabling explicit chunking.
 explicit_chunk_size: float = 0,
):
"""
common method for both tour_mode_choice and trip_mode_choice

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@vincentgong7

Copy link
Copy Markdown
ContributorAuthor

Hi @jpn-- , I wonder if you can check this PR. If everything is good, can it be merged?

jpn--and others added 2 commits July 30, 2026 14:08
Remove the stale `chunk_size` entry (not a parameter), mark compute_settings
as optional, and document the new explicit_chunk_size argument. Addresses the
automated review note on PR ActivitySim#1088.
vincentgong7 added a commit to vincentgong7/activitysim that referenced this pull request Jul 31, 2026
Remove the stale `chunk_size` entry (not a parameter), mark compute_settings
as optional, and document the new explicit_chunk_size argument. Addresses the
automated review note on PR ActivitySim#1088.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@vincentgong7
vincentgong7force-pushed the feature/explicit-chunk-mode-choice branch from 779fc91 to 706bc39CompareJuly 31, 2026 11:53
@vincentgong7

Copy link
Copy Markdown
ContributorAuthor

Synced the mode_choice_simulate docstring in 706bc39 to address the automated review note: removed the stale chunk_size entry (no longer a parameter), documented the new explicit_chunk_size argument, and marked compute_settings as optional. No functional change. CI is green and the PR is mergeable — @jpn-- would appreciate a review/merge when you have a moment. Thanks!

@jpn--
jpn-- merged commit da0d9b1 into ActivitySim:mainAug 5, 2026
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.

3 participants

@vincentgong7@jpn--
, '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

Support explicit_chunk for mode-choice components - #1088

Merged
jpn-- merged 3 commits into
ActivitySim:mainfrom
vincentgong7:feature/explicit-chunk-mode-choice
Aug 5, 2026
Merged

Support explicit_chunk for mode-choice components#1088
jpn-- merged 3 commits into
ActivitySim:mainfrom
vincentgong7:feature/explicit-chunk-mode-choice

Conversation

@vincentgong7

@vincentgong7vincentgong7 commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

Description

What

Plumb the existing explicit_chunk setting through to the mode-choice components
(tour_mode_choice, trip_mode_choice), matching how location, destination, and scheduling
components already use it.

Why

explicit_chunk (a fixed per-chunk chooser count, active under chunk_training_mode: explicit) lets a
component run with a deterministic, bounded memory footprint. Location/destination/scheduling
components honor it via LocationComponentSettings.explicit_chunk, but mode-choice components never
received it — the field didn't exist on their settings class and mode_choice_simulate /
simple_simulate neither accepted nor forwarded it.

On memory-constrained machines the adaptive chunker grows each chunk toward its memory budget, so peak
RSS is roughly constant regardless of sample size — which can OOM large models even after subsampling.
Fixed explicit_chunk sizes bound the peak. This change makes that strategy usable for mode choice too;
for us it was the last unchunkable core step when fitting a full-sample run (8.1M trips, 7787 zones) onto
a 64 GB node.

What changed (backward-compatible — default 0 = unchanged behavior)

  • TemplatedLogitComponentSettings: new explicit_chunk: float = 0 field (the base for mode-choice
    settings; mirrors the field already on LocationComponentSettings).
  • mode_choice_simulate(...): new explicit_chunk_size parameter, forwarded to simple_simulate.
  • run_tour_mode_choice_simulate(...) and trip_mode_choice(...): pass
    explicit_chunk_size=model_settings.explicit_chunk.
  • simple_simulate(...): new explicit_chunk_size parameter, forwarded to
    chunk.adaptive_chunked_choosers.

4 files changed, 16 insertions(+), 1 deletion(-).

Usage

# settings.yamlchunk_training_mode: explicit# tour_mode_choice.yaml / trip_mode_choice.yamlexplicit_chunk: 5000

Testing

Verified on a full-sample run (8.1M trips, 7787 zones) on a 64 GB node: tour/trip mode choice ran with a
bounded per-chunk memory footprint under explicit_chunk: 5000; with the default (0) behavior is
identical to before.

Acknowledgement

This work was supported by the XCarcity project. https://xcarcity.nl

Location, destination, and scheduling components already honor the
`explicit_chunk` setting (a fixed chunk size, used when
chunk_training_mode: explicit), but mode-choice components did not:
the setting was never plumbed from the component settings into
simple_simulate's chunk loop.
This wires it through: add `explicit_chunk` to
TemplatedLogitComponentSettings (the base for mode-choice settings),
and pass it via mode_choice_simulate -> simple_simulate ->
adaptive_chunked_choosers. Defaults to 0 (unchanged behavior).
This lets tour_mode_choice and trip_mode_choice run with a fixed,
bounded per-chunk memory footprint, which is what makes large samples
fit on memory-constrained machines under chunk_training_mode: explicit.

CopilotAI 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.

Pull request overview

This PR extends ActivitySim’s existing explicit_chunk chunking control to mode-choice components, allowing deterministic, bounded chooser chunk sizes during tour/trip mode choice simulation (via chunk_training_mode: explicit).

Changes:

  • Add explicit_chunk to TemplatedLogitComponentSettings so mode-choice settings can declare fixed chunk sizing.
  • Add/forward explicit_chunk_size through mode_choice_simulate(...) and simple_simulate(...) into chunk.adaptive_chunked_choosers(...).
  • Wire model_settings.explicit_chunk into tour and trip mode choice simulation calls.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.

FileDescription
activitysim/core/simulate.pyAdds explicit_chunk_size to simple_simulate and forwards it to the chooser chunking generator.
activitysim/core/configuration/logit.pyAdds explicit_chunk to TemplatedLogitComponentSettings so templated/segmented logit components (incl. mode choice) can configure fixed chunking.
activitysim/abm/models/util/mode.pyThreads explicit_chunk_size through mode_choice_simulate and passes model_settings.explicit_chunk from tour mode choice runner.
activitysim/abm/models/trip_mode_choice.pyPasses model_settings.explicit_chunk into mode_choice_simulate for trip mode choice.
Comments suppressed due to low confidence (1)

activitysim/abm/models/util/mode.py:43

  • The mode_choice_simulate docstring parameter list is now out of sync with the function signature: it still mentions chunk_size (which is not a parameter) and doesn't document explicit_chunk_size or the updated optional type for compute_settings. This can mislead callers when enabling explicit chunking.
 explicit_chunk_size: float = 0,
):
"""
common method for both tour_mode_choice and trip_mode_choice

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@vincentgong7

Copy link
Copy Markdown
ContributorAuthor

Hi @jpn-- , I wonder if you can check this PR. If everything is good, can it be merged?

jpn--and others added 2 commits July 30, 2026 14:08
Remove the stale `chunk_size` entry (not a parameter), mark compute_settings
as optional, and document the new explicit_chunk_size argument. Addresses the
automated review note on PR ActivitySim#1088.
vincentgong7 added a commit to vincentgong7/activitysim that referenced this pull request Jul 31, 2026
Remove the stale `chunk_size` entry (not a parameter), mark compute_settings
as optional, and document the new explicit_chunk_size argument. Addresses the
automated review note on PR ActivitySim#1088.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@vincentgong7
vincentgong7force-pushed the feature/explicit-chunk-mode-choice branch from 779fc91 to 706bc39CompareJuly 31, 2026 11:53
@vincentgong7

Copy link
Copy Markdown
ContributorAuthor

Synced the mode_choice_simulate docstring in 706bc39 to address the automated review note: removed the stale chunk_size entry (no longer a parameter), documented the new explicit_chunk_size argument, and marked compute_settings as optional. No functional change. CI is green and the PR is mergeable — @jpn-- would appreciate a review/merge when you have a moment. Thanks!

@jpn--
jpn-- merged commit da0d9b1 into ActivitySim:mainAug 5, 2026
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.

3 participants

@vincentgong7@jpn--
, '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

Support explicit_chunk for mode-choice components - #1088

Merged
jpn-- merged 3 commits into
ActivitySim:mainfrom
vincentgong7:feature/explicit-chunk-mode-choice
Aug 5, 2026
Merged

Support explicit_chunk for mode-choice components#1088
jpn-- merged 3 commits into
ActivitySim:mainfrom
vincentgong7:feature/explicit-chunk-mode-choice

Conversation

@vincentgong7

@vincentgong7vincentgong7 commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

Description

What

Plumb the existing explicit_chunk setting through to the mode-choice components
(tour_mode_choice, trip_mode_choice), matching how location, destination, and scheduling
components already use it.

Why

explicit_chunk (a fixed per-chunk chooser count, active under chunk_training_mode: explicit) lets a
component run with a deterministic, bounded memory footprint. Location/destination/scheduling
components honor it via LocationComponentSettings.explicit_chunk, but mode-choice components never
received it — the field didn't exist on their settings class and mode_choice_simulate /
simple_simulate neither accepted nor forwarded it.

On memory-constrained machines the adaptive chunker grows each chunk toward its memory budget, so peak
RSS is roughly constant regardless of sample size — which can OOM large models even after subsampling.
Fixed explicit_chunk sizes bound the peak. This change makes that strategy usable for mode choice too;
for us it was the last unchunkable core step when fitting a full-sample run (8.1M trips, 7787 zones) onto
a 64 GB node.

What changed (backward-compatible — default 0 = unchanged behavior)

  • TemplatedLogitComponentSettings: new explicit_chunk: float = 0 field (the base for mode-choice
    settings; mirrors the field already on LocationComponentSettings).
  • mode_choice_simulate(...): new explicit_chunk_size parameter, forwarded to simple_simulate.
  • run_tour_mode_choice_simulate(...) and trip_mode_choice(...): pass
    explicit_chunk_size=model_settings.explicit_chunk.
  • simple_simulate(...): new explicit_chunk_size parameter, forwarded to
    chunk.adaptive_chunked_choosers.

4 files changed, 16 insertions(+), 1 deletion(-).

Usage

# settings.yamlchunk_training_mode: explicit# tour_mode_choice.yaml / trip_mode_choice.yamlexplicit_chunk: 5000

Testing

Verified on a full-sample run (8.1M trips, 7787 zones) on a 64 GB node: tour/trip mode choice ran with a
bounded per-chunk memory footprint under explicit_chunk: 5000; with the default (0) behavior is
identical to before.

Acknowledgement

This work was supported by the XCarcity project. https://xcarcity.nl

Location, destination, and scheduling components already honor the
`explicit_chunk` setting (a fixed chunk size, used when
chunk_training_mode: explicit), but mode-choice components did not:
the setting was never plumbed from the component settings into
simple_simulate's chunk loop.
This wires it through: add `explicit_chunk` to
TemplatedLogitComponentSettings (the base for mode-choice settings),
and pass it via mode_choice_simulate -> simple_simulate ->
adaptive_chunked_choosers. Defaults to 0 (unchanged behavior).
This lets tour_mode_choice and trip_mode_choice run with a fixed,
bounded per-chunk memory footprint, which is what makes large samples
fit on memory-constrained machines under chunk_training_mode: explicit.

CopilotAI 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.

Pull request overview

This PR extends ActivitySim’s existing explicit_chunk chunking control to mode-choice components, allowing deterministic, bounded chooser chunk sizes during tour/trip mode choice simulation (via chunk_training_mode: explicit).

Changes:

  • Add explicit_chunk to TemplatedLogitComponentSettings so mode-choice settings can declare fixed chunk sizing.
  • Add/forward explicit_chunk_size through mode_choice_simulate(...) and simple_simulate(...) into chunk.adaptive_chunked_choosers(...).
  • Wire model_settings.explicit_chunk into tour and trip mode choice simulation calls.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.

FileDescription
activitysim/core/simulate.pyAdds explicit_chunk_size to simple_simulate and forwards it to the chooser chunking generator.
activitysim/core/configuration/logit.pyAdds explicit_chunk to TemplatedLogitComponentSettings so templated/segmented logit components (incl. mode choice) can configure fixed chunking.
activitysim/abm/models/util/mode.pyThreads explicit_chunk_size through mode_choice_simulate and passes model_settings.explicit_chunk from tour mode choice runner.
activitysim/abm/models/trip_mode_choice.pyPasses model_settings.explicit_chunk into mode_choice_simulate for trip mode choice.
Comments suppressed due to low confidence (1)

activitysim/abm/models/util/mode.py:43

  • The mode_choice_simulate docstring parameter list is now out of sync with the function signature: it still mentions chunk_size (which is not a parameter) and doesn't document explicit_chunk_size or the updated optional type for compute_settings. This can mislead callers when enabling explicit chunking.
 explicit_chunk_size: float = 0,
):
"""
common method for both tour_mode_choice and trip_mode_choice

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@vincentgong7

Copy link
Copy Markdown
ContributorAuthor

Hi @jpn-- , I wonder if you can check this PR. If everything is good, can it be merged?

jpn--and others added 2 commits July 30, 2026 14:08
Remove the stale `chunk_size` entry (not a parameter), mark compute_settings
as optional, and document the new explicit_chunk_size argument. Addresses the
automated review note on PR ActivitySim#1088.
vincentgong7 added a commit to vincentgong7/activitysim that referenced this pull request Jul 31, 2026
Remove the stale `chunk_size` entry (not a parameter), mark compute_settings
as optional, and document the new explicit_chunk_size argument. Addresses the
automated review note on PR ActivitySim#1088.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@vincentgong7
vincentgong7force-pushed the feature/explicit-chunk-mode-choice branch from 779fc91 to 706bc39CompareJuly 31, 2026 11:53
@vincentgong7

Copy link
Copy Markdown
ContributorAuthor

Synced the mode_choice_simulate docstring in 706bc39 to address the automated review note: removed the stale chunk_size entry (no longer a parameter), documented the new explicit_chunk_size argument, and marked compute_settings as optional. No functional change. CI is green and the PR is mergeable — @jpn-- would appreciate a review/merge when you have a moment. Thanks!

@jpn--
jpn-- merged commit da0d9b1 into ActivitySim:mainAug 5, 2026
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.

3 participants

@vincentgong7@jpn--
, '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

Support explicit_chunk for mode-choice components - #1088

Merged
jpn-- merged 3 commits into
ActivitySim:mainfrom
vincentgong7:feature/explicit-chunk-mode-choice
Aug 5, 2026
Merged

Support explicit_chunk for mode-choice components#1088
jpn-- merged 3 commits into
ActivitySim:mainfrom
vincentgong7:feature/explicit-chunk-mode-choice

Conversation

@vincentgong7

@vincentgong7vincentgong7 commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

Description

What

Plumb the existing explicit_chunk setting through to the mode-choice components
(tour_mode_choice, trip_mode_choice), matching how location, destination, and scheduling
components already use it.

Why

explicit_chunk (a fixed per-chunk chooser count, active under chunk_training_mode: explicit) lets a
component run with a deterministic, bounded memory footprint. Location/destination/scheduling
components honor it via LocationComponentSettings.explicit_chunk, but mode-choice components never
received it — the field didn't exist on their settings class and mode_choice_simulate /
simple_simulate neither accepted nor forwarded it.

On memory-constrained machines the adaptive chunker grows each chunk toward its memory budget, so peak
RSS is roughly constant regardless of sample size — which can OOM large models even after subsampling.
Fixed explicit_chunk sizes bound the peak. This change makes that strategy usable for mode choice too;
for us it was the last unchunkable core step when fitting a full-sample run (8.1M trips, 7787 zones) onto
a 64 GB node.

What changed (backward-compatible — default 0 = unchanged behavior)

  • TemplatedLogitComponentSettings: new explicit_chunk: float = 0 field (the base for mode-choice
    settings; mirrors the field already on LocationComponentSettings).
  • mode_choice_simulate(...): new explicit_chunk_size parameter, forwarded to simple_simulate.
  • run_tour_mode_choice_simulate(...) and trip_mode_choice(...): pass
    explicit_chunk_size=model_settings.explicit_chunk.
  • simple_simulate(...): new explicit_chunk_size parameter, forwarded to
    chunk.adaptive_chunked_choosers.

4 files changed, 16 insertions(+), 1 deletion(-).

Usage

# settings.yamlchunk_training_mode: explicit# tour_mode_choice.yaml / trip_mode_choice.yamlexplicit_chunk: 5000

Testing

Verified on a full-sample run (8.1M trips, 7787 zones) on a 64 GB node: tour/trip mode choice ran with a
bounded per-chunk memory footprint under explicit_chunk: 5000; with the default (0) behavior is
identical to before.

Acknowledgement

This work was supported by the XCarcity project. https://xcarcity.nl

Location, destination, and scheduling components already honor the
`explicit_chunk` setting (a fixed chunk size, used when
chunk_training_mode: explicit), but mode-choice components did not:
the setting was never plumbed from the component settings into
simple_simulate's chunk loop.
This wires it through: add `explicit_chunk` to
TemplatedLogitComponentSettings (the base for mode-choice settings),
and pass it via mode_choice_simulate -> simple_simulate ->
adaptive_chunked_choosers. Defaults to 0 (unchanged behavior).
This lets tour_mode_choice and trip_mode_choice run with a fixed,
bounded per-chunk memory footprint, which is what makes large samples
fit on memory-constrained machines under chunk_training_mode: explicit.

CopilotAI 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.

Pull request overview

This PR extends ActivitySim’s existing explicit_chunk chunking control to mode-choice components, allowing deterministic, bounded chooser chunk sizes during tour/trip mode choice simulation (via chunk_training_mode: explicit).

Changes:

  • Add explicit_chunk to TemplatedLogitComponentSettings so mode-choice settings can declare fixed chunk sizing.
  • Add/forward explicit_chunk_size through mode_choice_simulate(...) and simple_simulate(...) into chunk.adaptive_chunked_choosers(...).
  • Wire model_settings.explicit_chunk into tour and trip mode choice simulation calls.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.

FileDescription
activitysim/core/simulate.pyAdds explicit_chunk_size to simple_simulate and forwards it to the chooser chunking generator.
activitysim/core/configuration/logit.pyAdds explicit_chunk to TemplatedLogitComponentSettings so templated/segmented logit components (incl. mode choice) can configure fixed chunking.
activitysim/abm/models/util/mode.pyThreads explicit_chunk_size through mode_choice_simulate and passes model_settings.explicit_chunk from tour mode choice runner.
activitysim/abm/models/trip_mode_choice.pyPasses model_settings.explicit_chunk into mode_choice_simulate for trip mode choice.
Comments suppressed due to low confidence (1)

activitysim/abm/models/util/mode.py:43

  • The mode_choice_simulate docstring parameter list is now out of sync with the function signature: it still mentions chunk_size (which is not a parameter) and doesn't document explicit_chunk_size or the updated optional type for compute_settings. This can mislead callers when enabling explicit chunking.
 explicit_chunk_size: float = 0,
):
"""
common method for both tour_mode_choice and trip_mode_choice

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@vincentgong7

Copy link
Copy Markdown
ContributorAuthor

Hi @jpn-- , I wonder if you can check this PR. If everything is good, can it be merged?

jpn--and others added 2 commits July 30, 2026 14:08
Remove the stale `chunk_size` entry (not a parameter), mark compute_settings
as optional, and document the new explicit_chunk_size argument. Addresses the
automated review note on PR ActivitySim#1088.
vincentgong7 added a commit to vincentgong7/activitysim that referenced this pull request Jul 31, 2026
Remove the stale `chunk_size` entry (not a parameter), mark compute_settings
as optional, and document the new explicit_chunk_size argument. Addresses the
automated review note on PR ActivitySim#1088.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@vincentgong7
vincentgong7force-pushed the feature/explicit-chunk-mode-choice branch from 779fc91 to 706bc39CompareJuly 31, 2026 11:53
@vincentgong7

Copy link
Copy Markdown
ContributorAuthor

Synced the mode_choice_simulate docstring in 706bc39 to address the automated review note: removed the stale chunk_size entry (no longer a parameter), documented the new explicit_chunk_size argument, and marked compute_settings as optional. No functional change. CI is green and the PR is mergeable — @jpn-- would appreciate a review/merge when you have a moment. Thanks!

@jpn--
jpn-- merged commit da0d9b1 into ActivitySim:mainAug 5, 2026
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.

3 participants

@vincentgong7@jpn--