ashlr-plugin 1.36.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/plugins/marketplace.json +20 -0
- package/.claude-plugin/marketplace.json +39 -0
- package/.claude-plugin/plugin.json +36 -0
- package/.codex/agents/README.md +9 -0
- package/.codex/agents/ashlr-explorer.md +36 -0
- package/.codex/agents/ashlr-worker.md +38 -0
- package/.codex-plugin/plugin.json +45 -0
- package/.mcp.json +14 -0
- package/LICENSE +21 -0
- package/README.md +311 -0
- package/agents/ashlr-code.md +69 -0
- package/agents/ashlr-explore.md +44 -0
- package/agents/ashlr-plan.md +54 -0
- package/bench/fixtures/notebook-large.ipynb +660 -0
- package/bench/fixtures/notebook-small.ipynb +39 -0
- package/bench/fixtures/tasklist-closed.json +62 -0
- package/bench/fixtures/tasklist-large-mixed.json +27 -0
- package/bench/fixtures/tasklist-sprint-open.json +79 -0
- package/bench/fixtures/websearch-bun-runtime.json +32 -0
- package/bench/fixtures/websearch-react-hooks-patterns.json +32 -0
- package/bench/fixtures/websearch-typescript-generics.json +38 -0
- package/bench/refs/node-sdk/.refrev +1 -0
- package/bench/refs/node-sdk/README.md +17 -0
- package/bench/refs/node-sdk/src/agent/agent.ts +163 -0
- package/bench/refs/node-sdk/src/agent/create-agent-ui-stream.ts +83 -0
- package/bench/refs/node-sdk/src/agent/tool-loop-agent.ts +238 -0
- package/bench/refs/node-sdk/src/embed/embed-many.ts +409 -0
- package/bench/refs/node-sdk/src/embed/embed-result.ts +50 -0
- package/bench/refs/node-sdk/src/embed/embed.ts +257 -0
- package/bench/refs/node-sdk/src/error/invalid-argument-error.ts +34 -0
- package/bench/refs/node-sdk/src/error/invalid-tool-input-error.ts +33 -0
- package/bench/refs/node-sdk/src/error/no-object-generated-error.ts +70 -0
- package/bench/refs/node-sdk/src/generate-image/generate-image-result.ts +42 -0
- package/bench/refs/node-sdk/src/generate-image/generate-image.ts +362 -0
- package/bench/refs/node-sdk/src/generate-object/generate-object-result.ts +67 -0
- package/bench/refs/node-sdk/src/generate-object/generate-object.ts +501 -0
- package/bench/refs/node-sdk/src/generate-object/inject-json-instruction.ts +30 -0
- package/bench/refs/node-sdk/src/generate-object/output-strategy.ts +415 -0
- package/bench/refs/node-sdk/src/generate-object/repair-text.ts +12 -0
- package/bench/refs/node-sdk/src/generate-object/stream-object.ts +960 -0
- package/bench/refs/node-sdk/src/generate-speech/generate-speech.ts +191 -0
- package/bench/refs/node-sdk/src/generate-text/generate-text.ts +1484 -0
- package/bench/refs/node-sdk/src/generate-text/stream-text.ts +2708 -0
- package/bench/refs/node-sdk/src/generate-text/tool-call.ts +59 -0
- package/bench/refs/node-sdk/src/generate-text/tool-result.ts +36 -0
- package/bench/refs/node-sdk/src/telemetry/create-telemetry-dispatcher.ts +146 -0
- package/bench/refs/node-sdk/src/telemetry/telemetry-registry.ts +15 -0
- package/bench/refs/node-sdk/src/telemetry/telemetry.ts +223 -0
- package/bench/refs/node-sdk/src/util/async-iterable-stream.ts +94 -0
- package/bench/refs/node-sdk/src/util/consume-stream.ts +31 -0
- package/bench/refs/node-sdk/src/util/create-stitchable-stream.ts +112 -0
- package/bench/refs/node-sdk/src/util/download/download.ts +74 -0
- package/bench/refs/node-sdk/src/util/error-handler.ts +1 -0
- package/bench/refs/node-sdk/src/util/fix-json.ts +401 -0
- package/bench/refs/node-sdk/src/util/merge-objects.ts +79 -0
- package/bench/refs/python-lib/.refrev +1 -0
- package/bench/refs/python-lib/README.md +18 -0
- package/bench/refs/python-lib/pandas/core/_numba/executor.py +249 -0
- package/bench/refs/python-lib/pandas/core/_numba/extensions.py +586 -0
- package/bench/refs/python-lib/pandas/core/_numba/kernels/mean_.py +198 -0
- package/bench/refs/python-lib/pandas/core/_numba/kernels/min_max_.py +178 -0
- package/bench/refs/python-lib/pandas/core/_numba/kernels/sum_.py +255 -0
- package/bench/refs/python-lib/pandas/core/_numba/kernels/var_.py +251 -0
- package/bench/refs/python-lib/pandas/core/accessor.py +520 -0
- package/bench/refs/python-lib/pandas/core/api.py +138 -0
- package/bench/refs/python-lib/pandas/core/array_algos/masked_accumulations.py +97 -0
- package/bench/refs/python-lib/pandas/core/array_algos/masked_reductions.py +252 -0
- package/bench/refs/python-lib/pandas/core/array_algos/putmask.py +150 -0
- package/bench/refs/python-lib/pandas/core/array_algos/quantile.py +232 -0
- package/bench/refs/python-lib/pandas/core/array_algos/replace.py +159 -0
- package/bench/refs/python-lib/pandas/core/array_algos/take.py +609 -0
- package/bench/refs/python-lib/pandas/core/arraylike.py +534 -0
- package/bench/refs/python-lib/pandas/core/arrays/_arrow_string_mixins.py +434 -0
- package/bench/refs/python-lib/pandas/core/arrays/_mixins.py +630 -0
- package/bench/refs/python-lib/pandas/core/arrays/_ranges.py +276 -0
- package/bench/refs/python-lib/pandas/core/arrays/_utils.py +77 -0
- package/bench/refs/python-lib/pandas/core/arrays/arrow/accessors.py +521 -0
- package/bench/refs/python-lib/pandas/core/arrays/arrow/extension_types.py +174 -0
- package/bench/refs/python-lib/pandas/core/arrays/boolean.py +454 -0
- package/bench/refs/python-lib/pandas/core/arrays/floating.py +192 -0
- package/bench/refs/python-lib/pandas/core/arrays/integer.py +296 -0
- package/bench/refs/python-lib/pandas/core/arrays/masked.py +2140 -0
- package/bench/refs/python-lib/pandas/core/arrays/numeric.py +305 -0
- package/bench/refs/python-lib/pandas/core/arrays/numpy_.py +701 -0
- package/bench/refs/python-lib/pandas/core/arrays/period.py +1586 -0
- package/bench/refs/python-lib/pandas/core/arrays/sparse/accessor.py +505 -0
- package/bench/refs/python-lib/pandas/core/arrays/sparse/scipy_sparse.py +208 -0
- package/bench/refs/rust-project/.refrev +1 -0
- package/bench/refs/rust-project/README.md +17 -0
- package/bench/refs/rust-project/tokio/src/doc/os.rs +68 -0
- package/bench/refs/rust-project/tokio/src/fs/dir_builder.rs +129 -0
- package/bench/refs/rust-project/tokio/src/fs/file.rs +1113 -0
- package/bench/refs/rust-project/tokio/src/fs/mocks.rs +176 -0
- package/bench/refs/rust-project/tokio/src/fs/mod.rs +324 -0
- package/bench/refs/rust-project/tokio/src/fs/open_options.rs +856 -0
- package/bench/refs/rust-project/tokio/src/fs/read.rs +80 -0
- package/bench/refs/rust-project/tokio/src/fs/read_dir.rs +357 -0
- package/bench/refs/rust-project/tokio/src/fs/write.rs +99 -0
- package/bench/refs/rust-project/tokio/src/future/maybe_done.rs +123 -0
- package/bench/refs/rust-project/tokio/src/future/try_join.rs +82 -0
- package/bench/refs/rust-project/tokio/src/io/async_buf_read.rs +117 -0
- package/bench/refs/rust-project/tokio/src/io/async_read.rs +133 -0
- package/bench/refs/rust-project/tokio/src/io/async_seek.rs +96 -0
- package/bench/refs/rust-project/tokio/src/io/async_write.rs +402 -0
- package/bench/refs/rust-project/tokio/src/io/blocking.rs +339 -0
- package/bench/refs/rust-project/tokio/src/io/interest.rs +345 -0
- package/bench/refs/rust-project/tokio/src/io/join.rs +130 -0
- package/bench/refs/rust-project/tokio/src/io/mod.rs +308 -0
- package/bench/refs/rust-project/tokio/src/io/poll_evented.rs +319 -0
- package/bench/refs/rust-project/tokio/src/io/read_buf.rs +344 -0
- package/bench/refs/rust-project/tokio/src/io/ready.rs +322 -0
- package/bench/refs/rust-project/tokio/src/io/split.rs +166 -0
- package/bench/refs/rust-project/tokio/src/io/stderr.rs +148 -0
- package/bench/refs/rust-project/tokio/src/io/stdin.rs +98 -0
- package/bench/refs/rust-project/tokio/src/io/stdio_common.rs +222 -0
- package/bench/refs/rust-project/tokio/src/io/stdout.rs +197 -0
- package/bench/refs/rust-project/tokio/src/io/util/buf_reader.rs +311 -0
- package/bench/refs/rust-project/tokio/src/io/util/buf_stream.rs +207 -0
- package/bench/refs/rust-project/tokio/src/io/util/buf_writer.rs +310 -0
- package/bench/refs/rust-project/tokio/src/io/util/chain.rs +144 -0
- package/commands/_spawn-patterns.json +32 -0
- package/commands/ashlr-allow.md +21 -0
- package/commands/ashlr-benchmark.md +53 -0
- package/commands/ashlr-brief.md +97 -0
- package/commands/ashlr-budget.md +76 -0
- package/commands/ashlr-compact.md +54 -0
- package/commands/ashlr-dashboard.md +37 -0
- package/commands/ashlr-doctor.md +56 -0
- package/commands/ashlr-eco-mode.md +92 -0
- package/commands/ashlr-genome-init.md +24 -0
- package/commands/ashlr-genome-keygen.md +36 -0
- package/commands/ashlr-genome-loop.md +118 -0
- package/commands/ashlr-genome-push.md +36 -0
- package/commands/ashlr-genome-rewrap.md +48 -0
- package/commands/ashlr-genome-team-init.md +67 -0
- package/commands/ashlr-handoff.md +23 -0
- package/commands/ashlr-help.md +86 -0
- package/commands/ashlr-hook-timings.md +30 -0
- package/commands/ashlr-leaderboard.md +50 -0
- package/commands/ashlr-ollama-setup.md +39 -0
- package/commands/ashlr-orchestrate-status.md +72 -0
- package/commands/ashlr-orchestrate.md +83 -0
- package/commands/ashlr-parallelize.md +63 -0
- package/commands/ashlr-report-crash.md +33 -0
- package/commands/ashlr-resume.md +72 -0
- package/commands/ashlr-savings.md +24 -0
- package/commands/ashlr-settings.md +50 -0
- package/commands/ashlr-spawn.md +61 -0
- package/commands/ashlr-start.md +60 -0
- package/commands/ashlr-status.md +64 -0
- package/commands/ashlr-team-invite.md +47 -0
- package/commands/ashlr-tier.md +122 -0
- package/commands/ashlr-tour.md +60 -0
- package/commands/ashlr-update.md +155 -0
- package/commands/ashlr-upgrade.md +96 -0
- package/commands/goal.md +58 -0
- package/commands/loop.md +40 -0
- package/docs/CNAME +1 -0
- package/docs/PRO_TIER.md +104 -0
- package/docs/README.md +21 -0
- package/docs/architecture.md +415 -0
- package/docs/ashlr-pipe.md +161 -0
- package/docs/assets/logo.svg +19 -0
- package/docs/assets/og.png +0 -0
- package/docs/assets/og.svg +41 -0
- package/docs/benchmarks-v2.json +355 -0
- package/docs/benchmarks.json +102 -0
- package/docs/benchmarks.md +211 -0
- package/docs/billing.md +185 -0
- package/docs/cloud-genome.md +155 -0
- package/docs/competitive-wozcode.md +92 -0
- package/docs/deploy.md +325 -0
- package/docs/email-templates.md +113 -0
- package/docs/embed-tuning.md +103 -0
- package/docs/genome.md +120 -0
- package/docs/github-oauth-onboarding.md +127 -0
- package/docs/hero-video-script.md +129 -0
- package/docs/index.html +2262 -0
- package/docs/install-prompt.md +78 -0
- package/docs/install-windows.md +132 -0
- package/docs/install.ps1 +171 -0
- package/docs/install.sh +146 -0
- package/docs/launch/README.md +114 -0
- package/docs/launch/hn.md +49 -0
- package/docs/launch/reddit.md +45 -0
- package/docs/launch/x.md +65 -0
- package/docs/launch-post.md +112 -0
- package/docs/legal.md +78 -0
- package/docs/llm-providers.md +99 -0
- package/docs/multi-host-mcp.md +217 -0
- package/docs/multi-turn-architecture.md +108 -0
- package/docs/operations/deployment.md +108 -0
- package/docs/operations/error-monitoring.md +70 -0
- package/docs/operations/weekly-digest.md +70 -0
- package/docs/operations.md +494 -0
- package/docs/platform-support.md +133 -0
- package/docs/policy-packs.md +188 -0
- package/docs/press-kit/fact-sheet.md +78 -0
- package/docs/press-kit/founder-bio.md +3 -0
- package/docs/press-kit/logo.svg +33 -0
- package/docs/press-kit/screenshots.md +146 -0
- package/docs/pricing.md +251 -0
- package/docs/pro-backend-architecture.md +523 -0
- package/docs/producthunt.md +52 -0
- package/docs/router-migration.md +110 -0
- package/docs/session-log-schema.md +68 -0
- package/docs/social.md +95 -0
- package/docs/team-genome.md +528 -0
- package/docs/telemetry.md +194 -0
- package/docs/test-isolation.md +100 -0
- package/docs/upgrade.md +159 -0
- package/hooks/_hook-errors.ts +87 -0
- package/hooks/_hook-perf-emit.ts +113 -0
- package/hooks/_hook-timing-ledger.ts +1133 -0
- package/hooks/_nudge-throttle.ts +127 -0
- package/hooks/_recent-blocks.ts +127 -0
- package/hooks/audit-upload.ts +86 -0
- package/hooks/codex-hooks.json +171 -0
- package/hooks/commit-attribution.ts +179 -0
- package/hooks/edit-batching-nudge.ts +154 -0
- package/hooks/genome-scribe-hook.ts +219 -0
- package/hooks/hooks.json +294 -0
- package/hooks/orient-nudge-hook.ts +242 -0
- package/hooks/policy-enforce.ts +214 -0
- package/hooks/post-tool-use-embedding.ts +93 -0
- package/hooks/post-tool-use-genome.sh +37 -0
- package/hooks/post-tool-use-genome.ts +69 -0
- package/hooks/posttooluse-correlate.ts +122 -0
- package/hooks/posttooluse-dedupe-output.ts +241 -0
- package/hooks/posttooluse-genome-refresh.ts +223 -0
- package/hooks/posttooluse-native-nudge.ts +205 -0
- package/hooks/posttooluse-stale-result.ts +277 -0
- package/hooks/pretooluse-bash.ts +63 -0
- package/hooks/pretooluse-budget-guard.ts +318 -0
- package/hooks/pretooluse-common.ts +985 -0
- package/hooks/pretooluse-eco-router.ts +196 -0
- package/hooks/pretooluse-edit.sh +93 -0
- package/hooks/pretooluse-edit.ts +197 -0
- package/hooks/pretooluse-glob.ts +70 -0
- package/hooks/pretooluse-grep.sh +85 -0
- package/hooks/pretooluse-grep.ts +96 -0
- package/hooks/pretooluse-notebookedit.ts +121 -0
- package/hooks/pretooluse-read.sh +118 -0
- package/hooks/pretooluse-read.ts +118 -0
- package/hooks/pretooluse-task.ts +130 -0
- package/hooks/pretooluse-webfetch.ts +66 -0
- package/hooks/pretooluse-websearch.ts +85 -0
- package/hooks/pretooluse-write.ts +128 -0
- package/hooks/pulse-emit.ts +197 -0
- package/hooks/session-end-consolidate.sh +35 -0
- package/hooks/session-end-consolidate.ts +188 -0
- package/hooks/session-end-stats-gc.ts +80 -0
- package/hooks/session-log-append.sh +94 -0
- package/hooks/session-log-append.ts +116 -0
- package/hooks/session-start.ts +993 -0
- package/hooks/sessionend-hook-health-nudge.ts +451 -0
- package/hooks/sessionend-savings-nudge.ts +318 -0
- package/hooks/sessionend-status-line-nudge.ts +296 -0
- package/hooks/sessionstart-brief.ts +140 -0
- package/hooks/sessionstart-cost-refactor.ts +95 -0
- package/hooks/sessionstart-efficient.ts +110 -0
- package/hooks/sessionstart-genome-author.ts +93 -0
- package/hooks/sessionstart-lean-tools.ts +98 -0
- package/hooks/sessionstart-search.ts +97 -0
- package/hooks/stop-accounting.ts +152 -0
- package/hooks/subagent-stop-rollup.ts +162 -0
- package/hooks/userpromptsubmit-brief-trigger.ts +156 -0
- package/package.json +56 -0
- package/ports/README.md +108 -0
- package/ports/cursor/mcp.json +11 -0
- package/ports/goose/recipe.yaml +26 -0
- package/scripts/ashlr-mcp.ts +40 -0
- package/scripts/auto-update.ts +177 -0
- package/scripts/baseline-scan.ts +831 -0
- package/scripts/bench-orchestrate.ts +377 -0
- package/scripts/benchmark-refs.ts +292 -0
- package/scripts/bootstrap.mjs +100 -0
- package/scripts/brief-eval.ts +234 -0
- package/scripts/bump-version.ts +82 -0
- package/scripts/bun-resolve.d.mts +11 -0
- package/scripts/bun-resolve.mjs +59 -0
- package/scripts/calibrate-grep.ts +467 -0
- package/scripts/capture-grep-workload.ts +260 -0
- package/scripts/check-tier.ts +61 -0
- package/scripts/check-version-sync.ts +97 -0
- package/scripts/cli-orchestrate-status.ts +386 -0
- package/scripts/cli-orchestrate.ts +303 -0
- package/scripts/cli.ts +478 -0
- package/scripts/cloud-smoke-test.ts +313 -0
- package/scripts/coach-report.ts +373 -0
- package/scripts/context-db-migrate.ts +137 -0
- package/scripts/context-status.ts +43 -0
- package/scripts/demo-run.ts +255 -0
- package/scripts/deploy-smoke.sh +140 -0
- package/scripts/doctor.ts +992 -0
- package/scripts/embed-file-worker.ts +104 -0
- package/scripts/embed-tune.ts +308 -0
- package/scripts/errors-report.ts +428 -0
- package/scripts/find-test-leak.ts +69 -0
- package/scripts/generate-badge.ts +357 -0
- package/scripts/genome-auto-consolidate.ts +533 -0
- package/scripts/genome-auto-propose.ts +578 -0
- package/scripts/genome-cloud-pull.ts +363 -0
- package/scripts/genome-cloud-push.ts +382 -0
- package/scripts/genome-cloud-sync.ts +587 -0
- package/scripts/genome-commit-watcher.ts +295 -0
- package/scripts/genome-init.ts +986 -0
- package/scripts/genome-key.ts +233 -0
- package/scripts/genome-keygen.ts +168 -0
- package/scripts/genome-link.ts +59 -0
- package/scripts/genome-refresh-worker.ts +364 -0
- package/scripts/genome-rewrap.ts +90 -0
- package/scripts/genome-synthesizer.ts +679 -0
- package/scripts/genome-team-init.ts +312 -0
- package/scripts/handoff-pack.ts +438 -0
- package/scripts/hook-bootstrap.mjs +75 -0
- package/scripts/hook-timing-reader.ts +371 -0
- package/scripts/hook-timings-report.ts +554 -0
- package/scripts/install-genome-hooks.ts +196 -0
- package/scripts/install-onnx-model.ts +154 -0
- package/scripts/install-permissions.ts +276 -0
- package/scripts/install-status-line.ts +150 -0
- package/scripts/mcp-entrypoint.sh +78 -0
- package/scripts/mcp-entrypoint.ts +130 -0
- package/scripts/mdx-angle-bracket-lint.ts +152 -0
- package/scripts/measure-cold-start.ts +126 -0
- package/scripts/migrate-stats-to-sqlite.ts +86 -0
- package/scripts/ollama-setup.ts +498 -0
- package/scripts/onboarding-wizard.ts +1691 -0
- package/scripts/orchestrate-emit-telemetry.ts +177 -0
- package/scripts/orchestrate-expand.ts +517 -0
- package/scripts/orchestrate-run.ts +744 -0
- package/scripts/print-legend.ts +50 -0
- package/scripts/product-metadata.ts +38 -0
- package/scripts/prune-old-memories.ts +208 -0
- package/scripts/publish.sh +88 -0
- package/scripts/read-calibration.ts +122 -0
- package/scripts/report-crash.ts +226 -0
- package/scripts/run-benchmark.ts +750 -0
- package/scripts/run-root-tests.ts +28 -0
- package/scripts/savings-dashboard.ts +1258 -0
- package/scripts/savings-report-extras.ts +447 -0
- package/scripts/savings-status-line.ts +873 -0
- package/scripts/session-event-emit.ts +266 -0
- package/scripts/session-greet.ts +686 -0
- package/scripts/session-log-report.ts +551 -0
- package/scripts/session-resume.ts +614 -0
- package/scripts/set-hook-mode.ts +83 -0
- package/scripts/smoke-cross-platform.ts +117 -0
- package/scripts/smoke-realtime.ts +257 -0
- package/scripts/smoke-tools.ts +21 -0
- package/scripts/stats-cloud-pull.ts +213 -0
- package/scripts/stats-cloud-sync.ts +261 -0
- package/scripts/telemetry-flush.ts +160 -0
- package/scripts/telemetry-status.ts +266 -0
- package/scripts/timing-budget.ts +35 -0
- package/scripts/ui-animation.ts +120 -0
- package/scripts/ui.ts +431 -0
- package/scripts/upgrade-flow.ts +775 -0
- package/scripts/weekly-digest.ts +394 -0
- package/servers/_accounting.ts +78 -0
- package/servers/_ask-router.ts +84 -0
- package/servers/_ast-chunker.ts +434 -0
- package/servers/_ast-helpers.ts +183 -0
- package/servers/_ast-languages.ts +153 -0
- package/servers/_ast-refactor/_shared.ts +221 -0
- package/servers/_ast-refactor/cross-file-rename.ts +560 -0
- package/servers/_ast-refactor/extract-function.ts +357 -0
- package/servers/_ast-refactor/file-local-rename.ts +172 -0
- package/servers/_ast-refactor.ts +41 -0
- package/servers/_ast-skeleton.ts +107 -0
- package/servers/_bash-summarizers-registry.ts +1096 -0
- package/servers/_crash-dump.ts +210 -0
- package/servers/_cwd-clamp.ts +342 -0
- package/servers/_edit-log.ts +28 -0
- package/servers/_edit-match.ts +236 -0
- package/servers/_edit-validate.ts +196 -0
- package/servers/_embed-calibration.ts +123 -0
- package/servers/_embedding-cache.ts +401 -0
- package/servers/_embedding-model.ts +329 -0
- package/servers/_events.ts +113 -0
- package/servers/_genome-cache.ts +154 -0
- package/servers/_genome-commits.ts +172 -0
- package/servers/_genome-crypto-v2.ts +242 -0
- package/servers/_genome-crypto.ts +259 -0
- package/servers/_genome-discoveries.ts +140 -0
- package/servers/_genome-embed-populator.ts +216 -0
- package/servers/_genome-freshness.ts +134 -0
- package/servers/_genome-issues.ts +171 -0
- package/servers/_genome-live.ts +263 -0
- package/servers/_genome-prs.ts +188 -0
- package/servers/_genome-search.ts +479 -0
- package/servers/_genome-sync.ts +297 -0
- package/servers/_history-tracker.ts +279 -0
- package/servers/_http-helpers.ts +151 -0
- package/servers/_identity-hash.ts +151 -0
- package/servers/_llm-providers/anthropic.ts +132 -0
- package/servers/_llm-providers/cloud.ts +195 -0
- package/servers/_llm-providers/index.ts +350 -0
- package/servers/_llm-providers/local.ts +127 -0
- package/servers/_llm-providers/onnx.ts +393 -0
- package/servers/_llm-providers/types.ts +27 -0
- package/servers/_manifest-v2.ts +447 -0
- package/servers/_mcp-host.ts +93 -0
- package/servers/_nudge-events.ts +451 -0
- package/servers/_orchestrate-executor.ts +316 -0
- package/servers/_prefetch.ts +435 -0
- package/servers/_pricing.ts +256 -0
- package/servers/_pro.ts +381 -0
- package/servers/_read-cache.ts +44 -0
- package/servers/_router-handlers.ts +46 -0
- package/servers/_router.ts +55 -0
- package/servers/_run-with-timeout.ts +173 -0
- package/servers/_savings-render.ts +214 -0
- package/servers/_stats-sqlite.ts +640 -0
- package/servers/_stats.ts +1183 -0
- package/servers/_status-line-cells.ts +469 -0
- package/servers/_streaks.ts +162 -0
- package/servers/_summarize.ts +208 -0
- package/servers/_task-graph-render.ts +217 -0
- package/servers/_task-graph.ts +545 -0
- package/servers/_telemetry.ts +719 -0
- package/servers/_test-parsers.ts +530 -0
- package/servers/_test-watch.ts +626 -0
- package/servers/_text-helpers.ts +37 -0
- package/servers/_token-measure.ts +160 -0
- package/servers/_tool-base.ts +248 -0
- package/servers/_weekly-digest.ts +391 -0
- package/servers/ask-server-handlers.ts +49 -0
- package/servers/ask-server.ts +174 -0
- package/servers/bash-server-handlers.ts +138 -0
- package/servers/bash-server.ts +1136 -0
- package/servers/bench.ts +186 -0
- package/servers/diff-semantic-server-handlers.ts +39 -0
- package/servers/diff-semantic-server.ts +566 -0
- package/servers/diff-server-handlers.ts +317 -0
- package/servers/diff-server.ts +20 -0
- package/servers/edit-server-handlers.ts +31 -0
- package/servers/edit-server.ts +209 -0
- package/servers/edit-structural-server-handlers.ts +322 -0
- package/servers/efficiency-server-handlers.ts +161 -0
- package/servers/efficiency-server.ts +1135 -0
- package/servers/flush-server-handlers.ts +21 -0
- package/servers/flush-server.ts +19 -0
- package/servers/genome-server-handlers.ts +118 -0
- package/servers/genome-server.ts +397 -0
- package/servers/github-server-handlers.ts +187 -0
- package/servers/github-server.ts +856 -0
- package/servers/glob-server-handlers.ts +233 -0
- package/servers/glob-server.ts +20 -0
- package/servers/grep-server-handlers.ts +61 -0
- package/servers/grep-server.ts +564 -0
- package/servers/http-server-handlers.ts +36 -0
- package/servers/http-server.ts +149 -0
- package/servers/logs-server-handlers.ts +42 -0
- package/servers/logs-server.ts +359 -0
- package/servers/ls-server-handlers.ts +166 -0
- package/servers/ls-server.ts +20 -0
- package/servers/multi-edit-server-handlers.ts +51 -0
- package/servers/multi-edit-server.ts +422 -0
- package/servers/notebook-edit-server-handlers.ts +34 -0
- package/servers/notebook-edit-server.ts +181 -0
- package/servers/orient-server-handlers.ts +52 -0
- package/servers/orient-server.ts +436 -0
- package/servers/pipe-server-handlers.ts +68 -0
- package/servers/pipe-server.ts +300 -0
- package/servers/read-server-handlers.ts +42 -0
- package/servers/read-server.ts +206 -0
- package/servers/rename-file-server-handlers.ts +67 -0
- package/servers/rename-file-server.ts +699 -0
- package/servers/savings-server-handlers.ts +27 -0
- package/servers/savings-server.ts +54 -0
- package/servers/search-replace-regex-server-handlers.ts +96 -0
- package/servers/search-replace-regex-server.ts +751 -0
- package/servers/sql-server-handlers.ts +58 -0
- package/servers/sql-server.ts +505 -0
- package/servers/task-server-handlers.ts +358 -0
- package/servers/task-server.ts +24 -0
- package/servers/test-server-handlers.ts +351 -0
- package/servers/test-server.ts +20 -0
- package/servers/tree-server-handlers.ts +503 -0
- package/servers/tree-server.ts +20 -0
- package/servers/webfetch-server-handlers.ts +166 -0
- package/servers/webfetch-server.ts +20 -0
- package/servers/websearch-server-handlers.ts +215 -0
- package/servers/websearch-server.ts +19 -0
- package/servers/write-server-handlers.ts +27 -0
- package/servers/write-server.ts +97 -0
- package/skills/ashlr-brief/SKILL.md +80 -0
- package/skills/ashlr-codex-doctor/SKILL.md +21 -0
- package/skills/ashlr-codex-efficient-tools/SKILL.md +17 -0
- package/skills/ashlr-codex-genome-refresh/SKILL.md +20 -0
- package/skills/ashlr-codex-parallel-explore/SKILL.md +20 -0
- package/skills/ashlr-codex-savings/SKILL.md +17 -0
- package/skills/ashlr-cost-refactor/SKILL.md +50 -0
- package/skills/ashlr-efficient/SKILL.md +64 -0
- package/skills/ashlr-genome-author/SKILL.md +43 -0
- package/skills/ashlr-lean-tools/SKILL.md +43 -0
- package/skills/ashlr-search/SKILL.md +46 -0
|
@@ -0,0 +1,586 @@
|
|
|
1
|
+
# Disable type checking for this module since numba's internals
|
|
2
|
+
# are not typed, and we use numba's internals via its extension API
|
|
3
|
+
# mypy: ignore-errors
|
|
4
|
+
"""
|
|
5
|
+
Utility classes/functions to let numba recognize
|
|
6
|
+
pandas Index/Series/DataFrame
|
|
7
|
+
|
|
8
|
+
Mostly vendored from https://github.com/numba/numba/blob/main/numba/tests/pdlike_usecase.py
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
from contextlib import contextmanager
|
|
14
|
+
import operator
|
|
15
|
+
from typing import Self
|
|
16
|
+
|
|
17
|
+
import numba
|
|
18
|
+
from numba import types
|
|
19
|
+
from numba.core import cgutils
|
|
20
|
+
from numba.core.datamodel import models
|
|
21
|
+
from numba.core.extending import (
|
|
22
|
+
NativeValue,
|
|
23
|
+
box,
|
|
24
|
+
lower_builtin,
|
|
25
|
+
make_attribute_wrapper,
|
|
26
|
+
overload,
|
|
27
|
+
overload_attribute,
|
|
28
|
+
overload_method,
|
|
29
|
+
register_model,
|
|
30
|
+
type_callable,
|
|
31
|
+
typeof_impl,
|
|
32
|
+
unbox,
|
|
33
|
+
)
|
|
34
|
+
from numba.core.imputils import impl_ret_borrowed
|
|
35
|
+
import numpy as np
|
|
36
|
+
|
|
37
|
+
from pandas._libs import lib
|
|
38
|
+
|
|
39
|
+
from pandas.core.indexes.base import Index
|
|
40
|
+
from pandas.core.indexing import _iLocIndexer
|
|
41
|
+
from pandas.core.internals import SingleBlockManager
|
|
42
|
+
from pandas.core.series import Series
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
# Helper function to hack around fact that Index casts numpy string dtype to object
|
|
46
|
+
#
|
|
47
|
+
# Idea is to set an attribute on an Index called _numba_data
|
|
48
|
+
# that is the original data, or the object data casted to numpy string dtype,
|
|
49
|
+
# with a context manager that is unset afterwards
|
|
50
|
+
@contextmanager
|
|
51
|
+
def set_numba_data(index: Index):
|
|
52
|
+
numba_data = index._data
|
|
53
|
+
if numba_data.dtype in (object, "string"):
|
|
54
|
+
numba_data = np.asarray(numba_data)
|
|
55
|
+
if not lib.is_string_array(numba_data):
|
|
56
|
+
raise ValueError(
|
|
57
|
+
"The numba engine only supports using string or numeric column names"
|
|
58
|
+
)
|
|
59
|
+
numba_data = numba_data.astype("U")
|
|
60
|
+
try:
|
|
61
|
+
index._numba_data = numba_data
|
|
62
|
+
yield index
|
|
63
|
+
finally:
|
|
64
|
+
del index._numba_data
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
# TODO: Range index support
|
|
68
|
+
# (this currently lowers OK, but does not round-trip)
|
|
69
|
+
class IndexType(types.Type):
|
|
70
|
+
"""
|
|
71
|
+
The type class for Index objects.
|
|
72
|
+
"""
|
|
73
|
+
|
|
74
|
+
def __init__(self, dtype, layout, pyclass: any) -> None:
|
|
75
|
+
self.pyclass = pyclass
|
|
76
|
+
name = f"index({dtype}, {layout})"
|
|
77
|
+
self.dtype = dtype
|
|
78
|
+
self.layout = layout
|
|
79
|
+
super().__init__(name)
|
|
80
|
+
|
|
81
|
+
@property
|
|
82
|
+
def key(self):
|
|
83
|
+
return self.pyclass, self.dtype, self.layout
|
|
84
|
+
|
|
85
|
+
@property
|
|
86
|
+
def as_array(self):
|
|
87
|
+
return types.Array(self.dtype, 1, self.layout)
|
|
88
|
+
|
|
89
|
+
def copy(self, dtype=None, ndim: int = 1, layout=None) -> Self:
|
|
90
|
+
assert ndim == 1
|
|
91
|
+
if dtype is None:
|
|
92
|
+
dtype = self.dtype
|
|
93
|
+
layout = layout or self.layout
|
|
94
|
+
return type(self)(dtype, layout, self.pyclass)
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
class SeriesType(types.Type):
|
|
98
|
+
"""
|
|
99
|
+
The type class for Series objects.
|
|
100
|
+
"""
|
|
101
|
+
|
|
102
|
+
def __init__(self, dtype, index, namety) -> None:
|
|
103
|
+
assert isinstance(index, IndexType)
|
|
104
|
+
self.dtype = dtype
|
|
105
|
+
self.index = index
|
|
106
|
+
self.values = types.Array(self.dtype, 1, "C")
|
|
107
|
+
self.namety = namety
|
|
108
|
+
name = f"series({dtype}, {index}, {namety})"
|
|
109
|
+
super().__init__(name)
|
|
110
|
+
|
|
111
|
+
@property
|
|
112
|
+
def key(self):
|
|
113
|
+
return self.dtype, self.index, self.namety
|
|
114
|
+
|
|
115
|
+
@property
|
|
116
|
+
def as_array(self):
|
|
117
|
+
return self.values
|
|
118
|
+
|
|
119
|
+
def copy(self, dtype=None, ndim: int = 1, layout: str = "C") -> Self:
|
|
120
|
+
assert ndim == 1
|
|
121
|
+
assert layout == "C"
|
|
122
|
+
if dtype is None:
|
|
123
|
+
dtype = self.dtype
|
|
124
|
+
return type(self)(dtype, self.index, self.namety)
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
@typeof_impl.register(Index)
|
|
128
|
+
def typeof_index(val, c) -> IndexType:
|
|
129
|
+
"""
|
|
130
|
+
This will assume that only strings are in object dtype
|
|
131
|
+
index.
|
|
132
|
+
(you should check this before this gets lowered down to numba)
|
|
133
|
+
"""
|
|
134
|
+
# arrty = typeof_impl(val._data, c)
|
|
135
|
+
arrty = typeof_impl(val._numba_data, c)
|
|
136
|
+
assert arrty.ndim == 1
|
|
137
|
+
return IndexType(arrty.dtype, arrty.layout, type(val))
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
@typeof_impl.register(Series)
|
|
141
|
+
def typeof_series(val, c) -> SeriesType:
|
|
142
|
+
index = typeof_impl(val.index, c)
|
|
143
|
+
arrty = typeof_impl(val.values, c)
|
|
144
|
+
namety = typeof_impl(val.name, c)
|
|
145
|
+
assert arrty.ndim == 1
|
|
146
|
+
assert arrty.layout == "C"
|
|
147
|
+
return SeriesType(arrty.dtype, index, namety)
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
@type_callable(Series)
|
|
151
|
+
def type_series_constructor(context):
|
|
152
|
+
def typer(data, index, name=None):
|
|
153
|
+
if isinstance(index, IndexType) and isinstance(data, types.Array):
|
|
154
|
+
assert data.ndim == 1
|
|
155
|
+
if name is None:
|
|
156
|
+
name = types.intp
|
|
157
|
+
return SeriesType(data.dtype, index, name)
|
|
158
|
+
|
|
159
|
+
return typer
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
@type_callable(Index)
|
|
163
|
+
def type_index_constructor(context):
|
|
164
|
+
def typer(data, hashmap=None):
|
|
165
|
+
if isinstance(data, types.Array):
|
|
166
|
+
assert data.layout == "C"
|
|
167
|
+
assert data.ndim == 1
|
|
168
|
+
assert hashmap is None or isinstance(hashmap, types.DictType)
|
|
169
|
+
return IndexType(data.dtype, layout=data.layout, pyclass=Index)
|
|
170
|
+
|
|
171
|
+
return typer
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
# Backend extensions for Index and Series and Frame
|
|
175
|
+
@register_model(IndexType)
|
|
176
|
+
class IndexModel(models.StructModel):
|
|
177
|
+
def __init__(self, dmm, fe_type) -> None:
|
|
178
|
+
# We don't want the numpy string scalar type in our hashmap
|
|
179
|
+
members = [
|
|
180
|
+
("data", fe_type.as_array),
|
|
181
|
+
# This is an attempt to emulate our hashtable code with a numba
|
|
182
|
+
# typed dict
|
|
183
|
+
# It maps from values in the index to their integer positions in the array
|
|
184
|
+
("hashmap", types.DictType(fe_type.dtype, types.intp)),
|
|
185
|
+
# Pointer to the Index object this was created from, or that it
|
|
186
|
+
# boxes to
|
|
187
|
+
# https://numba.discourse.group/t/qst-how-to-cache-the-boxing-of-an-object/2128/2?u=lithomas1
|
|
188
|
+
("parent", types.pyobject),
|
|
189
|
+
]
|
|
190
|
+
models.StructModel.__init__(self, dmm, fe_type, members)
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
@register_model(SeriesType)
|
|
194
|
+
class SeriesModel(models.StructModel):
|
|
195
|
+
def __init__(self, dmm, fe_type) -> None:
|
|
196
|
+
members = [
|
|
197
|
+
("index", fe_type.index),
|
|
198
|
+
("values", fe_type.as_array),
|
|
199
|
+
("name", fe_type.namety),
|
|
200
|
+
]
|
|
201
|
+
models.StructModel.__init__(self, dmm, fe_type, members)
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
make_attribute_wrapper(IndexType, "data", "_data")
|
|
205
|
+
make_attribute_wrapper(IndexType, "hashmap", "hashmap")
|
|
206
|
+
|
|
207
|
+
make_attribute_wrapper(SeriesType, "index", "index")
|
|
208
|
+
make_attribute_wrapper(SeriesType, "values", "values")
|
|
209
|
+
make_attribute_wrapper(SeriesType, "name", "name")
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
@lower_builtin(Series, types.Array, IndexType)
|
|
213
|
+
def pdseries_constructor(context, builder, sig, args):
|
|
214
|
+
data, index = args
|
|
215
|
+
series = cgutils.create_struct_proxy(sig.return_type)(context, builder)
|
|
216
|
+
series.index = index
|
|
217
|
+
series.values = data
|
|
218
|
+
series.name = context.get_constant(types.intp, 0)
|
|
219
|
+
return impl_ret_borrowed(context, builder, sig.return_type, series._getvalue())
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
@lower_builtin(Series, types.Array, IndexType, types.intp)
|
|
223
|
+
@lower_builtin(Series, types.Array, IndexType, types.float64)
|
|
224
|
+
@lower_builtin(Series, types.Array, IndexType, types.unicode_type)
|
|
225
|
+
def pdseries_constructor_with_name(context, builder, sig, args):
|
|
226
|
+
data, index, name = args
|
|
227
|
+
series = cgutils.create_struct_proxy(sig.return_type)(context, builder)
|
|
228
|
+
series.index = index
|
|
229
|
+
series.values = data
|
|
230
|
+
series.name = name
|
|
231
|
+
return impl_ret_borrowed(context, builder, sig.return_type, series._getvalue())
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
@lower_builtin(Index, types.Array, types.DictType, types.pyobject)
|
|
235
|
+
def index_constructor_2arg(context, builder, sig, args):
|
|
236
|
+
(data, hashmap, parent) = args
|
|
237
|
+
index = cgutils.create_struct_proxy(sig.return_type)(context, builder)
|
|
238
|
+
|
|
239
|
+
index.data = data
|
|
240
|
+
index.hashmap = hashmap
|
|
241
|
+
index.parent = parent
|
|
242
|
+
return impl_ret_borrowed(context, builder, sig.return_type, index._getvalue())
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
@lower_builtin(Index, types.Array, types.DictType)
|
|
246
|
+
def index_constructor_2arg_parent(context, builder, sig, args):
|
|
247
|
+
# Basically same as index_constructor_1arg, but also lets you specify the
|
|
248
|
+
# parent object
|
|
249
|
+
(data, hashmap) = args
|
|
250
|
+
index = cgutils.create_struct_proxy(sig.return_type)(context, builder)
|
|
251
|
+
|
|
252
|
+
index.data = data
|
|
253
|
+
index.hashmap = hashmap
|
|
254
|
+
return impl_ret_borrowed(context, builder, sig.return_type, index._getvalue())
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
@lower_builtin(Index, types.Array)
|
|
258
|
+
def index_constructor_1arg(context, builder, sig, args):
|
|
259
|
+
from numba.typed import Dict
|
|
260
|
+
|
|
261
|
+
key_type = sig.return_type.dtype
|
|
262
|
+
value_type = types.intp
|
|
263
|
+
|
|
264
|
+
def index_impl(data):
|
|
265
|
+
return Index(data, Dict.empty(key_type, value_type))
|
|
266
|
+
|
|
267
|
+
return context.compile_internal(builder, index_impl, sig, args)
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
# Helper to convert the unicodecharseq (numpy string scalar) into a unicode_type
|
|
271
|
+
# (regular string)
|
|
272
|
+
def maybe_cast_str(x):
|
|
273
|
+
# Dummy function that numba can overload
|
|
274
|
+
pass
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
@overload(maybe_cast_str)
|
|
278
|
+
def maybe_cast_str_impl(x):
|
|
279
|
+
"""Converts numba UnicodeCharSeq (numpy string scalar) -> unicode type (string).
|
|
280
|
+
Is a no-op for other types."""
|
|
281
|
+
if isinstance(x, types.UnicodeCharSeq):
|
|
282
|
+
return lambda x: str(x)
|
|
283
|
+
else:
|
|
284
|
+
return lambda x: x
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
@unbox(IndexType)
|
|
288
|
+
def unbox_index(typ, obj, c):
|
|
289
|
+
"""
|
|
290
|
+
Convert an Index object to a native structure.
|
|
291
|
+
|
|
292
|
+
Note: Object dtype is not allowed here
|
|
293
|
+
"""
|
|
294
|
+
data_obj = c.pyapi.object_getattr_string(obj, "_numba_data")
|
|
295
|
+
index = cgutils.create_struct_proxy(typ)(c.context, c.builder)
|
|
296
|
+
# If we see an object array, assume its been validated as only containing strings
|
|
297
|
+
# We still need to do the conversion though
|
|
298
|
+
index.data = c.unbox(typ.as_array, data_obj).value
|
|
299
|
+
typed_dict_obj = c.pyapi.unserialize(c.pyapi.serialize_object(numba.typed.Dict))
|
|
300
|
+
# Create an empty typed dict in numba for the hashmap for indexing
|
|
301
|
+
# equiv of numba.typed.Dict.empty(typ.dtype, types.intp)
|
|
302
|
+
arr_type_obj = c.pyapi.unserialize(c.pyapi.serialize_object(typ.dtype))
|
|
303
|
+
intp_type_obj = c.pyapi.unserialize(c.pyapi.serialize_object(types.intp))
|
|
304
|
+
hashmap_obj = c.pyapi.call_method(
|
|
305
|
+
typed_dict_obj, "empty", (arr_type_obj, intp_type_obj)
|
|
306
|
+
)
|
|
307
|
+
index.hashmap = c.unbox(types.DictType(typ.dtype, types.intp), hashmap_obj).value
|
|
308
|
+
# Set the parent for speedy boxing.
|
|
309
|
+
index.parent = obj
|
|
310
|
+
|
|
311
|
+
# Decrefs
|
|
312
|
+
c.pyapi.decref(data_obj)
|
|
313
|
+
c.pyapi.decref(arr_type_obj)
|
|
314
|
+
c.pyapi.decref(intp_type_obj)
|
|
315
|
+
c.pyapi.decref(typed_dict_obj)
|
|
316
|
+
|
|
317
|
+
return NativeValue(index._getvalue())
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
@unbox(SeriesType)
|
|
321
|
+
def unbox_series(typ, obj, c):
|
|
322
|
+
"""
|
|
323
|
+
Convert a Series object to a native structure.
|
|
324
|
+
"""
|
|
325
|
+
index_obj = c.pyapi.object_getattr_string(obj, "index")
|
|
326
|
+
values_obj = c.pyapi.object_getattr_string(obj, "values")
|
|
327
|
+
name_obj = c.pyapi.object_getattr_string(obj, "name")
|
|
328
|
+
|
|
329
|
+
series = cgutils.create_struct_proxy(typ)(c.context, c.builder)
|
|
330
|
+
series.index = c.unbox(typ.index, index_obj).value
|
|
331
|
+
series.values = c.unbox(typ.values, values_obj).value
|
|
332
|
+
series.name = c.unbox(typ.namety, name_obj).value
|
|
333
|
+
|
|
334
|
+
# Decrefs
|
|
335
|
+
c.pyapi.decref(index_obj)
|
|
336
|
+
c.pyapi.decref(values_obj)
|
|
337
|
+
c.pyapi.decref(name_obj)
|
|
338
|
+
|
|
339
|
+
return NativeValue(series._getvalue())
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
@box(IndexType)
|
|
343
|
+
def box_index(typ, val, c):
|
|
344
|
+
"""
|
|
345
|
+
Convert a native index structure to an Index object.
|
|
346
|
+
|
|
347
|
+
If our native index is of a numpy string dtype, we'll cast it to
|
|
348
|
+
object.
|
|
349
|
+
"""
|
|
350
|
+
# First build a Numpy array object, then wrap it in an Index
|
|
351
|
+
index = cgutils.create_struct_proxy(typ)(c.context, c.builder, value=val)
|
|
352
|
+
|
|
353
|
+
res = cgutils.alloca_once_value(c.builder, index.parent)
|
|
354
|
+
|
|
355
|
+
# Does parent exist?
|
|
356
|
+
# (it means already boxed once, or Index same as original df.index or df.columns)
|
|
357
|
+
# xref https://github.com/numba/numba/blob/596e8a55334cc46854e3192766e643767bd7c934/numba/core/boxing.py#L593C17-L593C17
|
|
358
|
+
with c.builder.if_else(cgutils.is_not_null(c.builder, index.parent)) as (
|
|
359
|
+
has_parent,
|
|
360
|
+
otherwise,
|
|
361
|
+
):
|
|
362
|
+
with has_parent:
|
|
363
|
+
c.pyapi.incref(index.parent)
|
|
364
|
+
with otherwise:
|
|
365
|
+
# TODO: preserve the original class for the index
|
|
366
|
+
# Also need preserve the name of the Index
|
|
367
|
+
# class_obj = c.pyapi.unserialize(c.pyapi.serialize_object(typ.pyclass))
|
|
368
|
+
class_obj = c.pyapi.unserialize(c.pyapi.serialize_object(Index))
|
|
369
|
+
array_obj = c.box(typ.as_array, index.data)
|
|
370
|
+
if isinstance(typ.dtype, types.UnicodeCharSeq):
|
|
371
|
+
# We converted to numpy string dtype, convert back
|
|
372
|
+
# to object since _simple_new won't do that for uss
|
|
373
|
+
object_str_obj = c.pyapi.unserialize(c.pyapi.serialize_object("object"))
|
|
374
|
+
array_obj = c.pyapi.call_method(array_obj, "astype", (object_str_obj,))
|
|
375
|
+
c.pyapi.decref(object_str_obj)
|
|
376
|
+
# this is basically Index._simple_new(array_obj, name_obj) in python
|
|
377
|
+
index_obj = c.pyapi.call_method(class_obj, "_simple_new", (array_obj,))
|
|
378
|
+
index.parent = index_obj
|
|
379
|
+
c.builder.store(index_obj, res)
|
|
380
|
+
|
|
381
|
+
# Decrefs
|
|
382
|
+
c.pyapi.decref(class_obj)
|
|
383
|
+
c.pyapi.decref(array_obj)
|
|
384
|
+
return c.builder.load(res)
|
|
385
|
+
|
|
386
|
+
|
|
387
|
+
@box(SeriesType)
|
|
388
|
+
def box_series(typ, val, c):
|
|
389
|
+
"""
|
|
390
|
+
Convert a native series structure to a Series object.
|
|
391
|
+
"""
|
|
392
|
+
series = cgutils.create_struct_proxy(typ)(c.context, c.builder, value=val)
|
|
393
|
+
series_const_obj = c.pyapi.unserialize(c.pyapi.serialize_object(Series._from_mgr))
|
|
394
|
+
mgr_const_obj = c.pyapi.unserialize(
|
|
395
|
+
c.pyapi.serialize_object(SingleBlockManager.from_array)
|
|
396
|
+
)
|
|
397
|
+
index_obj = c.box(typ.index, series.index)
|
|
398
|
+
array_obj = c.box(typ.as_array, series.values)
|
|
399
|
+
name_obj = c.box(typ.namety, series.name)
|
|
400
|
+
# This is basically equivalent of
|
|
401
|
+
# pd.Series(data=array_obj, index=index_obj)
|
|
402
|
+
# To improve perf, we will construct the Series from a manager
|
|
403
|
+
# object to avoid checks.
|
|
404
|
+
# We'll also set the name attribute manually to avoid validation
|
|
405
|
+
mgr_obj = c.pyapi.call_function_objargs(
|
|
406
|
+
mgr_const_obj,
|
|
407
|
+
(
|
|
408
|
+
array_obj,
|
|
409
|
+
index_obj,
|
|
410
|
+
),
|
|
411
|
+
)
|
|
412
|
+
mgr_axes_obj = c.pyapi.object_getattr_string(mgr_obj, "axes")
|
|
413
|
+
# Series._constructor_from_mgr(mgr, axes)
|
|
414
|
+
series_obj = c.pyapi.call_function_objargs(
|
|
415
|
+
series_const_obj, (mgr_obj, mgr_axes_obj)
|
|
416
|
+
)
|
|
417
|
+
c.pyapi.object_setattr_string(series_obj, "_name", name_obj)
|
|
418
|
+
|
|
419
|
+
# Decrefs
|
|
420
|
+
c.pyapi.decref(series_const_obj)
|
|
421
|
+
c.pyapi.decref(mgr_axes_obj)
|
|
422
|
+
c.pyapi.decref(mgr_obj)
|
|
423
|
+
c.pyapi.decref(mgr_const_obj)
|
|
424
|
+
c.pyapi.decref(index_obj)
|
|
425
|
+
c.pyapi.decref(array_obj)
|
|
426
|
+
c.pyapi.decref(name_obj)
|
|
427
|
+
|
|
428
|
+
return series_obj
|
|
429
|
+
|
|
430
|
+
|
|
431
|
+
# Add common series reductions (e.g. mean, sum),
|
|
432
|
+
# and also add common binops (e.g. add, sub, mul, div)
|
|
433
|
+
def generate_series_reduction(ser_reduction, ser_method):
|
|
434
|
+
@overload_method(SeriesType, ser_reduction)
|
|
435
|
+
def series_reduction(series):
|
|
436
|
+
def series_reduction_impl(series):
|
|
437
|
+
return ser_method(series.values)
|
|
438
|
+
|
|
439
|
+
return series_reduction_impl
|
|
440
|
+
|
|
441
|
+
return series_reduction
|
|
442
|
+
|
|
443
|
+
|
|
444
|
+
def generate_series_binop(binop):
|
|
445
|
+
@overload(binop)
|
|
446
|
+
def series_binop(series1, value):
|
|
447
|
+
if isinstance(series1, SeriesType):
|
|
448
|
+
if isinstance(value, SeriesType):
|
|
449
|
+
|
|
450
|
+
def series_binop_impl(series1, series2):
|
|
451
|
+
# TODO: Check index matching?
|
|
452
|
+
return Series(
|
|
453
|
+
binop(series1.values, series2.values),
|
|
454
|
+
series1.index,
|
|
455
|
+
series1.name,
|
|
456
|
+
)
|
|
457
|
+
|
|
458
|
+
return series_binop_impl
|
|
459
|
+
else:
|
|
460
|
+
|
|
461
|
+
def series_binop_impl(series1, value):
|
|
462
|
+
return Series(
|
|
463
|
+
binop(series1.values, value), series1.index, series1.name
|
|
464
|
+
)
|
|
465
|
+
|
|
466
|
+
return series_binop_impl
|
|
467
|
+
|
|
468
|
+
return series_binop
|
|
469
|
+
|
|
470
|
+
|
|
471
|
+
series_reductions = [
|
|
472
|
+
("sum", np.sum),
|
|
473
|
+
("mean", np.mean),
|
|
474
|
+
# Disabled due to discrepancies between numba std. dev
|
|
475
|
+
# and pandas std. dev (no way to specify dof)
|
|
476
|
+
# ("std", np.std),
|
|
477
|
+
# ("var", np.var),
|
|
478
|
+
("min", np.min),
|
|
479
|
+
("max", np.max),
|
|
480
|
+
]
|
|
481
|
+
for reduction, reduction_method in series_reductions:
|
|
482
|
+
generate_series_reduction(reduction, reduction_method)
|
|
483
|
+
|
|
484
|
+
series_binops = [operator.add, operator.sub, operator.mul, operator.truediv]
|
|
485
|
+
|
|
486
|
+
for ser_binop in series_binops:
|
|
487
|
+
generate_series_binop(ser_binop)
|
|
488
|
+
|
|
489
|
+
|
|
490
|
+
# get_loc on Index
|
|
491
|
+
@overload_method(IndexType, "get_loc")
|
|
492
|
+
def index_get_loc(index, item):
|
|
493
|
+
def index_get_loc_impl(index, item):
|
|
494
|
+
# Initialize the hash table if not initialized
|
|
495
|
+
if len(index.hashmap) == 0:
|
|
496
|
+
for i, val in enumerate(index._data):
|
|
497
|
+
index.hashmap[val] = i
|
|
498
|
+
return index.hashmap[item]
|
|
499
|
+
|
|
500
|
+
return index_get_loc_impl
|
|
501
|
+
|
|
502
|
+
|
|
503
|
+
# Indexing for Series/Index
|
|
504
|
+
@overload(operator.getitem)
|
|
505
|
+
def series_indexing(series, item):
|
|
506
|
+
if isinstance(series, SeriesType):
|
|
507
|
+
|
|
508
|
+
def series_getitem(series, item):
|
|
509
|
+
loc = series.index.get_loc(item)
|
|
510
|
+
return series.iloc[loc]
|
|
511
|
+
|
|
512
|
+
return series_getitem
|
|
513
|
+
|
|
514
|
+
|
|
515
|
+
@overload(operator.getitem)
|
|
516
|
+
def index_indexing(index, idx):
|
|
517
|
+
if isinstance(index, IndexType):
|
|
518
|
+
|
|
519
|
+
def index_getitem(index, idx):
|
|
520
|
+
return index._data[idx]
|
|
521
|
+
|
|
522
|
+
return index_getitem
|
|
523
|
+
|
|
524
|
+
|
|
525
|
+
class IlocType(types.Type):
|
|
526
|
+
def __init__(self, obj_type) -> None:
|
|
527
|
+
self.obj_type = obj_type
|
|
528
|
+
name = f"iLocIndexer({obj_type})"
|
|
529
|
+
super().__init__(name=name)
|
|
530
|
+
|
|
531
|
+
@property
|
|
532
|
+
def key(self):
|
|
533
|
+
return self.obj_type
|
|
534
|
+
|
|
535
|
+
|
|
536
|
+
@typeof_impl.register(_iLocIndexer)
|
|
537
|
+
def typeof_iloc(val, c) -> IlocType:
|
|
538
|
+
objtype = typeof_impl(val.obj, c)
|
|
539
|
+
return IlocType(objtype)
|
|
540
|
+
|
|
541
|
+
|
|
542
|
+
@type_callable(_iLocIndexer)
|
|
543
|
+
def type_iloc_constructor(context):
|
|
544
|
+
def typer(obj):
|
|
545
|
+
if isinstance(obj, SeriesType):
|
|
546
|
+
return IlocType(obj)
|
|
547
|
+
|
|
548
|
+
return typer
|
|
549
|
+
|
|
550
|
+
|
|
551
|
+
@lower_builtin(_iLocIndexer, SeriesType)
|
|
552
|
+
def iloc_constructor(context, builder, sig, args):
|
|
553
|
+
(obj,) = args
|
|
554
|
+
iloc_indexer = cgutils.create_struct_proxy(sig.return_type)(context, builder)
|
|
555
|
+
iloc_indexer.obj = obj
|
|
556
|
+
return impl_ret_borrowed(
|
|
557
|
+
context, builder, sig.return_type, iloc_indexer._getvalue()
|
|
558
|
+
)
|
|
559
|
+
|
|
560
|
+
|
|
561
|
+
@register_model(IlocType)
|
|
562
|
+
class ILocModel(models.StructModel):
|
|
563
|
+
def __init__(self, dmm, fe_type) -> None:
|
|
564
|
+
members = [("obj", fe_type.obj_type)]
|
|
565
|
+
models.StructModel.__init__(self, dmm, fe_type, members)
|
|
566
|
+
|
|
567
|
+
|
|
568
|
+
make_attribute_wrapper(IlocType, "obj", "obj")
|
|
569
|
+
|
|
570
|
+
|
|
571
|
+
@overload_attribute(SeriesType, "iloc")
|
|
572
|
+
def series_iloc(series):
|
|
573
|
+
def get(series):
|
|
574
|
+
return _iLocIndexer(series)
|
|
575
|
+
|
|
576
|
+
return get
|
|
577
|
+
|
|
578
|
+
|
|
579
|
+
@overload(operator.getitem)
|
|
580
|
+
def iloc_getitem(iloc_indexer, i):
|
|
581
|
+
if isinstance(iloc_indexer, IlocType):
|
|
582
|
+
|
|
583
|
+
def getitem_impl(iloc_indexer, i):
|
|
584
|
+
return iloc_indexer.obj.values[i]
|
|
585
|
+
|
|
586
|
+
return getitem_impl
|