1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
|
"""!
@brief Wrapper for CCORE library (part of this project).
@authors Andrei Novikov (pyclustering@yandex.ru)
@date 2014-2020
@copyright BSD-3-Clause
"""
import sys
from ctypes import *
from pyclustering.core.definitions import *
ccore_library_instance = None
ccore_library_version = "0.10.1.2"
class ccore_library:
__library = None
__workable = False
__initialized = False
@staticmethod
def get():
if not ccore_library.__library:
ccore_library.initialize()
return ccore_library.__library
@staticmethod
def workable():
if not ccore_library.__initialized:
ccore_library.get()
return ccore_library.__workable
@staticmethod
def initialize():
ccore_library.__initialized = True
if PATH_PYCLUSTERING_CCORE_LIBRARY is None:
print("The pyclustering ccore is not supported for platform '" + sys.platform + "' (" + platform.architecture()[0] + ").\n" +
"Falling back on python implementation.\n" +
"For more information, contact 'pyclustering@yandex.ru'.")
return None
if os.path.exists(PATH_PYCLUSTERING_CCORE_LIBRARY) is False:
print("The pyclustering ccore is not found (expected core location: '" + PATH_PYCLUSTERING_CCORE_LIBRARY + "').\n" +
"Probably library has not been successfully installed ('" + sys.platform + "', '" + platform.architecture()[0] + "').\n" +
"Falling back on python implementation.\n" +
"For more information, contact 'pyclustering@yandex.ru'.")
return None
ccore_library.__library = cdll.LoadLibrary(PATH_PYCLUSTERING_CCORE_LIBRARY)
if ccore_library.__check_library_integrity() is False:
print("Impossible to mark ccore as workable due to compatibility issues " +
"('" + sys.platform + "', '" + platform.architecture()[0] + "').\n" +
"Falling back on python implementation.\n" +
"For more information, contact 'pyclustering@yandex.ru'.")
return None
result, version = ccore_library.__check_library_version()
if result is False:
print("Incompatible ccore version of pyclustering library is being used ('" + version +"' instead '" + ccore_library_version + "').\n" +
"Probably library has not been successfully installed.\n" +
"Please, contact 'pyclustering@yandex.ru'.")
return ccore_library.__library
@staticmethod
def __check_library_integrity():
try:
ccore_library.__library.get_interface_description.restype = c_char_p
result = ccore_library.__library.get_interface_description()
if len(result) > 0:
ccore_library.__workable = True
except:
ccore_library.__workable = False
return ccore_library.__workable
@staticmethod
def __check_library_version():
version = "unknown"
try:
ccore_library.__library.get_interface_version.restype = c_char_p
version_cptr = ccore_library.__library.get_interface_version()
ccore_version = version_cptr.decode("utf-8")
if ccore_version == ccore_library_version:
ccore_library.__workable = True
else:
ccore_library.__workable = False
except:
ccore_library.__workable = False
return ccore_library.__workable, version
|