Shadow pricing not working as it used to for the ctramp method #944

Description

@i-am-sijia

Describe the bug

In ActivitySim, work and school location choices are doubly constrained. Shadow prices are constants applied to destination zones to constrain the model, so that work and school location choice models do not assign more workers or students to any zone than the available opportunities in that zone.

A bit of background first. You can skip to the Issue section below if you prefer

Prior to v1.2, ActivitySim's shadow prices could be calculated using the ctramp method. Work and school location choice models are typically applied by segments, e.g., income segments for work, school grade segments for school. Instead of employments, destination choice size terms are calculated as targets by segment by zone. Shadow prices are then derived using these size terms along with the modeled workers (students) by segment by zone. When running shadow pricing, the size terms are also scaled to the sample population, ensuring that the destination choice results from a sample population run closely resemble those from a full population run. This is particularly useful when performing tasks such as calibration or global iterations with a sample population.

In Phase 7, a new shadow pricing method, simulation was added to ActivitySim. Instead of comparing the modeled workers to the size terms by segment by zone, the simulation method compares the modeled workers directly to the total employment by zone to ensure the final workers match total jobs. The simulation method saves run time compared to the other two methods because it only re-simulates workers and zones that are over assigned in the previous iteration.

As of release v1.3.4, users can choose their desired shadow pricing method among daysim, ctramp, and simulation. If a model was implemented using the ctramp method, a non-trivial effort would be required to switch to the simulation method, and vice-versa. Currently, there are still regions using the ctramp method.

Issue

However, in PR #635, shadow pricing is changed to be disabled when running a sample population under the ctramp method. This change has caused issues in some regions' ActivitySim implementation when not running the full population. Model results do not make sense (because no shadow pricing is applied) unless running the full population.

I don't recall whether this change was discussed, apologies if I missed it. If it was, could someone please document the rationale? If the change was made for because of something with disaggregate accessibility, it would be good to know.

To Reproduce
Steps to reproduce the behavior:

  1. Go to '...'
  2. Click on '....'
  3. Scroll down to '....'
  4. See error

Expected behavior
Shadow pricing performs as it used to for ctramp method, to ensure backward compatibility.

Screenshots
If applicable, add screenshots to help explain your problem.

Additional context
Add any other context about the problem here.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    BugSomething isn't working/bug f

    Type

    No type

    Projects

    • Status
      No status

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

    , '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

    Shadow pricing not working as it used to for the ctramp method #944

    Description

    @i-am-sijia

    Describe the bug

    In ActivitySim, work and school location choices are doubly constrained. Shadow prices are constants applied to destination zones to constrain the model, so that work and school location choice models do not assign more workers or students to any zone than the available opportunities in that zone.

    A bit of background first. You can skip to the Issue section below if you prefer

    Prior to v1.2, ActivitySim's shadow prices could be calculated using the ctramp method. Work and school location choice models are typically applied by segments, e.g., income segments for work, school grade segments for school. Instead of employments, destination choice size terms are calculated as targets by segment by zone. Shadow prices are then derived using these size terms along with the modeled workers (students) by segment by zone. When running shadow pricing, the size terms are also scaled to the sample population, ensuring that the destination choice results from a sample population run closely resemble those from a full population run. This is particularly useful when performing tasks such as calibration or global iterations with a sample population.

    In Phase 7, a new shadow pricing method, simulation was added to ActivitySim. Instead of comparing the modeled workers to the size terms by segment by zone, the simulation method compares the modeled workers directly to the total employment by zone to ensure the final workers match total jobs. The simulation method saves run time compared to the other two methods because it only re-simulates workers and zones that are over assigned in the previous iteration.

    As of release v1.3.4, users can choose their desired shadow pricing method among daysim, ctramp, and simulation. If a model was implemented using the ctramp method, a non-trivial effort would be required to switch to the simulation method, and vice-versa. Currently, there are still regions using the ctramp method.

    Issue

    However, in PR #635, shadow pricing is changed to be disabled when running a sample population under the ctramp method. This change has caused issues in some regions' ActivitySim implementation when not running the full population. Model results do not make sense (because no shadow pricing is applied) unless running the full population.

    I don't recall whether this change was discussed, apologies if I missed it. If it was, could someone please document the rationale? If the change was made for because of something with disaggregate accessibility, it would be good to know.

    To Reproduce
    Steps to reproduce the behavior:

    1. Go to '...'
    2. Click on '....'
    3. Scroll down to '....'
    4. See error

    Expected behavior
    Shadow pricing performs as it used to for ctramp method, to ensure backward compatibility.

    Screenshots
    If applicable, add screenshots to help explain your problem.

    Additional context
    Add any other context about the problem here.

    Activity

    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

    Metadata

    Metadata

    Assignees

    No one assigned

      Labels

      BugSomething isn't working/bug f

      Type

      No type

      Projects

      • Status
        No status

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , '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

      Shadow pricing not working as it used to for the ctramp method #944

      Description

      @i-am-sijia

      Describe the bug

      In ActivitySim, work and school location choices are doubly constrained. Shadow prices are constants applied to destination zones to constrain the model, so that work and school location choice models do not assign more workers or students to any zone than the available opportunities in that zone.

      A bit of background first. You can skip to the Issue section below if you prefer

      Prior to v1.2, ActivitySim's shadow prices could be calculated using the ctramp method. Work and school location choice models are typically applied by segments, e.g., income segments for work, school grade segments for school. Instead of employments, destination choice size terms are calculated as targets by segment by zone. Shadow prices are then derived using these size terms along with the modeled workers (students) by segment by zone. When running shadow pricing, the size terms are also scaled to the sample population, ensuring that the destination choice results from a sample population run closely resemble those from a full population run. This is particularly useful when performing tasks such as calibration or global iterations with a sample population.

      In Phase 7, a new shadow pricing method, simulation was added to ActivitySim. Instead of comparing the modeled workers to the size terms by segment by zone, the simulation method compares the modeled workers directly to the total employment by zone to ensure the final workers match total jobs. The simulation method saves run time compared to the other two methods because it only re-simulates workers and zones that are over assigned in the previous iteration.

      As of release v1.3.4, users can choose their desired shadow pricing method among daysim, ctramp, and simulation. If a model was implemented using the ctramp method, a non-trivial effort would be required to switch to the simulation method, and vice-versa. Currently, there are still regions using the ctramp method.

      Issue

      However, in PR #635, shadow pricing is changed to be disabled when running a sample population under the ctramp method. This change has caused issues in some regions' ActivitySim implementation when not running the full population. Model results do not make sense (because no shadow pricing is applied) unless running the full population.

      I don't recall whether this change was discussed, apologies if I missed it. If it was, could someone please document the rationale? If the change was made for because of something with disaggregate accessibility, it would be good to know.

      To Reproduce
      Steps to reproduce the behavior:

      1. Go to '...'
      2. Click on '....'
      3. Scroll down to '....'
      4. See error

      Expected behavior
      Shadow pricing performs as it used to for ctramp method, to ensure backward compatibility.

      Screenshots
      If applicable, add screenshots to help explain your problem.

      Additional context
      Add any other context about the problem here.

      Activity

      Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

      Metadata

      Metadata

      Assignees

      No one assigned

        Labels

        BugSomething isn't working/bug f

        Type

        No type

        Projects

        • Status
          No status

        Milestone

        No milestone

        Relationships

        None yet

        Development

        No branches or pull requests

        Issue actions

        , '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

        Shadow pricing not working as it used to for the ctramp method #944

        Description

        @i-am-sijia

        Describe the bug

        In ActivitySim, work and school location choices are doubly constrained. Shadow prices are constants applied to destination zones to constrain the model, so that work and school location choice models do not assign more workers or students to any zone than the available opportunities in that zone.

        A bit of background first. You can skip to the Issue section below if you prefer

        Prior to v1.2, ActivitySim's shadow prices could be calculated using the ctramp method. Work and school location choice models are typically applied by segments, e.g., income segments for work, school grade segments for school. Instead of employments, destination choice size terms are calculated as targets by segment by zone. Shadow prices are then derived using these size terms along with the modeled workers (students) by segment by zone. When running shadow pricing, the size terms are also scaled to the sample population, ensuring that the destination choice results from a sample population run closely resemble those from a full population run. This is particularly useful when performing tasks such as calibration or global iterations with a sample population.

        In Phase 7, a new shadow pricing method, simulation was added to ActivitySim. Instead of comparing the modeled workers to the size terms by segment by zone, the simulation method compares the modeled workers directly to the total employment by zone to ensure the final workers match total jobs. The simulation method saves run time compared to the other two methods because it only re-simulates workers and zones that are over assigned in the previous iteration.

        As of release v1.3.4, users can choose their desired shadow pricing method among daysim, ctramp, and simulation. If a model was implemented using the ctramp method, a non-trivial effort would be required to switch to the simulation method, and vice-versa. Currently, there are still regions using the ctramp method.

        Issue

        However, in PR #635, shadow pricing is changed to be disabled when running a sample population under the ctramp method. This change has caused issues in some regions' ActivitySim implementation when not running the full population. Model results do not make sense (because no shadow pricing is applied) unless running the full population.

        I don't recall whether this change was discussed, apologies if I missed it. If it was, could someone please document the rationale? If the change was made for because of something with disaggregate accessibility, it would be good to know.

        To Reproduce
        Steps to reproduce the behavior:

        1. Go to '...'
        2. Click on '....'
        3. Scroll down to '....'
        4. See error

        Expected behavior
        Shadow pricing performs as it used to for ctramp method, to ensure backward compatibility.

        Screenshots
        If applicable, add screenshots to help explain your problem.

        Additional context
        Add any other context about the problem here.

        Activity

        Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

        Metadata

        Metadata

        Assignees

        No one assigned

          Labels

          BugSomething isn't working/bug f

          Type

          No type

          Projects

          • Status
            No status

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , '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

          Shadow pricing not working as it used to for the ctramp method #944

          Description

          @i-am-sijia

          Describe the bug

          In ActivitySim, work and school location choices are doubly constrained. Shadow prices are constants applied to destination zones to constrain the model, so that work and school location choice models do not assign more workers or students to any zone than the available opportunities in that zone.

          A bit of background first. You can skip to the Issue section below if you prefer

          Prior to v1.2, ActivitySim's shadow prices could be calculated using the ctramp method. Work and school location choice models are typically applied by segments, e.g., income segments for work, school grade segments for school. Instead of employments, destination choice size terms are calculated as targets by segment by zone. Shadow prices are then derived using these size terms along with the modeled workers (students) by segment by zone. When running shadow pricing, the size terms are also scaled to the sample population, ensuring that the destination choice results from a sample population run closely resemble those from a full population run. This is particularly useful when performing tasks such as calibration or global iterations with a sample population.

          In Phase 7, a new shadow pricing method, simulation was added to ActivitySim. Instead of comparing the modeled workers to the size terms by segment by zone, the simulation method compares the modeled workers directly to the total employment by zone to ensure the final workers match total jobs. The simulation method saves run time compared to the other two methods because it only re-simulates workers and zones that are over assigned in the previous iteration.

          As of release v1.3.4, users can choose their desired shadow pricing method among daysim, ctramp, and simulation. If a model was implemented using the ctramp method, a non-trivial effort would be required to switch to the simulation method, and vice-versa. Currently, there are still regions using the ctramp method.

          Issue

          However, in PR #635, shadow pricing is changed to be disabled when running a sample population under the ctramp method. This change has caused issues in some regions' ActivitySim implementation when not running the full population. Model results do not make sense (because no shadow pricing is applied) unless running the full population.

          I don't recall whether this change was discussed, apologies if I missed it. If it was, could someone please document the rationale? If the change was made for because of something with disaggregate accessibility, it would be good to know.

          To Reproduce
          Steps to reproduce the behavior:

          1. Go to '...'
          2. Click on '....'
          3. Scroll down to '....'
          4. See error

          Expected behavior
          Shadow pricing performs as it used to for ctramp method, to ensure backward compatibility.

          Screenshots
          If applicable, add screenshots to help explain your problem.

          Additional context
          Add any other context about the problem here.

          Activity

          Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

          Metadata

          Metadata

          Assignees

          No one assigned

            Labels

            BugSomething isn't working/bug f

            Type

            No type

            Projects

            • Status
              No status

            Milestone

            No milestone

            Relationships

            None yet

            Development

            No branches or pull requests

            Issue actions

            , '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

            Shadow pricing not working as it used to for the ctramp method #944

            Description

            @i-am-sijia

            Describe the bug

            In ActivitySim, work and school location choices are doubly constrained. Shadow prices are constants applied to destination zones to constrain the model, so that work and school location choice models do not assign more workers or students to any zone than the available opportunities in that zone.

            A bit of background first. You can skip to the Issue section below if you prefer

            Prior to v1.2, ActivitySim's shadow prices could be calculated using the ctramp method. Work and school location choice models are typically applied by segments, e.g., income segments for work, school grade segments for school. Instead of employments, destination choice size terms are calculated as targets by segment by zone. Shadow prices are then derived using these size terms along with the modeled workers (students) by segment by zone. When running shadow pricing, the size terms are also scaled to the sample population, ensuring that the destination choice results from a sample population run closely resemble those from a full population run. This is particularly useful when performing tasks such as calibration or global iterations with a sample population.

            In Phase 7, a new shadow pricing method, simulation was added to ActivitySim. Instead of comparing the modeled workers to the size terms by segment by zone, the simulation method compares the modeled workers directly to the total employment by zone to ensure the final workers match total jobs. The simulation method saves run time compared to the other two methods because it only re-simulates workers and zones that are over assigned in the previous iteration.

            As of release v1.3.4, users can choose their desired shadow pricing method among daysim, ctramp, and simulation. If a model was implemented using the ctramp method, a non-trivial effort would be required to switch to the simulation method, and vice-versa. Currently, there are still regions using the ctramp method.

            Issue

            However, in PR #635, shadow pricing is changed to be disabled when running a sample population under the ctramp method. This change has caused issues in some regions' ActivitySim implementation when not running the full population. Model results do not make sense (because no shadow pricing is applied) unless running the full population.

            I don't recall whether this change was discussed, apologies if I missed it. If it was, could someone please document the rationale? If the change was made for because of something with disaggregate accessibility, it would be good to know.

            To Reproduce
            Steps to reproduce the behavior:

            1. Go to '...'
            2. Click on '....'
            3. Scroll down to '....'
            4. See error

            Expected behavior
            Shadow pricing performs as it used to for ctramp method, to ensure backward compatibility.

            Screenshots
            If applicable, add screenshots to help explain your problem.

            Additional context
            Add any other context about the problem here.

            Activity

            Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

            Metadata

            Metadata

            Assignees

            No one assigned

              Labels

              BugSomething isn't working/bug f

              Type

              No type

              Projects

              • Status
                No status

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , '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

              Shadow pricing not working as it used to for the ctramp method #944

              Description

              @i-am-sijia

              Describe the bug

              In ActivitySim, work and school location choices are doubly constrained. Shadow prices are constants applied to destination zones to constrain the model, so that work and school location choice models do not assign more workers or students to any zone than the available opportunities in that zone.

              A bit of background first. You can skip to the Issue section below if you prefer

              Prior to v1.2, ActivitySim's shadow prices could be calculated using the ctramp method. Work and school location choice models are typically applied by segments, e.g., income segments for work, school grade segments for school. Instead of employments, destination choice size terms are calculated as targets by segment by zone. Shadow prices are then derived using these size terms along with the modeled workers (students) by segment by zone. When running shadow pricing, the size terms are also scaled to the sample population, ensuring that the destination choice results from a sample population run closely resemble those from a full population run. This is particularly useful when performing tasks such as calibration or global iterations with a sample population.

              In Phase 7, a new shadow pricing method, simulation was added to ActivitySim. Instead of comparing the modeled workers to the size terms by segment by zone, the simulation method compares the modeled workers directly to the total employment by zone to ensure the final workers match total jobs. The simulation method saves run time compared to the other two methods because it only re-simulates workers and zones that are over assigned in the previous iteration.

              As of release v1.3.4, users can choose their desired shadow pricing method among daysim, ctramp, and simulation. If a model was implemented using the ctramp method, a non-trivial effort would be required to switch to the simulation method, and vice-versa. Currently, there are still regions using the ctramp method.

              Issue

              However, in PR #635, shadow pricing is changed to be disabled when running a sample population under the ctramp method. This change has caused issues in some regions' ActivitySim implementation when not running the full population. Model results do not make sense (because no shadow pricing is applied) unless running the full population.

              I don't recall whether this change was discussed, apologies if I missed it. If it was, could someone please document the rationale? If the change was made for because of something with disaggregate accessibility, it would be good to know.

              To Reproduce
              Steps to reproduce the behavior:

              1. Go to '...'
              2. Click on '....'
              3. Scroll down to '....'
              4. See error

              Expected behavior
              Shadow pricing performs as it used to for ctramp method, to ensure backward compatibility.

              Screenshots
              If applicable, add screenshots to help explain your problem.

              Additional context
              Add any other context about the problem here.

              Activity

              Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

              Metadata

              Metadata

              Assignees

              No one assigned

                Labels

                BugSomething isn't working/bug f

                Type

                No type

                Projects

                • Status
                  No status

                Milestone

                No milestone

                Relationships

                None yet

                Development

                No branches or pull requests

                Issue actions

                , '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

                Shadow pricing not working as it used to for the ctramp method #944

                Description

                @i-am-sijia

                Describe the bug

                In ActivitySim, work and school location choices are doubly constrained. Shadow prices are constants applied to destination zones to constrain the model, so that work and school location choice models do not assign more workers or students to any zone than the available opportunities in that zone.

                A bit of background first. You can skip to the Issue section below if you prefer

                Prior to v1.2, ActivitySim's shadow prices could be calculated using the ctramp method. Work and school location choice models are typically applied by segments, e.g., income segments for work, school grade segments for school. Instead of employments, destination choice size terms are calculated as targets by segment by zone. Shadow prices are then derived using these size terms along with the modeled workers (students) by segment by zone. When running shadow pricing, the size terms are also scaled to the sample population, ensuring that the destination choice results from a sample population run closely resemble those from a full population run. This is particularly useful when performing tasks such as calibration or global iterations with a sample population.

                In Phase 7, a new shadow pricing method, simulation was added to ActivitySim. Instead of comparing the modeled workers to the size terms by segment by zone, the simulation method compares the modeled workers directly to the total employment by zone to ensure the final workers match total jobs. The simulation method saves run time compared to the other two methods because it only re-simulates workers and zones that are over assigned in the previous iteration.

                As of release v1.3.4, users can choose their desired shadow pricing method among daysim, ctramp, and simulation. If a model was implemented using the ctramp method, a non-trivial effort would be required to switch to the simulation method, and vice-versa. Currently, there are still regions using the ctramp method.

                Issue

                However, in PR #635, shadow pricing is changed to be disabled when running a sample population under the ctramp method. This change has caused issues in some regions' ActivitySim implementation when not running the full population. Model results do not make sense (because no shadow pricing is applied) unless running the full population.

                I don't recall whether this change was discussed, apologies if I missed it. If it was, could someone please document the rationale? If the change was made for because of something with disaggregate accessibility, it would be good to know.

                To Reproduce
                Steps to reproduce the behavior:

                1. Go to '...'
                2. Click on '....'
                3. Scroll down to '....'
                4. See error

                Expected behavior
                Shadow pricing performs as it used to for ctramp method, to ensure backward compatibility.

                Screenshots
                If applicable, add screenshots to help explain your problem.

                Additional context
                Add any other context about the problem here.

                Activity

                Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                Metadata

                Metadata

                Assignees

                No one assigned

                  Labels

                  BugSomething isn't working/bug f

                  Type

                  No type

                  Projects

                  • Status
                    No status

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions