CHANGES
=======

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
