annoviko/pyclustering

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

Open

#422 opened on Apr 25, 2018

 (1 comment) (0 reactions) (1 assignee)Python (263 forks)auto 404
BugGood First Issue

Repository metrics

Stars
 (1,215 stars)
PR merge metrics
 (PR metrics pending)

Description

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

Contributor guide