|
| 1 | +import atexit |
| 2 | +import os |
| 3 | +from ctypes import * |
| 4 | +from .ctypesWrapper import * |
| 5 | +from .codes import check |
| 6 | + |
| 7 | +_lib_wrapper = None |
| 8 | + |
| 9 | + |
| 10 | +class InternalWrapper: |
| 11 | + |
| 12 | + def __init__(self): |
| 13 | + self._load_path = os.environ["CUBOOL_PATH"] |
| 14 | + self._lib = cdll.LoadLibrary(self._load_path) |
| 15 | + self._instance_new() |
| 16 | + |
| 17 | + self._declarations = FuncDeclaration(self._lib) |
| 18 | + |
| 19 | + def unload(self): |
| 20 | + self._instance_free() |
| 21 | + del self._lib |
| 22 | + handle = self._lib._handle |
| 23 | + self._lib.dlclose(handle) |
| 24 | + |
| 25 | + def _instance_new(self): |
| 26 | + self._lib.CuBool_Instance_New.restype = c_int |
| 27 | + self._lib.CuBool_Instance_New.argtypes = [POINTER(CuBoolInstanceDesc), |
| 28 | + POINTER(CuBoolInstance)] |
| 29 | + self._instance = CuBoolInstance() |
| 30 | + self._descInstance = CuBoolInstanceDesc() |
| 31 | + status = self._lib.CuBool_Instance_New(pointer(self._instance), |
| 32 | + pointer(self._descInstance)) |
| 33 | + check(status.value) |
| 34 | + # if status != c_int(0): |
| 35 | + # raise Exception("Error at create instance. Code - " + str(status)) |
| 36 | + # print("Status of creating instance is", status) |
| 37 | + |
| 38 | + def _instance_free(self): |
| 39 | + self._lib.CuBool_Instance_Free.restype = c_int |
| 40 | + self._lib.CuBool_Instance_Free.argtypes = [POINTER(CuBoolInstanceDesc), |
| 41 | + POINTER(CuBoolInstance)] |
| 42 | + status = self._lib.CuBool_Instance_Free(self._instance) |
| 43 | + check(status.value) |
| 44 | + |
| 45 | + def matrix_new(self, nrows, ncols): |
| 46 | + matrix = CuBoolMatrix() |
| 47 | + status = self._declarations.matrix_creator(self._instance, |
| 48 | + pointer(matrix), |
| 49 | + c_int(nrows), |
| 50 | + c_int(ncols)) |
| 51 | + return status.value, matrix |
| 52 | + |
| 53 | + def matrix_free(self, matrix): |
| 54 | + status = self._declarations.matrix_destructor(self._instance, |
| 55 | + matrix) |
| 56 | + return status.value |
| 57 | + |
| 58 | + def matrix_resize(self, matrix, nrows, ncols): |
| 59 | + status = self._declarations.matrix_resizer(self._instance, |
| 60 | + matrix, |
| 61 | + c_int(nrows), |
| 62 | + c_int(ncols)) |
| 63 | + return status.value |
| 64 | + |
| 65 | + def matrix_build(self, matrix, rows, cols, nvals): |
| 66 | + t_rows = (c_int * len(rows))(*rows) |
| 67 | + t_cols = (c_int * len(cols))(*cols) |
| 68 | + |
| 69 | + status = self._declarations.matrix_builder(self._instance, |
| 70 | + matrix, |
| 71 | + pointer(t_rows), |
| 72 | + pointer(t_cols), |
| 73 | + c_int(nvals)) |
| 74 | + return status.value |
| 75 | + |
| 76 | + def matrix_add(self, acc_matrix, add_matrix): |
| 77 | + status = self._declarations.matrix_builder(self._instance, |
| 78 | + acc_matrix, |
| 79 | + add_matrix) |
| 80 | + return status.value, acc_matrix |
| 81 | + |
| 82 | + |
| 83 | +_lib_wrapper = InternalWrapper() |
| 84 | + |
| 85 | + |
| 86 | +def action_at_exit(): |
| 87 | + global _lib_wrapper |
| 88 | + _lib_wrapper.unload() |
0 commit comments