CHANGES
=======

0.21.0
------

* test: add a test for a region that was broken before
* fix: spurious branch elimination working
* wip: try simplifying crack code creation, eliminate spurious branches later
* perf: limit worst case behavior on watershed
* feat(cli): add --keep option
* fix: sections with an "s"

0.20.0
------

* test: check that label works
* feat(voxel\_counts): add label selection
* docs: show how to use voxel\_counts
* test: check 1 voxel array
* feat: add voxel\_counts to array interface
* feat(voxel\_counts): add voxel counting routine
* cli: neater error messages

0.19.0
------

* feat: support point clouds with pins

0.18.0
------

* feat: add summary function "ok" for easy programmatic testing of file integrity
* fix: bugs in testing code
* feat(cli): allow -p for pins
* docs: show how to use pins on CLI
* feat: testing tool for finding file corruption
* ci: only build 64-bit
* ci: only build 64-bit targets
* chore: add py313 to TROVE classifiers
* refactor: remove cmake
* fix: update MANIFEST.in with CRC library
* ci: easier build (#37)
* ci: try a different strategy for submodule
* docs: fix format version description
* feat: add crc protection to all parts of the binary (#36)
* perf: avoid unnecessary copies during reencoding
* perf: reduce memory usage during reencoding
* test: check that reencode actually works

0.17.3
------

* ci: update pkginfo twine
* fix: make header info more flexible without cloudfiles dep
* fix: incorrect variable reference

0.17.2
------

* fix: match header upgrade to c++ in python
* fix: another fix for CrackleArray z-index
* perf: make header reading more efficient
* perf: efficient reading of header information from CLI

0.17.1
------

* test: check that z index works right
* fix(array): z-index as integer can return a scalar

0.17.0
------

* fix: referenced wrong header\_bytes
* fix: referenced wrong variable
* feat: set manual bgcolor (#34)
* feat: Format Version 1 (extended labels, crc8 protects header) (#35)
* feat: z stack pins (#33)
* fix: add type sig
* fix: add type sig to remap
* fix: remap, min, max
* refactor: mostly remove dead fixed pins format
* docs: add docstrings to zeros and ones
* feat(zshatter): split stream into separate z slices
* docs: update help text
* docs: fix formatting
* feat(aload): add "allow\_mmap" for loading plain crackle files as mmap
* fix: asfortranarray and ascontiguousarray were not working

0.16.0
------

* ci: update to artifact v3
* perf: much faster pins encoder (#29)
* fix: incorrect reservation behavior
* perf: lower encoding memory (#28)
* feat: low memory point cloud extraction (#27)
* ci: update oses so c++20 can be used
* perf: improve decompression memory usage and speed (#26)
* feat: allow full volume testing in perf.py
* feat(cli): add number of labels to info
* feat: reencode files with different markov model orders (#25)
* perf: faster codepoints\_to\_symbols (#24)
* fix(cli): decompression error when sz=1 (but output is written ok)
* perf: allocate a smaller lookup table
* docs: update performance benchmark (way out of date!)
* docs: add more type annotations to CrackleArray
* fix: redundant arguments in remap

0.15.0
------

* fix: imports
* docs: update examle for how to save a numpy array
* fix: make save work with numpy format
* docs: show how to use save\_numpy
* fix: accept binary strings into save\_numpy
* chore: whitespace
* perF: make CLI decompression memory efficient
* feat: add function for serializing a numpy array using low memory
* docs: show how to use new features for building and editing arrays

0.14.0
------

* feat: add numpy function for array
* feat+refactor: add astype function
* test: add test for refit
* fix: wrong metric used for refit
* fix: errors in min and max
* fix: remove unnecessary argument
* fix: bytes are not mutable in renumber
* fix: support checking for binary equivalency
* feat: define == operator
* fix: remove erroneous string
* feat: add reverse operators
* feat: add, subtract, multiply, divide
* feat: allow arbitrary writes to cracklearray
* fix: ones, zeros exported
* feat: add crackle.full, zeros, and ones
* feat: add condense\_unique function
* fix: errors in remapping unique keys in zsplit
* feat: add C and Fortran order conversion functions
* feat: remove restriction on same stored data type
* feat: allow integer/float assignment
* feat: crackle.save accepts CrackleArrays
* fix: debug code + some memory efficiency
* feat: add writable CrackleArray
* feat: add zsplit
* fix: crack\_codes was still incorrect
* test: expand zstack testing
* perf(zstack): don't modify the binary if only one
* feat: add zstack function
* fix: incorrect python code for crack codes

0.13.1
------

* ci: rebuild for numpy 2.0
* feat: add label parameter to load

0.13.0
------

* chore: update libcrackle.wasm
* perf: reuse output for uint32 data
* perf: faster codepoints\_to\_symbols by eliminating branches
* perf: faster encoding by efficient codepoint packing
* perf: branchless symbol unpacker
* fix: silence warning
* perf: replace map with vector
* perf: small (~2%?) speedup in decoding

0.12.0
------

* fix: MSVC complaining about the type
* fix: use proper type
* fix: accomodate MSVC
* perf: faster graph init
* perf: faster crack code generation
* chore: update wasm with faster crackle codec

0.11.0
------

* refactor: possibly avoid a copy
* perf: optimize crack code creation (#15)

0.10.0
------

* perf: ~20% performance increase for compression (#14)

0.9.0
-----

* perf: fewer copies in decode (#13)

0.8.1
-----

* fix: ensure that renumbering is accurate after remapping
* fix: support is\_sorted flag
* test: check for consistent behavior after remap

0.8.0
-----

* fix: decoder bug patched in wasm version
* feat: accelerated binary decode (#11)

0.7.2
-----

* build: update cibuildwheel to newer version
* fix: update testing -py37 +py311 +py312
* fix: error in decoding uint32 cc labels
* test: found data corruption error
* fix: remove compile warning
* docs: update benchmark

0.7.1
-----

* build: update for py312
* fix: some improvements to wasm/index.ts
* feat: add printing unique labels to command line

0.7.0
-----

* install: add MANIFEST.in
* docs: mention 3d compression of crack codes
* docs: update from "experimental" to "beta"
* fix: support python3.8 on CLI (removesuffix is py3.9+)
* feat: allow CLI to read compressed numpy files
* refactor: remove redundant import
* feat: elevate aload to a top level import
* feat: add wasm build
* feat: add a decompression routine accepting pre-allocated buffers

0.6.2
-----

* fix: ensure additional ndim only applies for extensions
* fix(array): missing import for decompress
* feat: support CrackleArray operations that CloudVolume needs
* feat: add -z gzip compression flag to cli
* refactor: move crack code decoding to a separate function
* perf: fewer requests for CrackleRemoteArray

0.6.1
-----

* install: crackle\_cli was not included in bundle

0.6.0
-----

* fix: accept lower dimension images
* perf: ensure min and max are actually faster than numpy
* feat(CrackleArray): add min and max functions
* docs: show that we have min and max functions
* feat: add accelerated min and max functions

0.5.0
-----

* build: update gha with more architectures
* docs: add PyPI badge
* feat: CrackleRemoteArray (experimental) (#10)
* docs(README): add num\_labels, refit, and renumber
* fix+refactor: more correct refit + reuse code in renumber
* feat: add num\_labels function to CrackleArray
* feat: add fast num\_labels function
* fix: whitespace
* feat: add refit and renumber to CrackleArray
* feat(renumber): add renumber function
* feat(refit): change rendering dtype to smallest one w/o precision loss
* feat: add boc and crack\_code extractions to python interface
* bench: add markov to size benchmark (using order 5)

0.4.0
-----

* docs: show how to use markov model
* BREAKING: feat: finite context modeling of crack codes (#8)
* feat: add lzma reading and writing to CLI
* feat: add pins benchmarking
* docs: show how hybrid pin format works
* docs: turn pin section into a table
* docs: incorrect data type for num\_label\_bytes
* docs: convert flat labels spec to table
* feat: add nbytes member function to header
* fix: correct return types for pairing heap min\_key, min\_value
* chore: add universal2 build script

0.3.0
-----

* chore: add pyproject.toml
* redesign: hybrid condensed pin format (#7)
* fix: was decoding condensed pins wrong in Python
* feat: optimize pin starting index and depth
* fix: header.details() was not functional
* feat: add condensed pins decoder to python interface

0.2.1
-----

* perf: reduce memory usage during pin calculation
* fix: memory leak in encode\_flat

0.2.0
-----

* chore: upgrade status from Alpha to Beta
* redesign: ban signed integer data types until we can debug linux
* fix: default signed integers to flag labels since pins aren't supported
* fix: possibly more reliable signed integer method
* fix: ensure integer labels get decoded properly
* docs: fix error in spec
* docs: missed a preposition
* docs: update blurb at top
* docs: note fixed width pins are disabled
* docs: describe the fixed width format
* docs: update header spec
* test: add full watershed and connectomics tests
* docs: show that we've moved the crack index in front of labels
* redesign: move crack code index in front of labels and make 4 bytes
* feat: add partial support for signed integer images
* fix: possible error in multiverse computation
* docs: forgot to add bgcolor in pin format
* docs: add formatting
* docs: show how the crack code format works
* docs: add info on stream format
* refactor: replace magic numbers with enums
* test: update benchmarks

0.1.0
-----

* fix: compilation error
* feat: add fixed width pins back into encoder
* feat: add decode range to fixed pins
* fix: infinite loop for some inputs in flat encoding
* fix: get tests to (mostly) pass
* redesign: condensed pins are idx,idx,depth,depth with difference coding
* fix: wrong index on all\_labels
* feat: used variable width pins instead of fixed by default
* fix: unused variable warnings
* redesign: simplify condensed pins (remove excess label keys)
* fix: wrong variable
* fix: missing increment in condensed pins decoder
* build: fix extra compile options for mvcc
* refactor: remove unnecessary statement from build
* fix: cast 0LL in a more standard way
* fix: cast zero in a more standard way
* build: try language=c++
* fix: use g++
* build: try g++
* feat: instrument crackle with condensed pins control flow
* feat: add condensed pins decoder
* refactor: make pin decoding dynamic
* fix: compiling error
* feat: add prototype condensed pin encoding fn
* perf: fix reservations in fixed pin encoding
* refactor: move find bgcolor to own function
* feat: add --allow-pins to CLI
* ci: try forcing g++
* fix: misspelling of file
* fix: use "main" instead of "master" for this repo
* build: add GHA builds
* install: crackle -> crackle-code for pypi
* docs: knock it back down to alpha
* feat: cli can decode gzip files in one step
* docs: update claims
* docs: update some README claims
* feat: random z decode (#6)
* docs: add date to docstring
* docs: add docstrings to key functions
* docs: add docstring to decompress, warning to compress for allow\_pins
* redesign: switch force\_flat to allow\_pins
* docs: add doc strings to module and compress
* perf: make it faster to add pin ccs
* refactor: write pixel\_pairs more simply
* docs: clarify the size of these volumes
* docs: update benchmarks with newest code
* perf: accelerate crack code creation
* test: pare down tests to C++ code
* feat: optimize integers used for component size
* fix: make the format future proof to adding grid based random access
* feat: add grid\_size field
* docs: fix perf benchmark to always evaluate in fortran order
* docs: update benchmarks after perf improvements to compression
* perf: speed up graph creation and crack codes
* perf: simplify computation of unique labels
* perf: use faster check for revisited nodes
* docs: note that these numbers are for the "flat" layout
* benchmark: add binary noise to perf as well
* docs: add pathological case to benchmarks
* benchmark: add padding to output
* docs: update size benchmark, add perf
* benchmark: add size improvements to perf benchmark
* feat: add performance benchmark
* perf: speed up crack code creation (remove quadratic loop)
* perf: reduce number of unify calls in graph init
* perf: remove map access for crack code creation
* perf: faster graph creation
* benchmarks: add encoding speed estimates
* perf: faster labels flat
* feat: transparent handling of C/F order numpy arrays
* docs: show how to use CrackleArray
* docs: add CLI example
* fix: allow printing out header info
* feat: make crackle based on fastcrackle, crackle -> cracklepy, cli
* fix: ensure updated key is negative
* fix: bug in last position of multiverse calculation
* fix: choose pinset with most pins and secondarily most depth
* fix: incorrect multiverse computation
* feat: cpp encoder (#1)
* perf: use doubly linked sibling list for faster pairing heap perf
* refactor: insert -> emplace
* refactor: change method names to match STL
* fix: reenable destructor
* perf: don't compare pins that won't have anything useful
* perf: don't perform unnecessary updates
* fix: warning
* perf: use pairing heap to avoid quadratic search performance
* fix: was not properly unlinking nodes
* feat: adding increase\_key
* fix: some errors in pairing heapt
* fix: pairing\_heap compiles
* feat: add pairing heap implementation
* perf: compute multiverse in one shot
* fix: use correct pin endpoint
* perf: skip final pin evaluations if universe 0
* perf: small optimization for pin computation
* feat: get pin encoder connected to python
* perf: improve run time of pin computation
* fix: bug in pin allocation
* fix: infinite loop
* fix: several compile issues with pin computation
* fix: memory leak
* wip: sketch of pin optimizer in c++
* wip(pins.hpp): adding column extraction
* perf: remove additional pins
* feat: sort unique labels in eytzinger order
* fix: got c++ ccl working
* perf: improving encoder performance for ccl (not working yet)
* perf: remove more candidate pins
* perf: speed up col extraction and reduce candidate pins
* perf: faster pin computation
* fix: make cpp ccl available to python
* feat: starting to add some encoding logic
* perf: make fast implementation of CCL available
* fix: correct casting
* feat: adding some functions helpful for writing encoder
* fix: support multiple label dtypes
* fix: got initial branch removal working
* feat: remove initial branch
* fix: pin decoding
* fix: parsing of code stream
* fix: location decoding error
* fix: broken conditional guards
* fix: incorrect conditional guards
* fix: incorrect guard conditionals
* fix: missing reset of symbols array
* fix: add bounds checking to crack code parsing
* test: add more and bigger random tests, reduce number of repeats
* feat: add no-copy decoding
* feat: add switch for F or C decoding order
* chore: use c++17
* fix: mistake in CCL coloring
* fix: more unpacking issues
* fix: several more issues
* fix: some weird transpositions
* test: add failing test
* fix: bug in coloring
* fix: memory leak
* fix: lots of little issues, trying to fix C vs F
* fix: more off-by errors
* fix: pin range is inclusive. also add head.voxels()
* fix: correct for bgcolor offset
* fix: uninitialized max\_labels
* fix: another out of bounds
* fix: more bugs..
* fix: incorrect variable
* fix: buffer overrun
* fix: add include for unique\_ptr
* fix: incorrect variable given to decode\_num\_labels
* fix: forgot to remap bg color
* feat: add component index to flat labels
* fix: add error message info and fix off-by-one
* refactor: reuse header object more
* fix: ensure string is converted right
* fix: don't always gzip in make\_examples
* fix: lu -> llu
* fix: header defines
* wip: fixed several errors in labels.hpp
* fix: a few more syntax errors
* fix: several syntax errors
* wip: totally untested (or even compiled) C++ decoder
* redesign: change sx,sy,sz to 4 bytes to not handicap format
* feat: wrote ccl in C++ (not integrated)
* refactor(ccl): make names same as c++
* perf: slighly improve coloring perf
* perf: make decompression faster by optimizing coloring
* perf: make ccl a lot faster
* docs: show that compresso does better with big integers on rand
* docs: upload readme of benchmark results
* fix: benchmarks wasn't listening to N
* fix: get benchmark working better
* feat: add size comparison benchmark
* perf: speed up final ccl relabel
* perf: speed up final remapping
* fix: get remap working with new format
* test: add test data for watershed
* fix: used wrong metric to determine key dtype
* feat: use unique label coding for flat too
* refactor: remove labelsort flag
* feat: remove redundant branches
* refactor: add type annotation
* fix: incorrect ccl output for N
* perf: demo that you can get unique labels more cheaply
* fix: ensure CCL and coloring agree
* feat: reduce label width in pins and allow binary search of labels
* fix: component\_lengths
* feat: add component\_lengths function
* feat: add graph printer for debugging
* fix: coloring bug
* fix: use correct dtype transform
* fix: ensure correct number of labels is used in ccl
* fix: make labels compatible with flat
* fixtest: add permissible to crack code generation
* refactor+fix+feat: move header.py to headers.py add header fn, refactor decode
* feat: if there's no 3D data, do not use pins (wasteful)
* feat: add permissible/impermissible crack coding and flat labeling
* fix: ccl numbering was off by one
* feat: add permissible/impermissible to create\_graph
* refactor: decouple integer coding from moves
* feat: add components function
* fix: typo
* feat: add configurable sort
* feat: include more options in header and shrink one byte
* test: check unique labels function
* feat: add background color field
* fix: forgot to add util.py
* feat: adaptive node width
* docs: moderate claims a bit more
* docs: update claims
* docs: show how to use the library
* install: add setup.py, setup.cfg
* test: add empty test
* docs: discuss second axis for special codes
* refactor: remove prototype file
* feat: add (unused so far) condensed format encoder
* refactor: remove prototype file
* feat: import save,load
* test: fix tests and add compress/decompress test
* redesign: import labels, remap, nbytes
* fix: it might be working!
* fix: reset symbols for next chain
* fix: bug in unpacking logic
* fix: working????
* fix: add guards and correct off by one error for decoding
* fix: eliminate palendromic sequences that will be misinterpreted
* fix: ensure node is integer, edges are sorted
* test: add packing/unpacking test
* fix: unpacking code works better now
* fix: correct branch terminations
* test: check simple case of one voxel
* fix: crack code generator can deal with cycles
* fix: graph construction was off by one
* fix: pin depth iteration
* wip: kind of runs but mostly crashes
* wip: writing a really slow decoder
* wip: getting closer to the core of the problem
* wip: able to decode labels, maybe remap
* feat: added prototype encoder
* docs: make some preliminary claims about crackle
* chore: add requirements.txt
* init: add experimental crack code, pins, data, and explaination
* Initial commit
