* FIX MAE reg. criterion: Use safe_realloc to avoid memory leak
* Release GIL in safe_realloc and clean up scaffolding
* As gil is released in safe_realloc, no need of a with gil block
* Use except * to propagate error in all cdef functions
* Don't use except * for functions that return python objects
* Don't use except * for the comparison function passed to qsort
* Omissions and Errors
* Use safe_realloc now that gil is released there
* Fix realloc size
* Acquire GIL only if we need to raise
* Use except * more judiciously; Release gil only when raising; Add comments to clarify
* Actually that was unneeded; realloc will also allocate for the first time
* StackRecord*, PriorityHeapRecord* to fused type realloc_ptr; Use safe_realloc
* Use except -1 to propagate exceptions. This should avoid overheads
* Fix docstrings and add return 0 to reset methods
* TYPO
* REVIEW Remove redundant MemoryError raising calls
* RFC: move heap methods to class and remove trailing spaces
* spurious comment to force recythonization of boosting
* [ci skip] remove spurious comment
* remove trailing whitespace on line
* style: fix trailing whitespace in _criterion.pxd
* add spurious comments to try to force recythonizing
* remove changes for recythonization
* feature: add initial node_value method
* testing code for node_impurity and node_value
This code runs into 'Bus Error: 10' at node_value final assignment.
* fix: node_value now correctly calculating weighted median for sorted data.
Still need to change the code to work with unsorted data.
* fix: node_value now correctly calculates median regardless of initial order
* fix: correct bug in calculating median when taking midpoint is necessary
* feature: add initial version of children_impurity
* feature: refactor median calculation into one function
* fix: fix use of DOUBLE_t vs double
* feature: move helper functions to _utils.pyx, fix mismatched pointer type
* fix: fix some bugs in children_impurity method
* push a debug version to try to solve segfault
* push latest changes, segfault probably happening bc of something in _utils.pyx
* fix: fix segfault in median calculation and remove excessive logging
* chore: revert some misc spacing changes I accidentally made
* chore: one last spacing fix in _splitter.pyx
* feature: don't calculate weighted median if no weights are passed in
* remove extraneous logging statement
* fix: fix children impurity calculation
* fix: fix bug with children impurity not being initally set to 0
* fix: hacky fix for a float accuracy error
* fix: incorrect type cast in median array generation for node_impurity
* slightly tweak node_impurity function
* fix: be more explicit with casts
* feature: revert cosmetic changes and free temporary arrays
* fix: only free weight array in median calcuation if it was created
* style: remove extraneous newline / trigger CI build
* style: remove extraneous 0 from range
* feature: save sorts within a node to speed it up
* fix: move parts of dealloc to regression criterion
* chore: add comment to splitter to try to force recythonizing
* chore: add comment to _tree.pyx to try to force recythonizing
* chore: add empty comment to gradient boosting to force recythonizing
* fix: fix bug in weighted median
* try moving sorted values to a class variable
* feature: refactor criterion to sort once initially, then draw all samples from this sorted data
* style: remove extraneous parens from if condition
* implement median-heap method for calculating impurity
* style: remove extra line
* style: fix inadvertent cosmetic changes; i'll address some of these in a separate PR
* feature: change minmaxheap to internally use sorted arrays
* refactored MAE and push to share work
* fix errors wrt median insertion case
* spurious comment to force recythonization
* general code cleanup
* fix typo in _tree.pyx
* removed some extraneous comments
* [ci skip] remove earlier microchanges
* [ci skip] remove change to priorityheap
* [ci skip] fix indentation
* [ci skip] fix class-specific issues with heaps
* [ci skip] restore a newline
* [ci skip] remove microchange to refactor later
* reword a comment
* remove heapify methods from queue class
* doc: update docstrings for dt, rf, and et regressors
* doc: revert incorrect spacing to shorten diff
* convert get_median to return value directly
* [ci skip] remove accidental whitespace
* remove extraneous unpacking of values
* style: misc changes to identifiers
* add docstrings and more informative variable identifiers
* [ci skip] add trivial comments to recythonize
* remove trivial comments for recythonizing
* force recythonization for real this time
* remove trivial comments for recythonization
* rfc: harmonize arg. names and remove unnecessary checks
* convert allocations to safe_realloc
* fix bug in weighted case and add tests for MAE
* change all medians to DOUBLE_t
* add loginc allocate mediancalculators once, and reset otherwise
* misc style fixes
* modify cinit of regressioncriterion to take n_samples
* add MAE formula and force rebuild bc. travis was down
* add criterion parameter to gradient boosting and add forest tests
* add entries to what's new
All mallocs should be checked now. Some notes for the next person to touch
this code, or do anything with malloc in Cython code:
* with gil: raise MemoryError() didn't work as expected, as a surrounding
nogil block catches and logs the exception, then proceeds as if nothing
happened.
* There were several opportunities for double free in the code. This is
handled by letting the destructor handle the freeing.
* Similarly, constructors failed to set pointers to NULL so __dealloc__
would try to free unitialized pointers.
* Out of memory might leave trees in an inconsistent state, but will not
cause a double free. A subsequent successful fit should produce a
consistent state, although I didn't test this.
* Replaced a free/calloc with a realloc; realloc(NULL, n) = malloc(n).
* free(NULL) is a harmless no-op per ISO C89.
Also performed an optimization: the pre-sort splitter was using size_t for
an array of booleans. unsigned char is faster and smaller.
Finally, fixed some cosmetic issues (long lines).