Skip to main content

Arrow-native Level 1 bit-pattern decoders (encodings) for fletchr, with byteforge kernels behind the built-ins.

Project description

fletchr-encodings

Arrow-native Level 1 bit-pattern decoders ("encodings") for the fletchr ecosystem.

An encoding turns the raw bits of a fletchr.uintn(bits=N) column into a number — unsigned/signed integer, IEEE 754 float, MIL-STD-1750A, BCD, and so on. This package owns the Arrow boundary (bits-from-type, validity-bitmap preservation) and a plugin system so users can add their own codecs. The built-in codecs wrap byteforge's numpy/C kernels, but byteforge is an implementation detail behind the built-ins — the public surface is entirely fletchr's own.

This is the Level 1 backend referenced by fletchr-measurand's SPEC-decode.md; Level 2 (engineering-unit scaling) lives in fletchr-measurand.

Public API

from fletchr_encodings import create_encoding, decode_array, list_encodings
from fletchr_uintn import uintn_array

raw = uintn_array([0x00, 0x7F, 0x80, 0xFF], bits=8)

# Resolve by canonical name and decode (bits read from the array type):
decode_array(raw, "2c").to_pylist()        # -> [0, 127, -128, -1]

# Or pass a resolved Encoding instance:
enc = create_encoding("2c")
decode_array(raw, enc)

Functions

Function Purpose
decode_array(arr, encoding) Decode a 1-D UIntNArray or 2-D FixedSizeListArray<UIntN>. encoding is a canonical name or an Encoding. Validates storage compatibility, reads the bit width from the type, preserves the validity bitmap.
create_encoding(name, *, bits=None) Resolve a canonical name to an Encoding. bits (optional) validates storage compatibility eagerly. Raises UnknownEncodingError on an unknown name.
list_encodings() Sorted list of registered canonical names (loads plugins first).
register_plugin_group(group) Add an entry-point group for downstream meta-packages.
load_plugins(*paths, strict=False) Explicitly import plugin modules (notebooks/tests).

Key design points

  • Bits come from the type, not a constructor arg. An Encoding is stateless with respect to width; a single instance decodes any width it supports. The width is read from the column's fletchr.uintn type at decode time.
  • Validity bitmap preserved end to end. Nulls in raw bits stay null in the decoded array.
  • One canonical name per encoding, no aliases. The name is both the registry key and the value written to fletchr.encoding field metadata, so the registry is 1:1 with the SPEC-decode table.
  • Level 1 output dtype is natural: integral encodings stay integral (u/bcd/gray/boolean → unsigned; 2c/1c/sm/ob → signed), floats decode to their natural width (ieee16 → float16, ieee32 → float32, ieee64 → float64, other floats → float64). Level 2 (in fletchr-measurand) promotes everything to float64.

Built-in encodings

Name Decodes to Required storage
u unsigned int (identity) uintn(bits=N)
sm signed int uintn(bits=N), N>=2
1c signed int uintn(bits=N), N>=2
2c signed int uintn(bits=N), N>=2
ob signed int uintn(bits=N), N>=2
ieee16 / ieee32 / ieee64 float16 / float32 / float64 uintn(bits=16/32/64)
1750a32 / 1750a48 float64 uintn(bits=32/48)
bcd unsigned int uintn(bits=N), N % 4 == 0
boolean unsigned int (0/1) uintn(bits=1)
gray unsigned int uintn(bits=N)
ibm32 / ibm64 float64 uintn(bits=32/64)
dec32 / dec64 / dec64g float64 uintn(bits=32/64)
ti32 / ti40 float64 uintn(bits=32/40)

A storage-width mismatch (e.g. ieee32 on a bits=16 column) raises EncodingError before any decode happens, per the SPEC's storage-compatibility rule.

Custom encodings (plugins)

Subclass Encoding, give it a canonical name, and implement _decode_np. Subclassing alone registers it; declaring the module in the fletchr_encodings.plugins entry-point group makes it discoverable without an explicit import. See custom-encodings.md.

from fletchr_encodings import Encoding

class CrcPacked(Encoding):
    name = "crc_packed"
    def _decode_np(self, dns, bits):
        ...   # your own numpy; keep padding bits masked

A width-constrained codec declares fixed_bits or overrides supports_bits; _decode_np must keep padding bits masked (the input is guaranteed < 2**bits).

License

MIT — see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fletchr_encodings-0.0.2.tar.gz (20.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fletchr_encodings-0.0.2-py3-none-any.whl (17.3 kB view details)

Uploaded Python 3

File details

Details for the file fletchr_encodings-0.0.2.tar.gz.

File metadata

  • Download URL: fletchr_encodings-0.0.2.tar.gz
  • Upload date:
  • Size: 20.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fletchr_encodings-0.0.2.tar.gz
Algorithm Hash digest
SHA256 2a4508d51f756dc30210a117e30c0035a5c294e834529dd973018fb697e94751
MD5 4af69f30de0485b4f2e418fc5122c7a9
BLAKE2b-256 c1d216c0e8c9ba5c147a204199e5da111b53a11eb4938746d5f4f16382fe0d86

See more details on using hashes here.

File details

Details for the file fletchr_encodings-0.0.2-py3-none-any.whl.

File metadata

  • Download URL: fletchr_encodings-0.0.2-py3-none-any.whl
  • Upload date:
  • Size: 17.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for fletchr_encodings-0.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 172da9e45a9d17623c5d8a05f32fd0dc477a029c9716830576e7c721f66f551f
MD5 897f5143a922207b97fa1194a2a72ccd
BLAKE2b-256 0b634b2e1f21af67870b1cf1184d5ce7a6f5faf9084caf62fb8d9def70febb74

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page