pyclustering icon indicating copy to clipboard operation
pyclustering copied to clipboard

[pyclustering.core.metric_wrapper] Callback failure for user-defined function

Open annoviko opened this issue 6 years ago • 1 comments

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;
            };

annoviko avatar Apr 25 '18 13:04 annoviko

Workaround implemented: user-defined metrics are forbidden for passing to CCORE, in case of user-defined metric python code is used.

annoviko avatar May 17 '18 11:05 annoviko