Estimation fix - #591

Merged
jpn-- merged 7 commits into
ActivitySim:developfrom
camsys:est-fix
Dec 30, 2022
Merged

Estimation fix#591
jpn-- merged 7 commits into
ActivitySim:developfrom
camsys:est-fix

Conversation

@jpn--

Copy link
Copy Markdown
Member

As implemented, the estimation example for non-mandatory tour frequency included a short cut to limit the number of unique parameters to be estimated for each person type.

This was a design feature that Ben, Jeff Doyle and I implemented to get stable estimation results out of these models, as without it the model estimation was hopelessly over-specified. We didn’t have access to any original estimation source documents that laid out the inter-parameter relationships, just a massive table of estimated parameters values where tons of them were the same number. The named-parameter design was meant to get around this conundrum in the future, as you can explicitly use the same parameter multiple places, and also have different parameters with the same current value, but maybe one day they will not have the same value.

Now, some agencies are working to estimate these models, and once the model spec is written more intelligently, the short cut is not actually desirable. This PR adds a mechanism to turn it off.

@jpn--
jpn-- changed the base branch from develop to mainAugust 24, 2022 20:43
@jpn--
jpn-- changed the base branch from main to developAugust 24, 2022 20:43
@coveralls

Copy link
Copy Markdown

Coverage Status

Coverage remained the same at 0.0% when pulling 586cf45 on camsys:est-fix into 8b7737c on ActivitySim:develop.

@dhensle
dhensle self-requested a review October 20, 2022 16:36
@jpn--jpn-- added this to the Phase 7 milestone Dec 13, 2022
def nonmand_tour_freq_model(
edb_directory="output/estimation_data_bundle/{name}/",
return_data=False,
condense_parameters=True,

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.

Fix looks good and works for me, but I suggest changing condence_parameters default to False. As demonstrated by work on this from MWCOG, having this turned on and not realizing what it does can lead to significant confusion.

@jfdman

Copy link
Copy Markdown

I'd just add that I agree with @dhensle suggestion to make the default behavior for condensing parameters false, but also that it seems like we need a more widely applicable way to constrain parameters to be equal to each other in estimation so that this functionality can be used in all models, not just in non-mandatory tour frequency, and that the user can control more explicitly which parameters to collapse rather than the default behavior of the functionality. Meanwhile we might consider completely turning off the functionality. Also if enabled, the coefficients written to the 'utility' page in the spreadsheet should be renamed like p.original_name_condensed_1 or some such so that we know that this parameter was condensed and which terms the condensed parameter is being applied to, rather than the current behavior which incorrectly identifies the parameter as one of the parameters that is being condensed and results in an incorrect utility specification reported.

@jpn--

Copy link
Copy Markdown
MemberAuthor

I'd just add that I agree with @dhensle suggestion to make the default behavior for condensing parameters false

Looking at this again, I also agree False is the correct default arg value. It should never be used for actual parameter estimation in "real life". This argument exists only because no one had the original parameter estimation template for these models, and we wanted to demonstrate re-estimation without re-creating the code that defines how the apparent 1000+ parameters in this model group were originally estimated.

As to @jfdman's suggestion that there should be better estimation capabilities, I agree. The current estimation mode was built to mirror daysim's capabilities to update parameters while changing literally nothing about the model structure. It can be and has been used to re-estimate components with structural changes as well, but doing that estimation requires significant effort. Easing that effort is far beyond the scope of this PR.

@jpn--
jpn-- merged commit 7cc99ef into ActivitySim:developDec 30, 2022
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.

4 participants

@jpn--@coveralls@jfdman@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

Estimation fix - #591

Merged
jpn-- merged 7 commits into
ActivitySim:developfrom
camsys:est-fix
Dec 30, 2022
Merged

Estimation fix#591
jpn-- merged 7 commits into
ActivitySim:developfrom
camsys:est-fix

Conversation

@jpn--

Copy link
Copy Markdown
Member

As implemented, the estimation example for non-mandatory tour frequency included a short cut to limit the number of unique parameters to be estimated for each person type.

This was a design feature that Ben, Jeff Doyle and I implemented to get stable estimation results out of these models, as without it the model estimation was hopelessly over-specified. We didn’t have access to any original estimation source documents that laid out the inter-parameter relationships, just a massive table of estimated parameters values where tons of them were the same number. The named-parameter design was meant to get around this conundrum in the future, as you can explicitly use the same parameter multiple places, and also have different parameters with the same current value, but maybe one day they will not have the same value.

Now, some agencies are working to estimate these models, and once the model spec is written more intelligently, the short cut is not actually desirable. This PR adds a mechanism to turn it off.

@jpn--
jpn-- changed the base branch from develop to mainAugust 24, 2022 20:43
@jpn--
jpn-- changed the base branch from main to developAugust 24, 2022 20:43
@coveralls

Copy link
Copy Markdown

Coverage Status

Coverage remained the same at 0.0% when pulling 586cf45 on camsys:est-fix into 8b7737c on ActivitySim:develop.

@dhensle
dhensle self-requested a review October 20, 2022 16:36
@jpn--jpn-- added this to the Phase 7 milestone Dec 13, 2022
def nonmand_tour_freq_model(
edb_directory="output/estimation_data_bundle/{name}/",
return_data=False,
condense_parameters=True,

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.

Fix looks good and works for me, but I suggest changing condence_parameters default to False. As demonstrated by work on this from MWCOG, having this turned on and not realizing what it does can lead to significant confusion.

@jfdman

Copy link
Copy Markdown

I'd just add that I agree with @dhensle suggestion to make the default behavior for condensing parameters false, but also that it seems like we need a more widely applicable way to constrain parameters to be equal to each other in estimation so that this functionality can be used in all models, not just in non-mandatory tour frequency, and that the user can control more explicitly which parameters to collapse rather than the default behavior of the functionality. Meanwhile we might consider completely turning off the functionality. Also if enabled, the coefficients written to the 'utility' page in the spreadsheet should be renamed like p.original_name_condensed_1 or some such so that we know that this parameter was condensed and which terms the condensed parameter is being applied to, rather than the current behavior which incorrectly identifies the parameter as one of the parameters that is being condensed and results in an incorrect utility specification reported.

@jpn--

Copy link
Copy Markdown
MemberAuthor

I'd just add that I agree with @dhensle suggestion to make the default behavior for condensing parameters false

Looking at this again, I also agree False is the correct default arg value. It should never be used for actual parameter estimation in "real life". This argument exists only because no one had the original parameter estimation template for these models, and we wanted to demonstrate re-estimation without re-creating the code that defines how the apparent 1000+ parameters in this model group were originally estimated.

As to @jfdman's suggestion that there should be better estimation capabilities, I agree. The current estimation mode was built to mirror daysim's capabilities to update parameters while changing literally nothing about the model structure. It can be and has been used to re-estimate components with structural changes as well, but doing that estimation requires significant effort. Easing that effort is far beyond the scope of this PR.

@jpn--
jpn-- merged commit 7cc99ef into ActivitySim:developDec 30, 2022
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.

4 participants

@jpn--@coveralls@jfdman@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

Estimation fix - #591

Merged
jpn-- merged 7 commits into
ActivitySim:developfrom
camsys:est-fix
Dec 30, 2022
Merged

Estimation fix#591
jpn-- merged 7 commits into
ActivitySim:developfrom
camsys:est-fix

Conversation

@jpn--

Copy link
Copy Markdown
Member

As implemented, the estimation example for non-mandatory tour frequency included a short cut to limit the number of unique parameters to be estimated for each person type.

This was a design feature that Ben, Jeff Doyle and I implemented to get stable estimation results out of these models, as without it the model estimation was hopelessly over-specified. We didn’t have access to any original estimation source documents that laid out the inter-parameter relationships, just a massive table of estimated parameters values where tons of them were the same number. The named-parameter design was meant to get around this conundrum in the future, as you can explicitly use the same parameter multiple places, and also have different parameters with the same current value, but maybe one day they will not have the same value.

Now, some agencies are working to estimate these models, and once the model spec is written more intelligently, the short cut is not actually desirable. This PR adds a mechanism to turn it off.

@jpn--
jpn-- changed the base branch from develop to mainAugust 24, 2022 20:43
@jpn--
jpn-- changed the base branch from main to developAugust 24, 2022 20:43
@coveralls

Copy link
Copy Markdown

Coverage Status

Coverage remained the same at 0.0% when pulling 586cf45 on camsys:est-fix into 8b7737c on ActivitySim:develop.

@dhensle
dhensle self-requested a review October 20, 2022 16:36
@jpn--jpn-- added this to the Phase 7 milestone Dec 13, 2022
def nonmand_tour_freq_model(
edb_directory="output/estimation_data_bundle/{name}/",
return_data=False,
condense_parameters=True,

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.

Fix looks good and works for me, but I suggest changing condence_parameters default to False. As demonstrated by work on this from MWCOG, having this turned on and not realizing what it does can lead to significant confusion.

@jfdman

Copy link
Copy Markdown

I'd just add that I agree with @dhensle suggestion to make the default behavior for condensing parameters false, but also that it seems like we need a more widely applicable way to constrain parameters to be equal to each other in estimation so that this functionality can be used in all models, not just in non-mandatory tour frequency, and that the user can control more explicitly which parameters to collapse rather than the default behavior of the functionality. Meanwhile we might consider completely turning off the functionality. Also if enabled, the coefficients written to the 'utility' page in the spreadsheet should be renamed like p.original_name_condensed_1 or some such so that we know that this parameter was condensed and which terms the condensed parameter is being applied to, rather than the current behavior which incorrectly identifies the parameter as one of the parameters that is being condensed and results in an incorrect utility specification reported.

@jpn--

Copy link
Copy Markdown
MemberAuthor

I'd just add that I agree with @dhensle suggestion to make the default behavior for condensing parameters false

Looking at this again, I also agree False is the correct default arg value. It should never be used for actual parameter estimation in "real life". This argument exists only because no one had the original parameter estimation template for these models, and we wanted to demonstrate re-estimation without re-creating the code that defines how the apparent 1000+ parameters in this model group were originally estimated.

As to @jfdman's suggestion that there should be better estimation capabilities, I agree. The current estimation mode was built to mirror daysim's capabilities to update parameters while changing literally nothing about the model structure. It can be and has been used to re-estimate components with structural changes as well, but doing that estimation requires significant effort. Easing that effort is far beyond the scope of this PR.

@jpn--
jpn-- merged commit 7cc99ef into ActivitySim:developDec 30, 2022
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.

4 participants

@jpn--@coveralls@jfdman@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

Estimation fix - #591

Merged
jpn-- merged 7 commits into
ActivitySim:developfrom
camsys:est-fix
Dec 30, 2022
Merged

Estimation fix#591
jpn-- merged 7 commits into
ActivitySim:developfrom
camsys:est-fix

Conversation

@jpn--

Copy link
Copy Markdown
Member

As implemented, the estimation example for non-mandatory tour frequency included a short cut to limit the number of unique parameters to be estimated for each person type.

This was a design feature that Ben, Jeff Doyle and I implemented to get stable estimation results out of these models, as without it the model estimation was hopelessly over-specified. We didn’t have access to any original estimation source documents that laid out the inter-parameter relationships, just a massive table of estimated parameters values where tons of them were the same number. The named-parameter design was meant to get around this conundrum in the future, as you can explicitly use the same parameter multiple places, and also have different parameters with the same current value, but maybe one day they will not have the same value.

Now, some agencies are working to estimate these models, and once the model spec is written more intelligently, the short cut is not actually desirable. This PR adds a mechanism to turn it off.

@jpn--
jpn-- changed the base branch from develop to mainAugust 24, 2022 20:43
@jpn--
jpn-- changed the base branch from main to developAugust 24, 2022 20:43
@coveralls

Copy link
Copy Markdown

Coverage Status

Coverage remained the same at 0.0% when pulling 586cf45 on camsys:est-fix into 8b7737c on ActivitySim:develop.

@dhensle
dhensle self-requested a review October 20, 2022 16:36
@jpn--jpn-- added this to the Phase 7 milestone Dec 13, 2022
def nonmand_tour_freq_model(
edb_directory="output/estimation_data_bundle/{name}/",
return_data=False,
condense_parameters=True,

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.

Fix looks good and works for me, but I suggest changing condence_parameters default to False. As demonstrated by work on this from MWCOG, having this turned on and not realizing what it does can lead to significant confusion.

@jfdman

Copy link
Copy Markdown

I'd just add that I agree with @dhensle suggestion to make the default behavior for condensing parameters false, but also that it seems like we need a more widely applicable way to constrain parameters to be equal to each other in estimation so that this functionality can be used in all models, not just in non-mandatory tour frequency, and that the user can control more explicitly which parameters to collapse rather than the default behavior of the functionality. Meanwhile we might consider completely turning off the functionality. Also if enabled, the coefficients written to the 'utility' page in the spreadsheet should be renamed like p.original_name_condensed_1 or some such so that we know that this parameter was condensed and which terms the condensed parameter is being applied to, rather than the current behavior which incorrectly identifies the parameter as one of the parameters that is being condensed and results in an incorrect utility specification reported.

@jpn--

Copy link
Copy Markdown
MemberAuthor

I'd just add that I agree with @dhensle suggestion to make the default behavior for condensing parameters false

Looking at this again, I also agree False is the correct default arg value. It should never be used for actual parameter estimation in "real life". This argument exists only because no one had the original parameter estimation template for these models, and we wanted to demonstrate re-estimation without re-creating the code that defines how the apparent 1000+ parameters in this model group were originally estimated.

As to @jfdman's suggestion that there should be better estimation capabilities, I agree. The current estimation mode was built to mirror daysim's capabilities to update parameters while changing literally nothing about the model structure. It can be and has been used to re-estimate components with structural changes as well, but doing that estimation requires significant effort. Easing that effort is far beyond the scope of this PR.

@jpn--
jpn-- merged commit 7cc99ef into ActivitySim:developDec 30, 2022
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.

4 participants

@jpn--@coveralls@jfdman@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

Estimation fix - #591

Merged
jpn-- merged 7 commits into
ActivitySim:developfrom
camsys:est-fix
Dec 30, 2022
Merged

Estimation fix#591
jpn-- merged 7 commits into
ActivitySim:developfrom
camsys:est-fix

Conversation

@jpn--

Copy link
Copy Markdown
Member

As implemented, the estimation example for non-mandatory tour frequency included a short cut to limit the number of unique parameters to be estimated for each person type.

This was a design feature that Ben, Jeff Doyle and I implemented to get stable estimation results out of these models, as without it the model estimation was hopelessly over-specified. We didn’t have access to any original estimation source documents that laid out the inter-parameter relationships, just a massive table of estimated parameters values where tons of them were the same number. The named-parameter design was meant to get around this conundrum in the future, as you can explicitly use the same parameter multiple places, and also have different parameters with the same current value, but maybe one day they will not have the same value.

Now, some agencies are working to estimate these models, and once the model spec is written more intelligently, the short cut is not actually desirable. This PR adds a mechanism to turn it off.

@jpn--
jpn-- changed the base branch from develop to mainAugust 24, 2022 20:43
@jpn--
jpn-- changed the base branch from main to developAugust 24, 2022 20:43
@coveralls

Copy link
Copy Markdown

Coverage Status

Coverage remained the same at 0.0% when pulling 586cf45 on camsys:est-fix into 8b7737c on ActivitySim:develop.

@dhensle
dhensle self-requested a review October 20, 2022 16:36
@jpn--jpn-- added this to the Phase 7 milestone Dec 13, 2022
def nonmand_tour_freq_model(
edb_directory="output/estimation_data_bundle/{name}/",
return_data=False,
condense_parameters=True,

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.

Fix looks good and works for me, but I suggest changing condence_parameters default to False. As demonstrated by work on this from MWCOG, having this turned on and not realizing what it does can lead to significant confusion.

@jfdman

Copy link
Copy Markdown

I'd just add that I agree with @dhensle suggestion to make the default behavior for condensing parameters false, but also that it seems like we need a more widely applicable way to constrain parameters to be equal to each other in estimation so that this functionality can be used in all models, not just in non-mandatory tour frequency, and that the user can control more explicitly which parameters to collapse rather than the default behavior of the functionality. Meanwhile we might consider completely turning off the functionality. Also if enabled, the coefficients written to the 'utility' page in the spreadsheet should be renamed like p.original_name_condensed_1 or some such so that we know that this parameter was condensed and which terms the condensed parameter is being applied to, rather than the current behavior which incorrectly identifies the parameter as one of the parameters that is being condensed and results in an incorrect utility specification reported.

@jpn--

Copy link
Copy Markdown
MemberAuthor

I'd just add that I agree with @dhensle suggestion to make the default behavior for condensing parameters false

Looking at this again, I also agree False is the correct default arg value. It should never be used for actual parameter estimation in "real life". This argument exists only because no one had the original parameter estimation template for these models, and we wanted to demonstrate re-estimation without re-creating the code that defines how the apparent 1000+ parameters in this model group were originally estimated.

As to @jfdman's suggestion that there should be better estimation capabilities, I agree. The current estimation mode was built to mirror daysim's capabilities to update parameters while changing literally nothing about the model structure. It can be and has been used to re-estimate components with structural changes as well, but doing that estimation requires significant effort. Easing that effort is far beyond the scope of this PR.

@jpn--
jpn-- merged commit 7cc99ef into ActivitySim:developDec 30, 2022
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.

4 participants

@jpn--@coveralls@jfdman@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

Estimation fix - #591

Merged
jpn-- merged 7 commits into
ActivitySim:developfrom
camsys:est-fix
Dec 30, 2022
Merged

Estimation fix#591
jpn-- merged 7 commits into
ActivitySim:developfrom
camsys:est-fix

Conversation

@jpn--

Copy link
Copy Markdown
Member

As implemented, the estimation example for non-mandatory tour frequency included a short cut to limit the number of unique parameters to be estimated for each person type.

This was a design feature that Ben, Jeff Doyle and I implemented to get stable estimation results out of these models, as without it the model estimation was hopelessly over-specified. We didn’t have access to any original estimation source documents that laid out the inter-parameter relationships, just a massive table of estimated parameters values where tons of them were the same number. The named-parameter design was meant to get around this conundrum in the future, as you can explicitly use the same parameter multiple places, and also have different parameters with the same current value, but maybe one day they will not have the same value.

Now, some agencies are working to estimate these models, and once the model spec is written more intelligently, the short cut is not actually desirable. This PR adds a mechanism to turn it off.

@jpn--
jpn-- changed the base branch from develop to mainAugust 24, 2022 20:43
@jpn--
jpn-- changed the base branch from main to developAugust 24, 2022 20:43
@coveralls

Copy link
Copy Markdown

Coverage Status

Coverage remained the same at 0.0% when pulling 586cf45 on camsys:est-fix into 8b7737c on ActivitySim:develop.

@dhensle
dhensle self-requested a review October 20, 2022 16:36
@jpn--jpn-- added this to the Phase 7 milestone Dec 13, 2022
def nonmand_tour_freq_model(
edb_directory="output/estimation_data_bundle/{name}/",
return_data=False,
condense_parameters=True,

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.

Fix looks good and works for me, but I suggest changing condence_parameters default to False. As demonstrated by work on this from MWCOG, having this turned on and not realizing what it does can lead to significant confusion.

@jfdman

Copy link
Copy Markdown

I'd just add that I agree with @dhensle suggestion to make the default behavior for condensing parameters false, but also that it seems like we need a more widely applicable way to constrain parameters to be equal to each other in estimation so that this functionality can be used in all models, not just in non-mandatory tour frequency, and that the user can control more explicitly which parameters to collapse rather than the default behavior of the functionality. Meanwhile we might consider completely turning off the functionality. Also if enabled, the coefficients written to the 'utility' page in the spreadsheet should be renamed like p.original_name_condensed_1 or some such so that we know that this parameter was condensed and which terms the condensed parameter is being applied to, rather than the current behavior which incorrectly identifies the parameter as one of the parameters that is being condensed and results in an incorrect utility specification reported.

@jpn--

Copy link
Copy Markdown
MemberAuthor

I'd just add that I agree with @dhensle suggestion to make the default behavior for condensing parameters false

Looking at this again, I also agree False is the correct default arg value. It should never be used for actual parameter estimation in "real life". This argument exists only because no one had the original parameter estimation template for these models, and we wanted to demonstrate re-estimation without re-creating the code that defines how the apparent 1000+ parameters in this model group were originally estimated.

As to @jfdman's suggestion that there should be better estimation capabilities, I agree. The current estimation mode was built to mirror daysim's capabilities to update parameters while changing literally nothing about the model structure. It can be and has been used to re-estimate components with structural changes as well, but doing that estimation requires significant effort. Easing that effort is far beyond the scope of this PR.

@jpn--
jpn-- merged commit 7cc99ef into ActivitySim:developDec 30, 2022
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.

4 participants

@jpn--@coveralls@jfdman@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

Estimation fix - #591

Merged
jpn-- merged 7 commits into
ActivitySim:developfrom
camsys:est-fix
Dec 30, 2022
Merged

Estimation fix#591
jpn-- merged 7 commits into
ActivitySim:developfrom
camsys:est-fix

Conversation

@jpn--

Copy link
Copy Markdown
Member

As implemented, the estimation example for non-mandatory tour frequency included a short cut to limit the number of unique parameters to be estimated for each person type.

This was a design feature that Ben, Jeff Doyle and I implemented to get stable estimation results out of these models, as without it the model estimation was hopelessly over-specified. We didn’t have access to any original estimation source documents that laid out the inter-parameter relationships, just a massive table of estimated parameters values where tons of them were the same number. The named-parameter design was meant to get around this conundrum in the future, as you can explicitly use the same parameter multiple places, and also have different parameters with the same current value, but maybe one day they will not have the same value.

Now, some agencies are working to estimate these models, and once the model spec is written more intelligently, the short cut is not actually desirable. This PR adds a mechanism to turn it off.

@jpn--
jpn-- changed the base branch from develop to mainAugust 24, 2022 20:43
@jpn--
jpn-- changed the base branch from main to developAugust 24, 2022 20:43
@coveralls

Copy link
Copy Markdown

Coverage Status

Coverage remained the same at 0.0% when pulling 586cf45 on camsys:est-fix into 8b7737c on ActivitySim:develop.

@dhensle
dhensle self-requested a review October 20, 2022 16:36
@jpn--jpn-- added this to the Phase 7 milestone Dec 13, 2022
def nonmand_tour_freq_model(
edb_directory="output/estimation_data_bundle/{name}/",
return_data=False,
condense_parameters=True,

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.

Fix looks good and works for me, but I suggest changing condence_parameters default to False. As demonstrated by work on this from MWCOG, having this turned on and not realizing what it does can lead to significant confusion.

@jfdman

Copy link
Copy Markdown

I'd just add that I agree with @dhensle suggestion to make the default behavior for condensing parameters false, but also that it seems like we need a more widely applicable way to constrain parameters to be equal to each other in estimation so that this functionality can be used in all models, not just in non-mandatory tour frequency, and that the user can control more explicitly which parameters to collapse rather than the default behavior of the functionality. Meanwhile we might consider completely turning off the functionality. Also if enabled, the coefficients written to the 'utility' page in the spreadsheet should be renamed like p.original_name_condensed_1 or some such so that we know that this parameter was condensed and which terms the condensed parameter is being applied to, rather than the current behavior which incorrectly identifies the parameter as one of the parameters that is being condensed and results in an incorrect utility specification reported.

@jpn--

Copy link
Copy Markdown
MemberAuthor

I'd just add that I agree with @dhensle suggestion to make the default behavior for condensing parameters false

Looking at this again, I also agree False is the correct default arg value. It should never be used for actual parameter estimation in "real life". This argument exists only because no one had the original parameter estimation template for these models, and we wanted to demonstrate re-estimation without re-creating the code that defines how the apparent 1000+ parameters in this model group were originally estimated.

As to @jfdman's suggestion that there should be better estimation capabilities, I agree. The current estimation mode was built to mirror daysim's capabilities to update parameters while changing literally nothing about the model structure. It can be and has been used to re-estimate components with structural changes as well, but doing that estimation requires significant effort. Easing that effort is far beyond the scope of this PR.

@jpn--
jpn-- merged commit 7cc99ef into ActivitySim:developDec 30, 2022
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.

4 participants

@jpn--@coveralls@jfdman@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

Estimation fix - #591

Merged
jpn-- merged 7 commits into
ActivitySim:developfrom
camsys:est-fix
Dec 30, 2022
Merged

Estimation fix#591
jpn-- merged 7 commits into
ActivitySim:developfrom
camsys:est-fix

Conversation

@jpn--

Copy link
Copy Markdown
Member

As implemented, the estimation example for non-mandatory tour frequency included a short cut to limit the number of unique parameters to be estimated for each person type.

This was a design feature that Ben, Jeff Doyle and I implemented to get stable estimation results out of these models, as without it the model estimation was hopelessly over-specified. We didn’t have access to any original estimation source documents that laid out the inter-parameter relationships, just a massive table of estimated parameters values where tons of them were the same number. The named-parameter design was meant to get around this conundrum in the future, as you can explicitly use the same parameter multiple places, and also have different parameters with the same current value, but maybe one day they will not have the same value.

Now, some agencies are working to estimate these models, and once the model spec is written more intelligently, the short cut is not actually desirable. This PR adds a mechanism to turn it off.

@jpn--
jpn-- changed the base branch from develop to mainAugust 24, 2022 20:43
@jpn--
jpn-- changed the base branch from main to developAugust 24, 2022 20:43
@coveralls

Copy link
Copy Markdown

Coverage Status

Coverage remained the same at 0.0% when pulling 586cf45 on camsys:est-fix into 8b7737c on ActivitySim:develop.

@dhensle
dhensle self-requested a review October 20, 2022 16:36
@jpn--jpn-- added this to the Phase 7 milestone Dec 13, 2022
def nonmand_tour_freq_model(
edb_directory="output/estimation_data_bundle/{name}/",
return_data=False,
condense_parameters=True,

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.

Fix looks good and works for me, but I suggest changing condence_parameters default to False. As demonstrated by work on this from MWCOG, having this turned on and not realizing what it does can lead to significant confusion.

@jfdman

Copy link
Copy Markdown

I'd just add that I agree with @dhensle suggestion to make the default behavior for condensing parameters false, but also that it seems like we need a more widely applicable way to constrain parameters to be equal to each other in estimation so that this functionality can be used in all models, not just in non-mandatory tour frequency, and that the user can control more explicitly which parameters to collapse rather than the default behavior of the functionality. Meanwhile we might consider completely turning off the functionality. Also if enabled, the coefficients written to the 'utility' page in the spreadsheet should be renamed like p.original_name_condensed_1 or some such so that we know that this parameter was condensed and which terms the condensed parameter is being applied to, rather than the current behavior which incorrectly identifies the parameter as one of the parameters that is being condensed and results in an incorrect utility specification reported.

@jpn--

Copy link
Copy Markdown
MemberAuthor

I'd just add that I agree with @dhensle suggestion to make the default behavior for condensing parameters false

Looking at this again, I also agree False is the correct default arg value. It should never be used for actual parameter estimation in "real life". This argument exists only because no one had the original parameter estimation template for these models, and we wanted to demonstrate re-estimation without re-creating the code that defines how the apparent 1000+ parameters in this model group were originally estimated.

As to @jfdman's suggestion that there should be better estimation capabilities, I agree. The current estimation mode was built to mirror daysim's capabilities to update parameters while changing literally nothing about the model structure. It can be and has been used to re-estimate components with structural changes as well, but doing that estimation requires significant effort. Easing that effort is far beyond the scope of this PR.

@jpn--
jpn-- merged commit 7cc99ef into ActivitySim:developDec 30, 2022
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.

4 participants

@jpn--@coveralls@jfdman@dhensle