Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion activitysim/abm/models/input_checker.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -385,7 +385,7 @@ def input_checker(state: workflow.State):
)

data_model_dir = state.get_injectable("data_model_dir")[0]
logger.info("Data model directory:", data_model_dir)
logger.info("Data model directory: %s", data_model_dir)

# FIXME: path doesn't recognize windows path object, so converting to string.
# Is there a better way to get the data model directory than just adding it to the path?
Expand Down
9 changes: 8 additions & 1 deletion activitysim/cli/run.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,6 +22,7 @@
"configs_dir",
"data_model_dir",
"output_dir",
"cache_dir",
"settings_file_name",
"imported_extensions",
]
Expand DownExpand Up@@ -375,7 +376,13 @@ def run(args):

from activitysim.core import mp_tasks

injectables = {k: state.get_injectable(k) for k in INJECTABLES}
injectables = {}
for k in INJECTABLES:
try:
injectables[k] = state.get_injectable(k)
except KeyError:
# if injectable is not set, just ignore it
pass
injectables["settings"] = state.settings
# injectables["settings_package"] = state.settings.dict()
mp_tasks.run_multiprocess(state, injectables)
Expand Down
12 changes: 12 additions & 0 deletions activitysim/examples/external_example_manifest.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,6 +20,18 @@ prototype_mtc:
url: https://github.com/ActivitySim/activitysim-prototype-mtc/releases/download/v1.3.1/prototype_mtc_reference_pipeline.zip
sha256: 394e5b403d4c61d5214493cefe161432db840ba4967c23c999d914178d43a1f0

prototype_mtc_extended:
url: https://github.com/ActivitySim/activitysim-prototype-mtc/archive/refs/tags/v1.3.2.tar.gz
sha256: b3f8f60f6354a0ffce80dd67f058c2ef81645d2c8bedddfcb989d3878651f045
assets:
mtc_data_full.tar.zst:
url: https://github.com/ActivitySim/activitysim-prototype-mtc/releases/download/v1.3.2/mtc_data_full.tar.zst
sha256: ffc22b34b4990a1459829b101b43180d0f5d41da0d4535d58588f232c98bd44e
unpack: data_full
test/prototype_mtc_reference_pipeline.zip:
url: https://github.com/ActivitySim/activitysim-prototype-mtc/releases/download/v1.3.2/prototype_mtc_extended_reference_pipeline.zip
sha256: 4d94b6a8a83225dda17e9ca19c9110bc1df2df5b4b362effa153d1c8d31524f5

estimation_example:
url: https://github.com/ActivitySim/activitysim-estimation-example/archive/refs/tags/v0.0.2.tar.gz
sha256: 88c8208ee250a20e7d77036d77bc71122f21cbfeaba1eaf3b644120799f9d023
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,24 +3,26 @@

Instructions: customize these example values for your own ActivitySim implementation
"""
from typing import List, Optional
import os, sys, logging
from __future__ import annotations

from pydantic import BaseModel, validator
import pandera as pa
import numpy as np
import pandas as pd
import openmatrix as omx
import csv
import logging
import os

# for skim name parsing
import re
import csv

from activitysim.core import config
import sys
from typing import List, Optional

import enums as e
import numpy as np
import openmatrix as omx
import pandas as pd
import pandera as pa
from pydantic import BaseModel, validator

from activitysim.abm.models.input_checker import TABLE_STORE, log_info
from activitysim.core import config

logger = logging.getLogger(__name__)

Expand DownExpand Up@@ -225,12 +227,13 @@ def check_hh_per_zone(cls, land_use: pd.DataFrame):
def check_pop_per_zone(cls, land_use: pd.DataFrame):
persons = TABLE_STORE["persons"]
households = TABLE_STORE["households"]
pop = persons.groupby(
persons.household_id.map(
lambda hhid: households.set_index("household_id").home_zone_id[hhid]
)
).person_id.nunique()
return (pop == land_use.set_index("zone_id").TOTPOP).reindex(land_use.index)
persons_per_household = persons.groupby("household_id").size()
hh = households[["household_id", "home_zone_id"]].merge(
persons_per_household.rename("persons_per_household"), on="household_id"
)
pop = hh.groupby(households.home_zone_id)["persons_per_household"].sum()
lu = land_use.set_index("zone_id")
return pop.reindex(lu.index) == lu.TOTPOP


class NetworkLinks(pa.DataFrameModel):
Expand Down
9 changes: 7 additions & 2 deletions activitysim/workflows/steps/wrapping.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -125,8 +125,13 @@ def run_step(context: Context = None) -> None:
reset_progress_step(description=progress_tag)

return_type = _annotations.get("return", "<missing>")
_updates_context = updates_context or return_type in {dict, Context}
if return_type not in {None, dict, Context}:
_updates_context = updates_context or return_type in {
dict,
Context,
"dict",
"Context",
}
if return_type not in {None, dict, Context, "None", "dict", "Context"}:
if returns_names is None and not _updates_context:
context.assert_key_has_value(
key="report", caller=wrapped_func.__module__
Expand Down
1 change: 1 addition & 0 deletions conda-environments/activitysim-dev-base.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,7 @@ channels:
dependencies:
- python=3.10
- pip
- altair
- asv # for benchmarking
- black >= 22.0,<23
- bump2version # for making a release
Expand Down
1 change: 1 addition & 0 deletions conda-environments/activitysim-dev.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,6 +11,7 @@ channels:
dependencies:
- python=3.10
- pip
- altair
- asv # for benchmarking
- black >= 22.0,<23
- bump2version # for making a release
Expand Down
, '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
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion activitysim/abm/models/input_checker.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -385,7 +385,7 @@ def input_checker(state: workflow.State):
)

data_model_dir = state.get_injectable("data_model_dir")[0]
logger.info("Data model directory:", data_model_dir)
logger.info("Data model directory: %s", data_model_dir)

# FIXME: path doesn't recognize windows path object, so converting to string.
# Is there a better way to get the data model directory than just adding it to the path?
Expand Down
9 changes: 8 additions & 1 deletion activitysim/cli/run.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,6 +22,7 @@
"configs_dir",
"data_model_dir",
"output_dir",
"cache_dir",
"settings_file_name",
"imported_extensions",
]
Expand DownExpand Up@@ -375,7 +376,13 @@ def run(args):

from activitysim.core import mp_tasks

injectables = {k: state.get_injectable(k) for k in INJECTABLES}
injectables = {}
for k in INJECTABLES:
try:
injectables[k] = state.get_injectable(k)
except KeyError:
# if injectable is not set, just ignore it
pass
injectables["settings"] = state.settings
# injectables["settings_package"] = state.settings.dict()
mp_tasks.run_multiprocess(state, injectables)
Expand Down
12 changes: 12 additions & 0 deletions activitysim/examples/external_example_manifest.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,6 +20,18 @@ prototype_mtc:
url: https://github.com/ActivitySim/activitysim-prototype-mtc/releases/download/v1.3.1/prototype_mtc_reference_pipeline.zip
sha256: 394e5b403d4c61d5214493cefe161432db840ba4967c23c999d914178d43a1f0

prototype_mtc_extended:
url: https://github.com/ActivitySim/activitysim-prototype-mtc/archive/refs/tags/v1.3.2.tar.gz
sha256: b3f8f60f6354a0ffce80dd67f058c2ef81645d2c8bedddfcb989d3878651f045
assets:
mtc_data_full.tar.zst:
url: https://github.com/ActivitySim/activitysim-prototype-mtc/releases/download/v1.3.2/mtc_data_full.tar.zst
sha256: ffc22b34b4990a1459829b101b43180d0f5d41da0d4535d58588f232c98bd44e
unpack: data_full
test/prototype_mtc_reference_pipeline.zip:
url: https://github.com/ActivitySim/activitysim-prototype-mtc/releases/download/v1.3.2/prototype_mtc_extended_reference_pipeline.zip
sha256: 4d94b6a8a83225dda17e9ca19c9110bc1df2df5b4b362effa153d1c8d31524f5

estimation_example:
url: https://github.com/ActivitySim/activitysim-estimation-example/archive/refs/tags/v0.0.2.tar.gz
sha256: 88c8208ee250a20e7d77036d77bc71122f21cbfeaba1eaf3b644120799f9d023
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,24 +3,26 @@

Instructions: customize these example values for your own ActivitySim implementation
"""
from typing import List, Optional
import os, sys, logging
from __future__ import annotations

from pydantic import BaseModel, validator
import pandera as pa
import numpy as np
import pandas as pd
import openmatrix as omx
import csv
import logging
import os

# for skim name parsing
import re
import csv

from activitysim.core import config
import sys
from typing import List, Optional

import enums as e
import numpy as np
import openmatrix as omx
import pandas as pd
import pandera as pa
from pydantic import BaseModel, validator

from activitysim.abm.models.input_checker import TABLE_STORE, log_info
from activitysim.core import config

logger = logging.getLogger(__name__)

Expand DownExpand Up@@ -225,12 +227,13 @@ def check_hh_per_zone(cls, land_use: pd.DataFrame):
def check_pop_per_zone(cls, land_use: pd.DataFrame):
persons = TABLE_STORE["persons"]
households = TABLE_STORE["households"]
pop = persons.groupby(
persons.household_id.map(
lambda hhid: households.set_index("household_id").home_zone_id[hhid]
)
).person_id.nunique()
return (pop == land_use.set_index("zone_id").TOTPOP).reindex(land_use.index)
persons_per_household = persons.groupby("household_id").size()
hh = households[["household_id", "home_zone_id"]].merge(
persons_per_household.rename("persons_per_household"), on="household_id"
)
pop = hh.groupby(households.home_zone_id)["persons_per_household"].sum()
lu = land_use.set_index("zone_id")
return pop.reindex(lu.index) == lu.TOTPOP


class NetworkLinks(pa.DataFrameModel):
Expand Down
9 changes: 7 additions & 2 deletions activitysim/workflows/steps/wrapping.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -125,8 +125,13 @@ def run_step(context: Context = None) -> None:
reset_progress_step(description=progress_tag)

return_type = _annotations.get("return", "<missing>")
_updates_context = updates_context or return_type in {dict, Context}
if return_type not in {None, dict, Context}:
_updates_context = updates_context or return_type in {
dict,
Context,
"dict",
"Context",
}
if return_type not in {None, dict, Context, "None", "dict", "Context"}:
if returns_names is None and not _updates_context:
context.assert_key_has_value(
key="report", caller=wrapped_func.__module__
Expand Down
1 change: 1 addition & 0 deletions conda-environments/activitysim-dev-base.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,7 @@ channels:
dependencies:
- python=3.10
- pip
- altair
- asv # for benchmarking
- black >= 22.0,<23
- bump2version # for making a release
Expand Down
1 change: 1 addition & 0 deletions conda-environments/activitysim-dev.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,6 +11,7 @@ channels:
dependencies:
- python=3.10
- pip
- altair
- asv # for benchmarking
- black >= 22.0,<23
- bump2version # for making a release
Expand Down
, '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
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion activitysim/abm/models/input_checker.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -385,7 +385,7 @@ def input_checker(state: workflow.State):
)

data_model_dir = state.get_injectable("data_model_dir")[0]
logger.info("Data model directory:", data_model_dir)
logger.info("Data model directory: %s", data_model_dir)

# FIXME: path doesn't recognize windows path object, so converting to string.
# Is there a better way to get the data model directory than just adding it to the path?
Expand Down
9 changes: 8 additions & 1 deletion activitysim/cli/run.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,6 +22,7 @@
"configs_dir",
"data_model_dir",
"output_dir",
"cache_dir",
"settings_file_name",
"imported_extensions",
]
Expand DownExpand Up@@ -375,7 +376,13 @@ def run(args):

from activitysim.core import mp_tasks

injectables = {k: state.get_injectable(k) for k in INJECTABLES}
injectables = {}
for k in INJECTABLES:
try:
injectables[k] = state.get_injectable(k)
except KeyError:
# if injectable is not set, just ignore it
pass
injectables["settings"] = state.settings
# injectables["settings_package"] = state.settings.dict()
mp_tasks.run_multiprocess(state, injectables)
Expand Down
12 changes: 12 additions & 0 deletions activitysim/examples/external_example_manifest.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,6 +20,18 @@ prototype_mtc:
url: https://github.com/ActivitySim/activitysim-prototype-mtc/releases/download/v1.3.1/prototype_mtc_reference_pipeline.zip
sha256: 394e5b403d4c61d5214493cefe161432db840ba4967c23c999d914178d43a1f0

prototype_mtc_extended:
url: https://github.com/ActivitySim/activitysim-prototype-mtc/archive/refs/tags/v1.3.2.tar.gz
sha256: b3f8f60f6354a0ffce80dd67f058c2ef81645d2c8bedddfcb989d3878651f045
assets:
mtc_data_full.tar.zst:
url: https://github.com/ActivitySim/activitysim-prototype-mtc/releases/download/v1.3.2/mtc_data_full.tar.zst
sha256: ffc22b34b4990a1459829b101b43180d0f5d41da0d4535d58588f232c98bd44e
unpack: data_full
test/prototype_mtc_reference_pipeline.zip:
url: https://github.com/ActivitySim/activitysim-prototype-mtc/releases/download/v1.3.2/prototype_mtc_extended_reference_pipeline.zip
sha256: 4d94b6a8a83225dda17e9ca19c9110bc1df2df5b4b362effa153d1c8d31524f5

estimation_example:
url: https://github.com/ActivitySim/activitysim-estimation-example/archive/refs/tags/v0.0.2.tar.gz
sha256: 88c8208ee250a20e7d77036d77bc71122f21cbfeaba1eaf3b644120799f9d023
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,24 +3,26 @@

Instructions: customize these example values for your own ActivitySim implementation
"""
from typing import List, Optional
import os, sys, logging
from __future__ import annotations

from pydantic import BaseModel, validator
import pandera as pa
import numpy as np
import pandas as pd
import openmatrix as omx
import csv
import logging
import os

# for skim name parsing
import re
import csv

from activitysim.core import config
import sys
from typing import List, Optional

import enums as e
import numpy as np
import openmatrix as omx
import pandas as pd
import pandera as pa
from pydantic import BaseModel, validator

from activitysim.abm.models.input_checker import TABLE_STORE, log_info
from activitysim.core import config

logger = logging.getLogger(__name__)

Expand DownExpand Up@@ -225,12 +227,13 @@ def check_hh_per_zone(cls, land_use: pd.DataFrame):
def check_pop_per_zone(cls, land_use: pd.DataFrame):
persons = TABLE_STORE["persons"]
households = TABLE_STORE["households"]
pop = persons.groupby(
persons.household_id.map(
lambda hhid: households.set_index("household_id").home_zone_id[hhid]
)
).person_id.nunique()
return (pop == land_use.set_index("zone_id").TOTPOP).reindex(land_use.index)
persons_per_household = persons.groupby("household_id").size()
hh = households[["household_id", "home_zone_id"]].merge(
persons_per_household.rename("persons_per_household"), on="household_id"
)
pop = hh.groupby(households.home_zone_id)["persons_per_household"].sum()
lu = land_use.set_index("zone_id")
return pop.reindex(lu.index) == lu.TOTPOP


class NetworkLinks(pa.DataFrameModel):
Expand Down
9 changes: 7 additions & 2 deletions activitysim/workflows/steps/wrapping.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -125,8 +125,13 @@ def run_step(context: Context = None) -> None:
reset_progress_step(description=progress_tag)

return_type = _annotations.get("return", "<missing>")
_updates_context = updates_context or return_type in {dict, Context}
if return_type not in {None, dict, Context}:
_updates_context = updates_context or return_type in {
dict,
Context,
"dict",
"Context",
}
if return_type not in {None, dict, Context, "None", "dict", "Context"}:
if returns_names is None and not _updates_context:
context.assert_key_has_value(
key="report", caller=wrapped_func.__module__
Expand Down
1 change: 1 addition & 0 deletions conda-environments/activitysim-dev-base.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,7 @@ channels:
dependencies:
- python=3.10
- pip
- altair
- asv # for benchmarking
- black >= 22.0,<23
- bump2version # for making a release
Expand Down
1 change: 1 addition & 0 deletions conda-environments/activitysim-dev.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,6 +11,7 @@ channels:
dependencies:
- python=3.10
- pip
- altair
- asv # for benchmarking
- black >= 22.0,<23
- bump2version # for making a release
Expand Down
, '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
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion activitysim/abm/models/input_checker.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -385,7 +385,7 @@ def input_checker(state: workflow.State):
)

data_model_dir = state.get_injectable("data_model_dir")[0]
logger.info("Data model directory:", data_model_dir)
logger.info("Data model directory: %s", data_model_dir)

# FIXME: path doesn't recognize windows path object, so converting to string.
# Is there a better way to get the data model directory than just adding it to the path?
Expand Down
9 changes: 8 additions & 1 deletion activitysim/cli/run.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,6 +22,7 @@
"configs_dir",
"data_model_dir",
"output_dir",
"cache_dir",
"settings_file_name",
"imported_extensions",
]
Expand DownExpand Up@@ -375,7 +376,13 @@ def run(args):

from activitysim.core import mp_tasks

injectables = {k: state.get_injectable(k) for k in INJECTABLES}
injectables = {}
for k in INJECTABLES:
try:
injectables[k] = state.get_injectable(k)
except KeyError:
# if injectable is not set, just ignore it
pass
injectables["settings"] = state.settings
# injectables["settings_package"] = state.settings.dict()
mp_tasks.run_multiprocess(state, injectables)
Expand Down
12 changes: 12 additions & 0 deletions activitysim/examples/external_example_manifest.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,6 +20,18 @@ prototype_mtc:
url: https://github.com/ActivitySim/activitysim-prototype-mtc/releases/download/v1.3.1/prototype_mtc_reference_pipeline.zip
sha256: 394e5b403d4c61d5214493cefe161432db840ba4967c23c999d914178d43a1f0

prototype_mtc_extended:
url: https://github.com/ActivitySim/activitysim-prototype-mtc/archive/refs/tags/v1.3.2.tar.gz
sha256: b3f8f60f6354a0ffce80dd67f058c2ef81645d2c8bedddfcb989d3878651f045
assets:
mtc_data_full.tar.zst:
url: https://github.com/ActivitySim/activitysim-prototype-mtc/releases/download/v1.3.2/mtc_data_full.tar.zst
sha256: ffc22b34b4990a1459829b101b43180d0f5d41da0d4535d58588f232c98bd44e
unpack: data_full
test/prototype_mtc_reference_pipeline.zip:
url: https://github.com/ActivitySim/activitysim-prototype-mtc/releases/download/v1.3.2/prototype_mtc_extended_reference_pipeline.zip
sha256: 4d94b6a8a83225dda17e9ca19c9110bc1df2df5b4b362effa153d1c8d31524f5

estimation_example:
url: https://github.com/ActivitySim/activitysim-estimation-example/archive/refs/tags/v0.0.2.tar.gz
sha256: 88c8208ee250a20e7d77036d77bc71122f21cbfeaba1eaf3b644120799f9d023
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,24 +3,26 @@

Instructions: customize these example values for your own ActivitySim implementation
"""
from typing import List, Optional
import os, sys, logging
from __future__ import annotations

from pydantic import BaseModel, validator
import pandera as pa
import numpy as np
import pandas as pd
import openmatrix as omx
import csv
import logging
import os

# for skim name parsing
import re
import csv

from activitysim.core import config
import sys
from typing import List, Optional

import enums as e
import numpy as np
import openmatrix as omx
import pandas as pd
import pandera as pa
from pydantic import BaseModel, validator

from activitysim.abm.models.input_checker import TABLE_STORE, log_info
from activitysim.core import config

logger = logging.getLogger(__name__)

Expand DownExpand Up@@ -225,12 +227,13 @@ def check_hh_per_zone(cls, land_use: pd.DataFrame):
def check_pop_per_zone(cls, land_use: pd.DataFrame):
persons = TABLE_STORE["persons"]
households = TABLE_STORE["households"]
pop = persons.groupby(
persons.household_id.map(
lambda hhid: households.set_index("household_id").home_zone_id[hhid]
)
).person_id.nunique()
return (pop == land_use.set_index("zone_id").TOTPOP).reindex(land_use.index)
persons_per_household = persons.groupby("household_id").size()
hh = households[["household_id", "home_zone_id"]].merge(
persons_per_household.rename("persons_per_household"), on="household_id"
)
pop = hh.groupby(households.home_zone_id)["persons_per_household"].sum()
lu = land_use.set_index("zone_id")
return pop.reindex(lu.index) == lu.TOTPOP


class NetworkLinks(pa.DataFrameModel):
Expand Down
9 changes: 7 additions & 2 deletions activitysim/workflows/steps/wrapping.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -125,8 +125,13 @@ def run_step(context: Context = None) -> None:
reset_progress_step(description=progress_tag)

return_type = _annotations.get("return", "<missing>")
_updates_context = updates_context or return_type in {dict, Context}
if return_type not in {None, dict, Context}:
_updates_context = updates_context or return_type in {
dict,
Context,
"dict",
"Context",
}
if return_type not in {None, dict, Context, "None", "dict", "Context"}:
if returns_names is None and not _updates_context:
context.assert_key_has_value(
key="report", caller=wrapped_func.__module__
Expand Down
1 change: 1 addition & 0 deletions conda-environments/activitysim-dev-base.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,7 @@ channels:
dependencies:
- python=3.10
- pip
- altair
- asv # for benchmarking
- black >= 22.0,<23
- bump2version # for making a release
Expand Down
1 change: 1 addition & 0 deletions conda-environments/activitysim-dev.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,6 +11,7 @@ channels:
dependencies:
- python=3.10
- pip
- altair
- asv # for benchmarking
- black >= 22.0,<23
- bump2version # for making a release
Expand Down
, '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
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion activitysim/abm/models/input_checker.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -385,7 +385,7 @@ def input_checker(state: workflow.State):
)

data_model_dir = state.get_injectable("data_model_dir")[0]
logger.info("Data model directory:", data_model_dir)
logger.info("Data model directory: %s", data_model_dir)

# FIXME: path doesn't recognize windows path object, so converting to string.
# Is there a better way to get the data model directory than just adding it to the path?
Expand Down
9 changes: 8 additions & 1 deletion activitysim/cli/run.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,6 +22,7 @@
"configs_dir",
"data_model_dir",
"output_dir",
"cache_dir",
"settings_file_name",
"imported_extensions",
]
Expand DownExpand Up@@ -375,7 +376,13 @@ def run(args):

from activitysim.core import mp_tasks

injectables = {k: state.get_injectable(k) for k in INJECTABLES}
injectables = {}
for k in INJECTABLES:
try:
injectables[k] = state.get_injectable(k)
except KeyError:
# if injectable is not set, just ignore it
pass
injectables["settings"] = state.settings
# injectables["settings_package"] = state.settings.dict()
mp_tasks.run_multiprocess(state, injectables)
Expand Down
12 changes: 12 additions & 0 deletions activitysim/examples/external_example_manifest.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,6 +20,18 @@ prototype_mtc:
url: https://github.com/ActivitySim/activitysim-prototype-mtc/releases/download/v1.3.1/prototype_mtc_reference_pipeline.zip
sha256: 394e5b403d4c61d5214493cefe161432db840ba4967c23c999d914178d43a1f0

prototype_mtc_extended:
url: https://github.com/ActivitySim/activitysim-prototype-mtc/archive/refs/tags/v1.3.2.tar.gz
sha256: b3f8f60f6354a0ffce80dd67f058c2ef81645d2c8bedddfcb989d3878651f045
assets:
mtc_data_full.tar.zst:
url: https://github.com/ActivitySim/activitysim-prototype-mtc/releases/download/v1.3.2/mtc_data_full.tar.zst
sha256: ffc22b34b4990a1459829b101b43180d0f5d41da0d4535d58588f232c98bd44e
unpack: data_full
test/prototype_mtc_reference_pipeline.zip:
url: https://github.com/ActivitySim/activitysim-prototype-mtc/releases/download/v1.3.2/prototype_mtc_extended_reference_pipeline.zip
sha256: 4d94b6a8a83225dda17e9ca19c9110bc1df2df5b4b362effa153d1c8d31524f5

estimation_example:
url: https://github.com/ActivitySim/activitysim-estimation-example/archive/refs/tags/v0.0.2.tar.gz
sha256: 88c8208ee250a20e7d77036d77bc71122f21cbfeaba1eaf3b644120799f9d023
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,24 +3,26 @@

Instructions: customize these example values for your own ActivitySim implementation
"""
from typing import List, Optional
import os, sys, logging
from __future__ import annotations

from pydantic import BaseModel, validator
import pandera as pa
import numpy as np
import pandas as pd
import openmatrix as omx
import csv
import logging
import os

# for skim name parsing
import re
import csv

from activitysim.core import config
import sys
from typing import List, Optional

import enums as e
import numpy as np
import openmatrix as omx
import pandas as pd
import pandera as pa
from pydantic import BaseModel, validator

from activitysim.abm.models.input_checker import TABLE_STORE, log_info
from activitysim.core import config

logger = logging.getLogger(__name__)

Expand DownExpand Up@@ -225,12 +227,13 @@ def check_hh_per_zone(cls, land_use: pd.DataFrame):
def check_pop_per_zone(cls, land_use: pd.DataFrame):
persons = TABLE_STORE["persons"]
households = TABLE_STORE["households"]
pop = persons.groupby(
persons.household_id.map(
lambda hhid: households.set_index("household_id").home_zone_id[hhid]
)
).person_id.nunique()
return (pop == land_use.set_index("zone_id").TOTPOP).reindex(land_use.index)
persons_per_household = persons.groupby("household_id").size()
hh = households[["household_id", "home_zone_id"]].merge(
persons_per_household.rename("persons_per_household"), on="household_id"
)
pop = hh.groupby(households.home_zone_id)["persons_per_household"].sum()
lu = land_use.set_index("zone_id")
return pop.reindex(lu.index) == lu.TOTPOP


class NetworkLinks(pa.DataFrameModel):
Expand Down
9 changes: 7 additions & 2 deletions activitysim/workflows/steps/wrapping.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -125,8 +125,13 @@ def run_step(context: Context = None) -> None:
reset_progress_step(description=progress_tag)

return_type = _annotations.get("return", "<missing>")
_updates_context = updates_context or return_type in {dict, Context}
if return_type not in {None, dict, Context}:
_updates_context = updates_context or return_type in {
dict,
Context,
"dict",
"Context",
}
if return_type not in {None, dict, Context, "None", "dict", "Context"}:
if returns_names is None and not _updates_context:
context.assert_key_has_value(
key="report", caller=wrapped_func.__module__
Expand Down
1 change: 1 addition & 0 deletions conda-environments/activitysim-dev-base.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,7 @@ channels:
dependencies:
- python=3.10
- pip
- altair
- asv # for benchmarking
- black >= 22.0,<23
- bump2version # for making a release
Expand Down
1 change: 1 addition & 0 deletions conda-environments/activitysim-dev.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,6 +11,7 @@ channels:
dependencies:
- python=3.10
- pip
- altair
- asv # for benchmarking
- black >= 22.0,<23
- bump2version # for making a release
Expand Down
, '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
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion activitysim/abm/models/input_checker.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -385,7 +385,7 @@ def input_checker(state: workflow.State):
)

data_model_dir = state.get_injectable("data_model_dir")[0]
logger.info("Data model directory:", data_model_dir)
logger.info("Data model directory: %s", data_model_dir)

# FIXME: path doesn't recognize windows path object, so converting to string.
# Is there a better way to get the data model directory than just adding it to the path?
Expand Down
9 changes: 8 additions & 1 deletion activitysim/cli/run.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,6 +22,7 @@
"configs_dir",
"data_model_dir",
"output_dir",
"cache_dir",
"settings_file_name",
"imported_extensions",
]
Expand DownExpand Up@@ -375,7 +376,13 @@ def run(args):

from activitysim.core import mp_tasks

injectables = {k: state.get_injectable(k) for k in INJECTABLES}
injectables = {}
for k in INJECTABLES:
try:
injectables[k] = state.get_injectable(k)
except KeyError:
# if injectable is not set, just ignore it
pass
injectables["settings"] = state.settings
# injectables["settings_package"] = state.settings.dict()
mp_tasks.run_multiprocess(state, injectables)
Expand Down
12 changes: 12 additions & 0 deletions activitysim/examples/external_example_manifest.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,6 +20,18 @@ prototype_mtc:
url: https://github.com/ActivitySim/activitysim-prototype-mtc/releases/download/v1.3.1/prototype_mtc_reference_pipeline.zip
sha256: 394e5b403d4c61d5214493cefe161432db840ba4967c23c999d914178d43a1f0

prototype_mtc_extended:
url: https://github.com/ActivitySim/activitysim-prototype-mtc/archive/refs/tags/v1.3.2.tar.gz
sha256: b3f8f60f6354a0ffce80dd67f058c2ef81645d2c8bedddfcb989d3878651f045
assets:
mtc_data_full.tar.zst:
url: https://github.com/ActivitySim/activitysim-prototype-mtc/releases/download/v1.3.2/mtc_data_full.tar.zst
sha256: ffc22b34b4990a1459829b101b43180d0f5d41da0d4535d58588f232c98bd44e
unpack: data_full
test/prototype_mtc_reference_pipeline.zip:
url: https://github.com/ActivitySim/activitysim-prototype-mtc/releases/download/v1.3.2/prototype_mtc_extended_reference_pipeline.zip
sha256: 4d94b6a8a83225dda17e9ca19c9110bc1df2df5b4b362effa153d1c8d31524f5

estimation_example:
url: https://github.com/ActivitySim/activitysim-estimation-example/archive/refs/tags/v0.0.2.tar.gz
sha256: 88c8208ee250a20e7d77036d77bc71122f21cbfeaba1eaf3b644120799f9d023
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,24 +3,26 @@

Instructions: customize these example values for your own ActivitySim implementation
"""
from typing import List, Optional
import os, sys, logging
from __future__ import annotations

from pydantic import BaseModel, validator
import pandera as pa
import numpy as np
import pandas as pd
import openmatrix as omx
import csv
import logging
import os

# for skim name parsing
import re
import csv

from activitysim.core import config
import sys
from typing import List, Optional

import enums as e
import numpy as np
import openmatrix as omx
import pandas as pd
import pandera as pa
from pydantic import BaseModel, validator

from activitysim.abm.models.input_checker import TABLE_STORE, log_info
from activitysim.core import config

logger = logging.getLogger(__name__)

Expand DownExpand Up@@ -225,12 +227,13 @@ def check_hh_per_zone(cls, land_use: pd.DataFrame):
def check_pop_per_zone(cls, land_use: pd.DataFrame):
persons = TABLE_STORE["persons"]
households = TABLE_STORE["households"]
pop = persons.groupby(
persons.household_id.map(
lambda hhid: households.set_index("household_id").home_zone_id[hhid]
)
).person_id.nunique()
return (pop == land_use.set_index("zone_id").TOTPOP).reindex(land_use.index)
persons_per_household = persons.groupby("household_id").size()
hh = households[["household_id", "home_zone_id"]].merge(
persons_per_household.rename("persons_per_household"), on="household_id"
)
pop = hh.groupby(households.home_zone_id)["persons_per_household"].sum()
lu = land_use.set_index("zone_id")
return pop.reindex(lu.index) == lu.TOTPOP


class NetworkLinks(pa.DataFrameModel):
Expand Down
9 changes: 7 additions & 2 deletions activitysim/workflows/steps/wrapping.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -125,8 +125,13 @@ def run_step(context: Context = None) -> None:
reset_progress_step(description=progress_tag)

return_type = _annotations.get("return", "<missing>")
_updates_context = updates_context or return_type in {dict, Context}
if return_type not in {None, dict, Context}:
_updates_context = updates_context or return_type in {
dict,
Context,
"dict",
"Context",
}
if return_type not in {None, dict, Context, "None", "dict", "Context"}:
if returns_names is None and not _updates_context:
context.assert_key_has_value(
key="report", caller=wrapped_func.__module__
Expand Down
1 change: 1 addition & 0 deletions conda-environments/activitysim-dev-base.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,7 @@ channels:
dependencies:
- python=3.10
- pip
- altair
- asv # for benchmarking
- black >= 22.0,<23
- bump2version # for making a release
Expand Down
1 change: 1 addition & 0 deletions conda-environments/activitysim-dev.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,6 +11,7 @@ channels:
dependencies:
- python=3.10
- pip
- altair
- asv # for benchmarking
- black >= 22.0,<23
- bump2version # for making a release
Expand Down
, '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
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion activitysim/abm/models/input_checker.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -385,7 +385,7 @@ def input_checker(state: workflow.State):
)

data_model_dir = state.get_injectable("data_model_dir")[0]
logger.info("Data model directory:", data_model_dir)
logger.info("Data model directory: %s", data_model_dir)

# FIXME: path doesn't recognize windows path object, so converting to string.
# Is there a better way to get the data model directory than just adding it to the path?
Expand Down
9 changes: 8 additions & 1 deletion activitysim/cli/run.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,6 +22,7 @@
"configs_dir",
"data_model_dir",
"output_dir",
"cache_dir",
"settings_file_name",
"imported_extensions",
]
Expand DownExpand Up@@ -375,7 +376,13 @@ def run(args):

from activitysim.core import mp_tasks

injectables = {k: state.get_injectable(k) for k in INJECTABLES}
injectables = {}
for k in INJECTABLES:
try:
injectables[k] = state.get_injectable(k)
except KeyError:
# if injectable is not set, just ignore it
pass
injectables["settings"] = state.settings
# injectables["settings_package"] = state.settings.dict()
mp_tasks.run_multiprocess(state, injectables)
Expand Down
12 changes: 12 additions & 0 deletions activitysim/examples/external_example_manifest.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,6 +20,18 @@ prototype_mtc:
url: https://github.com/ActivitySim/activitysim-prototype-mtc/releases/download/v1.3.1/prototype_mtc_reference_pipeline.zip
sha256: 394e5b403d4c61d5214493cefe161432db840ba4967c23c999d914178d43a1f0

prototype_mtc_extended:
url: https://github.com/ActivitySim/activitysim-prototype-mtc/archive/refs/tags/v1.3.2.tar.gz
sha256: b3f8f60f6354a0ffce80dd67f058c2ef81645d2c8bedddfcb989d3878651f045
assets:
mtc_data_full.tar.zst:
url: https://github.com/ActivitySim/activitysim-prototype-mtc/releases/download/v1.3.2/mtc_data_full.tar.zst
sha256: ffc22b34b4990a1459829b101b43180d0f5d41da0d4535d58588f232c98bd44e
unpack: data_full
test/prototype_mtc_reference_pipeline.zip:
url: https://github.com/ActivitySim/activitysim-prototype-mtc/releases/download/v1.3.2/prototype_mtc_extended_reference_pipeline.zip
sha256: 4d94b6a8a83225dda17e9ca19c9110bc1df2df5b4b362effa153d1c8d31524f5

estimation_example:
url: https://github.com/ActivitySim/activitysim-estimation-example/archive/refs/tags/v0.0.2.tar.gz
sha256: 88c8208ee250a20e7d77036d77bc71122f21cbfeaba1eaf3b644120799f9d023
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,24 +3,26 @@

Instructions: customize these example values for your own ActivitySim implementation
"""
from typing import List, Optional
import os, sys, logging
from __future__ import annotations

from pydantic import BaseModel, validator
import pandera as pa
import numpy as np
import pandas as pd
import openmatrix as omx
import csv
import logging
import os

# for skim name parsing
import re
import csv

from activitysim.core import config
import sys
from typing import List, Optional

import enums as e
import numpy as np
import openmatrix as omx
import pandas as pd
import pandera as pa
from pydantic import BaseModel, validator

from activitysim.abm.models.input_checker import TABLE_STORE, log_info
from activitysim.core import config

logger = logging.getLogger(__name__)

Expand DownExpand Up@@ -225,12 +227,13 @@ def check_hh_per_zone(cls, land_use: pd.DataFrame):
def check_pop_per_zone(cls, land_use: pd.DataFrame):
persons = TABLE_STORE["persons"]
households = TABLE_STORE["households"]
pop = persons.groupby(
persons.household_id.map(
lambda hhid: households.set_index("household_id").home_zone_id[hhid]
)
).person_id.nunique()
return (pop == land_use.set_index("zone_id").TOTPOP).reindex(land_use.index)
persons_per_household = persons.groupby("household_id").size()
hh = households[["household_id", "home_zone_id"]].merge(
persons_per_household.rename("persons_per_household"), on="household_id"
)
pop = hh.groupby(households.home_zone_id)["persons_per_household"].sum()
lu = land_use.set_index("zone_id")
return pop.reindex(lu.index) == lu.TOTPOP


class NetworkLinks(pa.DataFrameModel):
Expand Down
9 changes: 7 additions & 2 deletions activitysim/workflows/steps/wrapping.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -125,8 +125,13 @@ def run_step(context: Context = None) -> None:
reset_progress_step(description=progress_tag)

return_type = _annotations.get("return", "<missing>")
_updates_context = updates_context or return_type in {dict, Context}
if return_type not in {None, dict, Context}:
_updates_context = updates_context or return_type in {
dict,
Context,
"dict",
"Context",
}
if return_type not in {None, dict, Context, "None", "dict", "Context"}:
if returns_names is None and not _updates_context:
context.assert_key_has_value(
key="report", caller=wrapped_func.__module__
Expand Down
1 change: 1 addition & 0 deletions conda-environments/activitysim-dev-base.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,7 @@ channels:
dependencies:
- python=3.10
- pip
- altair
- asv # for benchmarking
- black >= 22.0,<23
- bump2version # for making a release
Expand Down
1 change: 1 addition & 0 deletions conda-environments/activitysim-dev.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,6 +11,7 @@ channels:
dependencies:
- python=3.10
- pip
- altair
- asv # for benchmarking
- black >= 22.0,<23
- bump2version # for making a release
Expand Down
, '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
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion activitysim/abm/models/input_checker.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -385,7 +385,7 @@ def input_checker(state: workflow.State):
)

data_model_dir = state.get_injectable("data_model_dir")[0]
logger.info("Data model directory:", data_model_dir)
logger.info("Data model directory: %s", data_model_dir)

# FIXME: path doesn't recognize windows path object, so converting to string.
# Is there a better way to get the data model directory than just adding it to the path?
Expand Down
9 changes: 8 additions & 1 deletion activitysim/cli/run.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,6 +22,7 @@
"configs_dir",
"data_model_dir",
"output_dir",
"cache_dir",
"settings_file_name",
"imported_extensions",
]
Expand DownExpand Up@@ -375,7 +376,13 @@ def run(args):

from activitysim.core import mp_tasks

injectables = {k: state.get_injectable(k) for k in INJECTABLES}
injectables = {}
for k in INJECTABLES:
try:
injectables[k] = state.get_injectable(k)
except KeyError:
# if injectable is not set, just ignore it
pass
injectables["settings"] = state.settings
# injectables["settings_package"] = state.settings.dict()
mp_tasks.run_multiprocess(state, injectables)
Expand Down
12 changes: 12 additions & 0 deletions activitysim/examples/external_example_manifest.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -20,6 +20,18 @@ prototype_mtc:
url: https://github.com/ActivitySim/activitysim-prototype-mtc/releases/download/v1.3.1/prototype_mtc_reference_pipeline.zip
sha256: 394e5b403d4c61d5214493cefe161432db840ba4967c23c999d914178d43a1f0

prototype_mtc_extended:
url: https://github.com/ActivitySim/activitysim-prototype-mtc/archive/refs/tags/v1.3.2.tar.gz
sha256: b3f8f60f6354a0ffce80dd67f058c2ef81645d2c8bedddfcb989d3878651f045
assets:
mtc_data_full.tar.zst:
url: https://github.com/ActivitySim/activitysim-prototype-mtc/releases/download/v1.3.2/mtc_data_full.tar.zst
sha256: ffc22b34b4990a1459829b101b43180d0f5d41da0d4535d58588f232c98bd44e
unpack: data_full
test/prototype_mtc_reference_pipeline.zip:
url: https://github.com/ActivitySim/activitysim-prototype-mtc/releases/download/v1.3.2/prototype_mtc_extended_reference_pipeline.zip
sha256: 4d94b6a8a83225dda17e9ca19c9110bc1df2df5b4b362effa153d1c8d31524f5

estimation_example:
url: https://github.com/ActivitySim/activitysim-estimation-example/archive/refs/tags/v0.0.2.tar.gz
sha256: 88c8208ee250a20e7d77036d77bc71122f21cbfeaba1eaf3b644120799f9d023
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,24 +3,26 @@

Instructions: customize these example values for your own ActivitySim implementation
"""
from typing import List, Optional
import os, sys, logging
from __future__ import annotations

from pydantic import BaseModel, validator
import pandera as pa
import numpy as np
import pandas as pd
import openmatrix as omx
import csv
import logging
import os

# for skim name parsing
import re
import csv

from activitysim.core import config
import sys
from typing import List, Optional

import enums as e
import numpy as np
import openmatrix as omx
import pandas as pd
import pandera as pa
from pydantic import BaseModel, validator

from activitysim.abm.models.input_checker import TABLE_STORE, log_info
from activitysim.core import config

logger = logging.getLogger(__name__)

Expand DownExpand Up@@ -225,12 +227,13 @@ def check_hh_per_zone(cls, land_use: pd.DataFrame):
def check_pop_per_zone(cls, land_use: pd.DataFrame):
persons = TABLE_STORE["persons"]
households = TABLE_STORE["households"]
pop = persons.groupby(
persons.household_id.map(
lambda hhid: households.set_index("household_id").home_zone_id[hhid]
)
).person_id.nunique()
return (pop == land_use.set_index("zone_id").TOTPOP).reindex(land_use.index)
persons_per_household = persons.groupby("household_id").size()
hh = households[["household_id", "home_zone_id"]].merge(
persons_per_household.rename("persons_per_household"), on="household_id"
)
pop = hh.groupby(households.home_zone_id)["persons_per_household"].sum()
lu = land_use.set_index("zone_id")
return pop.reindex(lu.index) == lu.TOTPOP


class NetworkLinks(pa.DataFrameModel):
Expand Down
9 changes: 7 additions & 2 deletions activitysim/workflows/steps/wrapping.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -125,8 +125,13 @@ def run_step(context: Context = None) -> None:
reset_progress_step(description=progress_tag)

return_type = _annotations.get("return", "<missing>")
_updates_context = updates_context or return_type in {dict, Context}
if return_type not in {None, dict, Context}:
_updates_context = updates_context or return_type in {
dict,
Context,
"dict",
"Context",
}
if return_type not in {None, dict, Context, "None", "dict", "Context"}:
if returns_names is None and not _updates_context:
context.assert_key_has_value(
key="report", caller=wrapped_func.__module__
Expand Down
1 change: 1 addition & 0 deletions conda-environments/activitysim-dev-base.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,7 @@ channels:
dependencies:
- python=3.10
- pip
- altair
- asv # for benchmarking
- black >= 22.0,<23
- bump2version # for making a release
Expand Down
1 change: 1 addition & 0 deletions conda-environments/activitysim-dev.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,6 +11,7 @@ channels:
dependencies:
- python=3.10
- pip
- altair
- asv # for benchmarking
- black >= 22.0,<23
- bump2version # for making a release
Expand Down