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,534 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Methods that can be shared by many array-like classes or subclasses:
|
|
3
|
+
Series
|
|
4
|
+
Index
|
|
5
|
+
ExtensionArray
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import operator
|
|
11
|
+
from typing import Any
|
|
12
|
+
|
|
13
|
+
import numpy as np
|
|
14
|
+
|
|
15
|
+
from pandas._libs import lib
|
|
16
|
+
from pandas._libs.ops_dispatch import maybe_dispatch_ufunc_to_dunder_op
|
|
17
|
+
|
|
18
|
+
from pandas.core.dtypes.cast import maybe_unbox_numpy_scalar
|
|
19
|
+
from pandas.core.dtypes.generic import ABCNDFrame
|
|
20
|
+
|
|
21
|
+
from pandas.core import roperator
|
|
22
|
+
from pandas.core.construction import extract_array
|
|
23
|
+
from pandas.core.ops.common import unpack_zerodim_and_defer
|
|
24
|
+
|
|
25
|
+
REDUCTION_ALIASES = {
|
|
26
|
+
"maximum": "max",
|
|
27
|
+
"minimum": "min",
|
|
28
|
+
"add": "sum",
|
|
29
|
+
"multiply": "prod",
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class OpsMixin:
|
|
34
|
+
# -------------------------------------------------------------
|
|
35
|
+
# Comparisons
|
|
36
|
+
|
|
37
|
+
def _cmp_method(self, other, op):
|
|
38
|
+
return NotImplemented
|
|
39
|
+
|
|
40
|
+
@unpack_zerodim_and_defer("__eq__")
|
|
41
|
+
def __eq__(self, other):
|
|
42
|
+
return self._cmp_method(other, operator.eq)
|
|
43
|
+
|
|
44
|
+
@unpack_zerodim_and_defer("__ne__")
|
|
45
|
+
def __ne__(self, other):
|
|
46
|
+
return self._cmp_method(other, operator.ne)
|
|
47
|
+
|
|
48
|
+
@unpack_zerodim_and_defer("__lt__")
|
|
49
|
+
def __lt__(self, other):
|
|
50
|
+
return self._cmp_method(other, operator.lt)
|
|
51
|
+
|
|
52
|
+
@unpack_zerodim_and_defer("__le__")
|
|
53
|
+
def __le__(self, other):
|
|
54
|
+
return self._cmp_method(other, operator.le)
|
|
55
|
+
|
|
56
|
+
@unpack_zerodim_and_defer("__gt__")
|
|
57
|
+
def __gt__(self, other):
|
|
58
|
+
return self._cmp_method(other, operator.gt)
|
|
59
|
+
|
|
60
|
+
@unpack_zerodim_and_defer("__ge__")
|
|
61
|
+
def __ge__(self, other):
|
|
62
|
+
return self._cmp_method(other, operator.ge)
|
|
63
|
+
|
|
64
|
+
# -------------------------------------------------------------
|
|
65
|
+
# Logical Methods
|
|
66
|
+
|
|
67
|
+
def _logical_method(self, other, op):
|
|
68
|
+
return NotImplemented
|
|
69
|
+
|
|
70
|
+
@unpack_zerodim_and_defer("__and__")
|
|
71
|
+
def __and__(self, other):
|
|
72
|
+
return self._logical_method(other, operator.and_)
|
|
73
|
+
|
|
74
|
+
@unpack_zerodim_and_defer("__rand__")
|
|
75
|
+
def __rand__(self, other):
|
|
76
|
+
return self._logical_method(other, roperator.rand_)
|
|
77
|
+
|
|
78
|
+
@unpack_zerodim_and_defer("__or__")
|
|
79
|
+
def __or__(self, other):
|
|
80
|
+
return self._logical_method(other, operator.or_)
|
|
81
|
+
|
|
82
|
+
@unpack_zerodim_and_defer("__ror__")
|
|
83
|
+
def __ror__(self, other):
|
|
84
|
+
return self._logical_method(other, roperator.ror_)
|
|
85
|
+
|
|
86
|
+
@unpack_zerodim_and_defer("__xor__")
|
|
87
|
+
def __xor__(self, other):
|
|
88
|
+
return self._logical_method(other, operator.xor)
|
|
89
|
+
|
|
90
|
+
@unpack_zerodim_and_defer("__rxor__")
|
|
91
|
+
def __rxor__(self, other):
|
|
92
|
+
return self._logical_method(other, roperator.rxor)
|
|
93
|
+
|
|
94
|
+
# -------------------------------------------------------------
|
|
95
|
+
# Arithmetic Methods
|
|
96
|
+
|
|
97
|
+
def _arith_method(self, other, op):
|
|
98
|
+
return NotImplemented
|
|
99
|
+
|
|
100
|
+
@unpack_zerodim_and_defer("__add__")
|
|
101
|
+
def __add__(self, other):
|
|
102
|
+
"""
|
|
103
|
+
Get Addition of DataFrame and other, column-wise.
|
|
104
|
+
|
|
105
|
+
Equivalent to ``DataFrame.add(other)``.
|
|
106
|
+
|
|
107
|
+
Parameters
|
|
108
|
+
----------
|
|
109
|
+
other : scalar, sequence, Series, dict or DataFrame
|
|
110
|
+
Object to be added to the DataFrame.
|
|
111
|
+
|
|
112
|
+
Returns
|
|
113
|
+
-------
|
|
114
|
+
DataFrame
|
|
115
|
+
The result of adding ``other`` to DataFrame.
|
|
116
|
+
|
|
117
|
+
See Also
|
|
118
|
+
--------
|
|
119
|
+
DataFrame.add : Add a DataFrame and another object, with option for index-
|
|
120
|
+
or column-oriented addition.
|
|
121
|
+
|
|
122
|
+
Examples
|
|
123
|
+
--------
|
|
124
|
+
>>> df = pd.DataFrame(
|
|
125
|
+
... {"height": [1.5, 2.6], "weight": [500, 800]}, index=["elk", "moose"]
|
|
126
|
+
... )
|
|
127
|
+
>>> df
|
|
128
|
+
height weight
|
|
129
|
+
elk 1.5 500
|
|
130
|
+
moose 2.6 800
|
|
131
|
+
|
|
132
|
+
Adding a scalar affects all rows and columns.
|
|
133
|
+
|
|
134
|
+
>>> df[["height", "weight"]] + 1.5
|
|
135
|
+
height weight
|
|
136
|
+
elk 3.0 501.5
|
|
137
|
+
moose 4.1 801.5
|
|
138
|
+
|
|
139
|
+
Each element of a list is added to a column of the DataFrame, in order.
|
|
140
|
+
|
|
141
|
+
>>> df[["height", "weight"]] + [0.5, 1.5]
|
|
142
|
+
height weight
|
|
143
|
+
elk 2.0 501.5
|
|
144
|
+
moose 3.1 801.5
|
|
145
|
+
|
|
146
|
+
Keys of a dictionary are aligned to the DataFrame, based on column names;
|
|
147
|
+
each value in the dictionary is added to the corresponding column.
|
|
148
|
+
|
|
149
|
+
>>> df[["height", "weight"]] + {"height": 0.5, "weight": 1.5}
|
|
150
|
+
height weight
|
|
151
|
+
elk 2.0 501.5
|
|
152
|
+
moose 3.1 801.5
|
|
153
|
+
|
|
154
|
+
When `other` is a :class:`Series`, the index of `other` is aligned with the
|
|
155
|
+
columns of the DataFrame.
|
|
156
|
+
|
|
157
|
+
>>> s1 = pd.Series([0.5, 1.5], index=["weight", "height"])
|
|
158
|
+
>>> df[["height", "weight"]] + s1
|
|
159
|
+
height weight
|
|
160
|
+
elk 3.0 500.5
|
|
161
|
+
moose 4.1 800.5
|
|
162
|
+
|
|
163
|
+
Even when the index of `other` is the same as the index of the DataFrame,
|
|
164
|
+
the :class:`Series` will not be reoriented. If index-wise alignment is desired,
|
|
165
|
+
:meth:`DataFrame.add` should be used with `axis='index'`.
|
|
166
|
+
|
|
167
|
+
>>> s2 = pd.Series([0.5, 1.5], index=["elk", "moose"])
|
|
168
|
+
>>> df[["height", "weight"]] + s2
|
|
169
|
+
elk height moose weight
|
|
170
|
+
elk NaN NaN NaN NaN
|
|
171
|
+
moose NaN NaN NaN NaN
|
|
172
|
+
|
|
173
|
+
>>> df[["height", "weight"]].add(s2, axis="index")
|
|
174
|
+
height weight
|
|
175
|
+
elk 2.0 500.5
|
|
176
|
+
moose 4.1 801.5
|
|
177
|
+
|
|
178
|
+
When `other` is a :class:`DataFrame`, both columns names and the
|
|
179
|
+
index are aligned.
|
|
180
|
+
|
|
181
|
+
>>> other = pd.DataFrame(
|
|
182
|
+
... {"height": [0.2, 0.4, 0.6]}, index=["elk", "moose", "deer"]
|
|
183
|
+
... )
|
|
184
|
+
>>> df[["height", "weight"]] + other
|
|
185
|
+
height weight
|
|
186
|
+
deer NaN NaN
|
|
187
|
+
elk 1.7 NaN
|
|
188
|
+
moose 3.0 NaN
|
|
189
|
+
"""
|
|
190
|
+
return self._arith_method(other, operator.add)
|
|
191
|
+
|
|
192
|
+
@unpack_zerodim_and_defer("__radd__")
|
|
193
|
+
def __radd__(self, other):
|
|
194
|
+
return self._arith_method(other, roperator.radd)
|
|
195
|
+
|
|
196
|
+
@unpack_zerodim_and_defer("__sub__")
|
|
197
|
+
def __sub__(self, other):
|
|
198
|
+
return self._arith_method(other, operator.sub)
|
|
199
|
+
|
|
200
|
+
@unpack_zerodim_and_defer("__rsub__")
|
|
201
|
+
def __rsub__(self, other):
|
|
202
|
+
return self._arith_method(other, roperator.rsub)
|
|
203
|
+
|
|
204
|
+
@unpack_zerodim_and_defer("__mul__")
|
|
205
|
+
def __mul__(self, other):
|
|
206
|
+
return self._arith_method(other, operator.mul)
|
|
207
|
+
|
|
208
|
+
@unpack_zerodim_and_defer("__rmul__")
|
|
209
|
+
def __rmul__(self, other):
|
|
210
|
+
return self._arith_method(other, roperator.rmul)
|
|
211
|
+
|
|
212
|
+
@unpack_zerodim_and_defer("__truediv__")
|
|
213
|
+
def __truediv__(self, other):
|
|
214
|
+
return self._arith_method(other, operator.truediv)
|
|
215
|
+
|
|
216
|
+
@unpack_zerodim_and_defer("__rtruediv__")
|
|
217
|
+
def __rtruediv__(self, other):
|
|
218
|
+
return self._arith_method(other, roperator.rtruediv)
|
|
219
|
+
|
|
220
|
+
@unpack_zerodim_and_defer("__floordiv__")
|
|
221
|
+
def __floordiv__(self, other):
|
|
222
|
+
return self._arith_method(other, operator.floordiv)
|
|
223
|
+
|
|
224
|
+
@unpack_zerodim_and_defer("__rfloordiv")
|
|
225
|
+
def __rfloordiv__(self, other):
|
|
226
|
+
return self._arith_method(other, roperator.rfloordiv)
|
|
227
|
+
|
|
228
|
+
@unpack_zerodim_and_defer("__mod__")
|
|
229
|
+
def __mod__(self, other):
|
|
230
|
+
return self._arith_method(other, operator.mod)
|
|
231
|
+
|
|
232
|
+
@unpack_zerodim_and_defer("__rmod__")
|
|
233
|
+
def __rmod__(self, other):
|
|
234
|
+
return self._arith_method(other, roperator.rmod)
|
|
235
|
+
|
|
236
|
+
@unpack_zerodim_and_defer("__divmod__")
|
|
237
|
+
def __divmod__(self, other):
|
|
238
|
+
return self._arith_method(other, divmod)
|
|
239
|
+
|
|
240
|
+
@unpack_zerodim_and_defer("__rdivmod__")
|
|
241
|
+
def __rdivmod__(self, other):
|
|
242
|
+
return self._arith_method(other, roperator.rdivmod)
|
|
243
|
+
|
|
244
|
+
@unpack_zerodim_and_defer("__pow__")
|
|
245
|
+
def __pow__(self, other):
|
|
246
|
+
return self._arith_method(other, operator.pow)
|
|
247
|
+
|
|
248
|
+
@unpack_zerodim_and_defer("__rpow__")
|
|
249
|
+
def __rpow__(self, other):
|
|
250
|
+
return self._arith_method(other, roperator.rpow)
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
# -----------------------------------------------------------------------------
|
|
254
|
+
# Helpers to implement __array_ufunc__
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
def array_ufunc(self, ufunc: np.ufunc, method: str, *inputs: Any, **kwargs: Any):
|
|
258
|
+
"""
|
|
259
|
+
Compatibility with numpy ufuncs.
|
|
260
|
+
|
|
261
|
+
See also
|
|
262
|
+
--------
|
|
263
|
+
numpy.org/doc/stable/reference/arrays.classes.html#numpy.class.__array_ufunc__
|
|
264
|
+
"""
|
|
265
|
+
from pandas.core.frame import (
|
|
266
|
+
DataFrame,
|
|
267
|
+
Series,
|
|
268
|
+
)
|
|
269
|
+
from pandas.core.generic import NDFrame
|
|
270
|
+
from pandas.core.internals import BlockManager
|
|
271
|
+
|
|
272
|
+
cls = type(self)
|
|
273
|
+
|
|
274
|
+
kwargs = _standardize_out_kwarg(**kwargs)
|
|
275
|
+
|
|
276
|
+
# for binary ops, use our custom dunder methods
|
|
277
|
+
result = maybe_dispatch_ufunc_to_dunder_op(self, ufunc, method, *inputs, **kwargs)
|
|
278
|
+
if result is not NotImplemented:
|
|
279
|
+
return result
|
|
280
|
+
|
|
281
|
+
# Determine if we should defer.
|
|
282
|
+
no_defer = (
|
|
283
|
+
np.ndarray.__array_ufunc__,
|
|
284
|
+
cls.__array_ufunc__,
|
|
285
|
+
)
|
|
286
|
+
|
|
287
|
+
for item in inputs:
|
|
288
|
+
higher_priority = (
|
|
289
|
+
hasattr(item, "__array_priority__")
|
|
290
|
+
and item.__array_priority__ > self.__array_priority__
|
|
291
|
+
)
|
|
292
|
+
has_array_ufunc = (
|
|
293
|
+
hasattr(item, "__array_ufunc__")
|
|
294
|
+
and type(item).__array_ufunc__ not in no_defer
|
|
295
|
+
and not isinstance(item, self._HANDLED_TYPES)
|
|
296
|
+
)
|
|
297
|
+
if higher_priority or has_array_ufunc:
|
|
298
|
+
return NotImplemented
|
|
299
|
+
|
|
300
|
+
# align all the inputs.
|
|
301
|
+
types = tuple(type(x) for x in inputs)
|
|
302
|
+
alignable = [
|
|
303
|
+
x for x, t in zip(inputs, types, strict=True) if issubclass(t, NDFrame)
|
|
304
|
+
]
|
|
305
|
+
|
|
306
|
+
if len(alignable) > 1:
|
|
307
|
+
# This triggers alignment.
|
|
308
|
+
# At the moment, there aren't any ufuncs with more than two inputs
|
|
309
|
+
# so this ends up just being x1.index | x2.index, but we write
|
|
310
|
+
# it to handle *args.
|
|
311
|
+
set_types = set(types)
|
|
312
|
+
if len(set_types) > 1 and {DataFrame, Series}.issubset(set_types):
|
|
313
|
+
# We currently don't handle ufunc(DataFrame, Series)
|
|
314
|
+
# well. Previously this raised an internal ValueError. We might
|
|
315
|
+
# support it someday, so raise a NotImplementedError.
|
|
316
|
+
raise NotImplementedError(
|
|
317
|
+
f"Cannot apply ufunc {ufunc} to mixed DataFrame and Series inputs."
|
|
318
|
+
)
|
|
319
|
+
axes = self.axes
|
|
320
|
+
for obj in alignable[1:]:
|
|
321
|
+
# this relies on the fact that we aren't handling mixed
|
|
322
|
+
# series / frame ufuncs.
|
|
323
|
+
for i, (ax1, ax2) in enumerate(zip(axes, obj.axes, strict=True)):
|
|
324
|
+
axes[i] = ax1.union(ax2)
|
|
325
|
+
|
|
326
|
+
reconstruct_axes = dict(zip(self._AXIS_ORDERS, axes, strict=True))
|
|
327
|
+
inputs = tuple(
|
|
328
|
+
x.reindex(**reconstruct_axes) if issubclass(t, NDFrame) else x
|
|
329
|
+
for x, t in zip(inputs, types, strict=True)
|
|
330
|
+
)
|
|
331
|
+
else:
|
|
332
|
+
reconstruct_axes = dict(zip(self._AXIS_ORDERS, self.axes, strict=True))
|
|
333
|
+
|
|
334
|
+
if self.ndim == 1:
|
|
335
|
+
names = {x.name for x in inputs if hasattr(x, "name")}
|
|
336
|
+
name = names.pop() if len(names) == 1 else None
|
|
337
|
+
reconstruct_kwargs = {"name": name}
|
|
338
|
+
else:
|
|
339
|
+
reconstruct_kwargs = {}
|
|
340
|
+
|
|
341
|
+
def reconstruct(result):
|
|
342
|
+
if ufunc.nout > 1:
|
|
343
|
+
# np.modf, np.frexp, np.divmod
|
|
344
|
+
return tuple(_reconstruct(x) for x in result)
|
|
345
|
+
|
|
346
|
+
return _reconstruct(result)
|
|
347
|
+
|
|
348
|
+
def _reconstruct(result):
|
|
349
|
+
if lib.is_scalar(result):
|
|
350
|
+
return result
|
|
351
|
+
|
|
352
|
+
if result.ndim != self.ndim:
|
|
353
|
+
if method == "outer":
|
|
354
|
+
raise NotImplementedError
|
|
355
|
+
return result
|
|
356
|
+
if isinstance(result, BlockManager):
|
|
357
|
+
# we went through BlockManager.apply e.g. np.sqrt
|
|
358
|
+
result = self._constructor_from_mgr(result, axes=result.axes)
|
|
359
|
+
else:
|
|
360
|
+
# we converted an array, lost our axes
|
|
361
|
+
result = self._constructor(
|
|
362
|
+
result, **reconstruct_axes, **reconstruct_kwargs, copy=False
|
|
363
|
+
)
|
|
364
|
+
# TODO: When we support multiple values in __finalize__, this
|
|
365
|
+
# should pass alignable to `__finalize__` instead of self.
|
|
366
|
+
# Then `np.add(a, b)` would consider attrs from both a and b
|
|
367
|
+
# when a and b are NDFrames.
|
|
368
|
+
if len(alignable) == 1:
|
|
369
|
+
result = result.__finalize__(self)
|
|
370
|
+
return result
|
|
371
|
+
|
|
372
|
+
if "out" in kwargs:
|
|
373
|
+
# e.g. test_multiindex_get_loc
|
|
374
|
+
result = dispatch_ufunc_with_out(self, ufunc, method, *inputs, **kwargs)
|
|
375
|
+
return reconstruct(result)
|
|
376
|
+
|
|
377
|
+
if method == "reduce":
|
|
378
|
+
# e.g. test.series.test_ufunc.test_reduce
|
|
379
|
+
result = dispatch_reduction_ufunc(self, ufunc, method, *inputs, **kwargs)
|
|
380
|
+
if result is not NotImplemented:
|
|
381
|
+
return result
|
|
382
|
+
|
|
383
|
+
# We still get here with kwargs `axis` for e.g. np.maximum.accumulate
|
|
384
|
+
# and `dtype` and `keepdims` for np.ptp
|
|
385
|
+
|
|
386
|
+
if self.ndim > 1 and (len(inputs) > 1 or ufunc.nout > 1):
|
|
387
|
+
# Just give up on preserving types in the complex case.
|
|
388
|
+
# In theory we could preserve them for them.
|
|
389
|
+
# * nout>1 is doable if BlockManager.apply took nout and
|
|
390
|
+
# returned a Tuple[BlockManager].
|
|
391
|
+
# * len(inputs) > 1 is doable when we know that we have
|
|
392
|
+
# aligned blocks / dtypes.
|
|
393
|
+
|
|
394
|
+
# e.g. my_ufunc, modf, logaddexp, heaviside, subtract, add
|
|
395
|
+
inputs = tuple(np.asarray(x) for x in inputs)
|
|
396
|
+
# Note: we can't use default_array_ufunc here bc reindexing means
|
|
397
|
+
# that `self` may not be among `inputs`
|
|
398
|
+
result = getattr(ufunc, method)(*inputs, **kwargs)
|
|
399
|
+
elif self.ndim == 1:
|
|
400
|
+
# ufunc(series, ...)
|
|
401
|
+
inputs = tuple(extract_array(x, extract_numpy=True) for x in inputs)
|
|
402
|
+
result = getattr(ufunc, method)(*inputs, **kwargs)
|
|
403
|
+
# ufunc(dataframe)
|
|
404
|
+
elif method == "__call__" and not kwargs:
|
|
405
|
+
# for np.<ufunc>(..) calls
|
|
406
|
+
# kwargs cannot necessarily be handled block-by-block, so only
|
|
407
|
+
# take this path if there are no kwargs
|
|
408
|
+
mgr = inputs[0]._mgr # pyright: ignore[reportGeneralTypeIssues]
|
|
409
|
+
result = mgr.apply(getattr(ufunc, method))
|
|
410
|
+
else:
|
|
411
|
+
# otherwise specific ufunc methods (eg np.<ufunc>.accumulate(..))
|
|
412
|
+
# Those can have an axis keyword and thus can't be called block-by-block
|
|
413
|
+
result = default_array_ufunc(inputs[0], ufunc, method, *inputs, **kwargs) # pyright: ignore[reportGeneralTypeIssues]
|
|
414
|
+
# e.g. np.negative (only one reached), with "where" and "out" in kwargs
|
|
415
|
+
|
|
416
|
+
result = reconstruct(result)
|
|
417
|
+
return result
|
|
418
|
+
|
|
419
|
+
|
|
420
|
+
def _standardize_out_kwarg(**kwargs) -> dict:
|
|
421
|
+
"""
|
|
422
|
+
If kwargs contain "out1" and "out2", replace that with a tuple "out"
|
|
423
|
+
|
|
424
|
+
np.divmod, np.modf, np.frexp can have either `out=(out1, out2)` or
|
|
425
|
+
`out1=out1, out2=out2)`
|
|
426
|
+
"""
|
|
427
|
+
if "out" not in kwargs and "out1" in kwargs and "out2" in kwargs:
|
|
428
|
+
out1 = kwargs.pop("out1")
|
|
429
|
+
out2 = kwargs.pop("out2")
|
|
430
|
+
out = (out1, out2)
|
|
431
|
+
kwargs["out"] = out
|
|
432
|
+
return kwargs
|
|
433
|
+
|
|
434
|
+
|
|
435
|
+
def dispatch_ufunc_with_out(self, ufunc: np.ufunc, method: str, *inputs, **kwargs):
|
|
436
|
+
"""
|
|
437
|
+
If we have an `out` keyword, then call the ufunc without `out` and then
|
|
438
|
+
set the result into the given `out`.
|
|
439
|
+
"""
|
|
440
|
+
|
|
441
|
+
# Note: we assume _standardize_out_kwarg has already been called.
|
|
442
|
+
out = kwargs.pop("out")
|
|
443
|
+
where = kwargs.pop("where", None)
|
|
444
|
+
|
|
445
|
+
result = getattr(ufunc, method)(*inputs, **kwargs)
|
|
446
|
+
|
|
447
|
+
if result is NotImplemented:
|
|
448
|
+
return NotImplemented
|
|
449
|
+
|
|
450
|
+
if isinstance(result, tuple):
|
|
451
|
+
# i.e. np.divmod, np.modf, np.frexp
|
|
452
|
+
if not isinstance(out, tuple) or len(out) != len(result):
|
|
453
|
+
raise NotImplementedError
|
|
454
|
+
|
|
455
|
+
for arr, res in zip(out, result, strict=True):
|
|
456
|
+
_assign_where(arr, res, where)
|
|
457
|
+
|
|
458
|
+
return out
|
|
459
|
+
|
|
460
|
+
if isinstance(out, tuple):
|
|
461
|
+
if len(out) == 1:
|
|
462
|
+
out = out[0]
|
|
463
|
+
else:
|
|
464
|
+
raise NotImplementedError
|
|
465
|
+
|
|
466
|
+
_assign_where(out, result, where)
|
|
467
|
+
return out
|
|
468
|
+
|
|
469
|
+
|
|
470
|
+
def _assign_where(out, result, where) -> None:
|
|
471
|
+
"""
|
|
472
|
+
Set a ufunc result into 'out', masking with a 'where' argument if necessary.
|
|
473
|
+
"""
|
|
474
|
+
if where is None:
|
|
475
|
+
# no 'where' arg passed to ufunc
|
|
476
|
+
out[:] = result
|
|
477
|
+
else:
|
|
478
|
+
np.putmask(out, where, result)
|
|
479
|
+
|
|
480
|
+
|
|
481
|
+
def default_array_ufunc(self, ufunc: np.ufunc, method: str, *inputs, **kwargs):
|
|
482
|
+
"""
|
|
483
|
+
Fallback to the behavior we would get if we did not define __array_ufunc__.
|
|
484
|
+
|
|
485
|
+
Notes
|
|
486
|
+
-----
|
|
487
|
+
We are assuming that `self` is among `inputs`.
|
|
488
|
+
"""
|
|
489
|
+
if not any(x is self for x in inputs):
|
|
490
|
+
raise NotImplementedError
|
|
491
|
+
|
|
492
|
+
new_inputs = [x if x is not self else np.asarray(x) for x in inputs]
|
|
493
|
+
|
|
494
|
+
return getattr(ufunc, method)(*new_inputs, **kwargs)
|
|
495
|
+
|
|
496
|
+
|
|
497
|
+
def dispatch_reduction_ufunc(self, ufunc: np.ufunc, method: str, *inputs, **kwargs):
|
|
498
|
+
"""
|
|
499
|
+
Dispatch ufunc reductions to self's reduction methods.
|
|
500
|
+
"""
|
|
501
|
+
assert method == "reduce"
|
|
502
|
+
|
|
503
|
+
if len(inputs) != 1 or inputs[0] is not self:
|
|
504
|
+
return NotImplemented
|
|
505
|
+
|
|
506
|
+
if ufunc.__name__ not in REDUCTION_ALIASES:
|
|
507
|
+
return NotImplemented
|
|
508
|
+
|
|
509
|
+
method_name = REDUCTION_ALIASES[ufunc.__name__]
|
|
510
|
+
|
|
511
|
+
# NB: we are assuming that min/max represent minimum/maximum methods,
|
|
512
|
+
# which would not be accurate for e.g. Timestamp.min
|
|
513
|
+
if not hasattr(self, method_name):
|
|
514
|
+
return NotImplemented
|
|
515
|
+
|
|
516
|
+
if self.ndim > 1:
|
|
517
|
+
if isinstance(self, ABCNDFrame):
|
|
518
|
+
# TODO: test cases where this doesn't hold, i.e. 2D DTA/TDA
|
|
519
|
+
kwargs["numeric_only"] = False
|
|
520
|
+
|
|
521
|
+
if "axis" not in kwargs:
|
|
522
|
+
# For DataFrame reductions we don't want the default axis=0
|
|
523
|
+
# Note: np.min is not a ufunc, but uses array_function_dispatch,
|
|
524
|
+
# so calls DataFrame.min (without ever getting here) with the np.min
|
|
525
|
+
# default of axis=None, which DataFrame.min catches and changes to axis=0.
|
|
526
|
+
# np.minimum.reduce(df) gets here bc axis is not in kwargs,
|
|
527
|
+
# so we set axis=0 to match the behavior of np.minimum.reduce(df.values)
|
|
528
|
+
kwargs["axis"] = 0
|
|
529
|
+
|
|
530
|
+
# By default, numpy's reductions do not skip NaNs, so we have to
|
|
531
|
+
# pass skipna=False
|
|
532
|
+
result = getattr(self, method_name)(skipna=False, **kwargs)
|
|
533
|
+
result = maybe_unbox_numpy_scalar(result)
|
|
534
|
+
return result
|