Files
vectorize-io__hindsight/hindsight-dev/pyproject.toml
Sanderhoff-alt b045794817 perf(retain): accelerate within-batch semantic link calculation (#3977)
Cuts the within-batch semantic link pass to float32 and one reused buffer.

The batch was widened to float64, but PackedEmbedding is array("f") and pgvector's
vector column stores float32, so the extra 32 bits were padding nothing downstream
could read. Dropping to float32 halves the working set and puts BLAS on SGEMM;
normalising in place, deriving validity from the row norms instead of an (n, dim)
isfinite mask, and reusing one similarity buffer across blocks remove three further
copies. Peak transient falls 74-86% (at 5,000 facts, 235 MB -> 48 MB). argpartition
replaces a full sort that existed only to discard all but top_k, and the self-link
mask and score unboxing move out of the Python loop: 1.7-2.2x on a realistic
clustered batch, up to 4.8x when nearly every pair clears the threshold.

Norms are accumulated in float64 via einsum, since a float32 sum of 1536 squares
overflows above ~1e19 and flushes to zero below ~1e-22. The batch is copied with
np.array rather than aliased with asarray, as it is now normalised in place.

Verified against the float64 implementation across 120 randomised batches plus
NaN/inf/zero embeddings, degenerate magnitudes and all-ties: identical link pairs,
scores within 1e-6.
2026-09-08 11:38:19 +02:00

102 lines
3.3 KiB
TOML

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[project]
name = "hindsight-dev"
version = "0.9.2"
description = "Development utilities for Hindsight"
requires-python = ">=3.11"
dependencies = [
"hindsight-api==0.9.2",
"python-fasthtml>=0.12.33",
"streamlit>=1.54.0",
"openai>=1.0.0",
"rich>=13.0.0",
"pydantic>=2.0.0",
"httpx>=0.27.0",
"numpy>=1.26.0",
]
[project.optional-dependencies]
test = [
"pytest>=8.0.0",
"httpx>=0.27.0",
"python-dotenv>=1.0.0",
]
[tool.hatch.build.targets.wheel]
packages = ["hindsight_dev", "benchmarks", "upgrade_tests"]
[tool.uv.sources]
hindsight-api = { workspace = true }
[project.scripts]
generate-openapi = "hindsight_dev.generate_openapi:generate_openapi_spec"
generate-bank-template-schema = "hindsight_dev.generate_bank_template_schema:main"
generate-changelog = "hindsight_dev.generate_changelog:main"
sync-cookbook = "hindsight_dev.sync_cookbook:main"
generate-llms-full = "hindsight_dev.generate_llms_full:main"
check-openapi-compatibility = "hindsight_dev.check_openapi_compatibility:main"
cli-coverage-check = "hindsight_dev.cli_coverage_check:main"
client-coverage-check = "hindsight_dev.client_coverage_check:main"
perf-test = "benchmarks.perf.system_perf:main"
token-count-bench = "benchmarks.micro.token_counting:main"
vector-serialization-bench = "benchmarks.micro.vector_serialization:main"
semantic-within-batch-bench = "benchmarks.micro.semantic_within_batch:main"
entity-resolver-bench = "benchmarks.micro.entity_resolver_bench:main"
find-duplicate-observations = "hindsight_dev.obs_dedup.cli:main"
[dependency-groups]
dev = [
"ruff>=0.8.0",
"ty>=0.0.1",
]
[tool.ruff]
line-length = 120
target-version = "py311"
[tool.ruff.lint]
select = [
"E", # pycodestyle errors
"W", # pycodestyle warnings
"F", # Pyflakes
"I", # isort
]
ignore = [
"E501", # line too long (handled by formatter)
"E402", # module import not at top of file
"E712", # avoid equality comparisons to False (intentional for optional bools)
"F403", # star imports (fasthtml uses this pattern)
"F405", # may be undefined from star imports (fasthtml uses this pattern)
"F811", # redefined while unused
"F821", # undefined name (forward references in type hints)
"W291", # trailing whitespace (in multiline strings)
"W293", # blank line contains whitespace (in multiline strings)
]
[tool.ruff.format]
quote-style = "double"
indent-style = "space"
[tool.ty]
# Type checking configuration
# ty is an extremely fast Python type checker from Astral (same team as ruff/uv)
[tool.ty.environment]
python-version = "3.11"
[tool.ty.rules]
# Disable noisy rules
invalid-argument-type = "ignore" # Too many false positives
invalid-return-type = "ignore" # Often intentional
# missing-argument and unknown-argument are enabled (default)
invalid-parameter-default = "ignore" # Optional params with None default
possibly-missing-attribute = "ignore" # Common with Optional types
unsupported-operator = "ignore" # Pandas DataFrame operations
unresolved-reference = "ignore" # Forward references
unresolved-import = "ignore" # Dynamic imports
invalid-assignment = "ignore" # Intentional monkey-patching
no-matching-overload = "ignore" # Complex generic issues