def _MCPP_lib(): """A singleton interface to the MC++ library""" if _MCPP_lib._mcpp is not None: return _MCPP_lib._mcpp _MCPP_lib._mcpp = mcpp = ctypes.CDLL(Library('mcppInterface').path()) # Version number mcpp.get_version.restype = ctypes.c_char_p mcpp.toString.argtypes = [ctypes.c_void_p] mcpp.toString.restype = ctypes.c_char_p mcpp.lower.argtypes = [ctypes.c_void_p] mcpp.lower.restype = ctypes.c_double mcpp.upper.argtypes = [ctypes.c_void_p] mcpp.upper.restype = ctypes.c_double mcpp.concave.argtypes = [ctypes.c_void_p] mcpp.concave.restype = ctypes.c_double mcpp.convex.argtypes = [ctypes.c_void_p] mcpp.convex.restype = ctypes.c_double mcpp.subcc.argtypes = [ctypes.c_void_p, ctypes.c_int] mcpp.subcc.restype = ctypes.c_double mcpp.subcv.argtypes = [ctypes.c_void_p, ctypes.c_int] mcpp.subcv.restype = ctypes.c_double # Create MC type variable mcpp.newVar.argtypes = [ ctypes.c_double, ctypes.c_double, ctypes.c_double, ctypes.c_int, ctypes.c_int ] mcpp.newVar.restype = ctypes.c_void_p # Create MC type constant mcpp.newConstant.argtypes = [ctypes.c_double] mcpp.newConstant.restype = ctypes.c_void_p # Multiply MC objects mcpp.multiply.argtypes = [ctypes.c_void_p, ctypes.c_void_p] mcpp.multiply.restype = ctypes.c_void_p # Add MC objects mcpp.add.argtypes = [ctypes.c_void_p, ctypes.c_void_p] mcpp.add.restype = ctypes.c_void_p # pow(x, y) functions # y is integer mcpp.power.argtypes = [ctypes.c_void_p, ctypes.c_void_p] mcpp.power.restype = ctypes.c_void_p # y is fractional mcpp.powerf.argtypes = [ctypes.c_void_p, ctypes.c_void_p] mcpp.powerf.restype = ctypes.c_void_p # y is an expression mcpp.powerx.argtypes = [ctypes.c_void_p, ctypes.c_void_p] mcpp.powerx.restype = ctypes.c_void_p # sqrt function mcpp.mc_sqrt.argtypes = [ctypes.c_void_p] mcpp.mc_sqrt.restype = ctypes.c_void_p # 1 / MC Variable mcpp.reciprocal.argtypes = [ctypes.c_void_p] mcpp.reciprocal.restype = ctypes.c_void_p # - MC Variable mcpp.negation.argtypes = [ctypes.c_void_p] mcpp.negation.restype = ctypes.c_void_p # fabs(MC Variable) mcpp.mc_abs.argtypes = [ctypes.c_void_p] mcpp.mc_abs.restype = ctypes.c_void_p # sin(MC Variable) mcpp.trigSin.argtypes = [ctypes.c_void_p] mcpp.trigSin.restype = ctypes.c_void_p # cos(MC Variable) mcpp.trigCos.argtypes = [ctypes.c_void_p] mcpp.trigCos.restype = ctypes.c_void_p # tan(MC Variable) mcpp.trigTan.argtypes = [ctypes.c_void_p] mcpp.trigTan.restype = ctypes.c_void_p # asin(MC Variable) mcpp.atrigSin.argtypes = [ctypes.c_void_p] mcpp.atrigSin.restype = ctypes.c_void_p # acos(MC Variable) mcpp.atrigCos.argtypes = [ctypes.c_void_p] mcpp.atrigCos.restype = ctypes.c_void_p # atan(MC Variable) mcpp.atrigTan.argtypes = [ctypes.c_void_p] mcpp.atrigTan.restype = ctypes.c_void_p # exp(MC Variable) mcpp.exponential.argtypes = [ctypes.c_void_p] mcpp.exponential.restype = ctypes.c_void_p # log(MC Variable) mcpp.logarithm.argtypes = [ctypes.c_void_p] mcpp.logarithm.restype = ctypes.c_void_p # Releases object from memory (prevent memory leaks) mcpp.release.argtypes = [ctypes.c_void_p] # Unary function exception wrapper mcpp.try_unary_fcn.argtypes = [ctypes.c_void_p, ctypes.c_void_p] mcpp.try_unary_fcn.restype = ctypes.c_void_p # Binary function exception wrapper mcpp.try_binary_fcn.argtypes = [ ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p ] mcpp.try_binary_fcn.restype = ctypes.c_void_p # Error message retrieval mcpp.get_last_exception_message.restype = ctypes.c_char_p return mcpp
def mcpp_available(): """True if the MC++ shared object file exists. False otherwise.""" return Library('mcppInterface').path() is not None