pyclustering
pyclustering copied to clipboard
[pyclustering.core.metric_wrapper] Callback failure for user-defined function
Introduction In case of user-defined metric, algorithms doesn't use core to avoid crash on some platforms.
Description Investigation is required. See test: 'testUserDefinedMetric'. Test location: pyclustering/utils/tests/integration/it_metric.py
Ran 6 tests in 0.016s
FAILED (errors=1)
Error
Traceback (most recent call last):
File "D:\Miniconda3\envs\test-environment\lib\unittest\case.py", line 58, in testPartExecutor
yield
File "D:\Miniconda3\envs\test-environment\lib\unittest\case.py", line 580, in run
testMethod()
File "D:\workspace\pyclustering\pyclustering\utils\tests\integration\it_metric.py", line 71, in testUserDefinedMetric
assertion.eq(2.0, metric_instance([0.0, 0.0], [2.0, 0.0]));
File "D:\workspace\pyclustering\pyclustering\core\metric_wrapper.py", line 65, in __call__
return ccore.metric_calculate(self.__pointer, point_package1, point_package2);
OSError: [WinError -1073741795] Windows Error 0xc000001d
Technical details Crash occurs in pyclustering core, interface file: pyclustering/ccore/src/interface/metric_interface.cpp.
auto functor_wrapper = [p_solver](const point & p1, const point & p2) {
pyclustering_package * point1 = create_package(&p1);
pyclustering_package * point2 = create_package(&p2);
const double distance = p_solver(point1, point2); <--- crash here.
delete point1;
delete point2;
return distance;
};
Workaround implemented: user-defined metrics are forbidden for passing to CCORE, in case of user-defined metric python code is used.