-
Notifications
You must be signed in to change notification settings - Fork 20
Accessing Singular from Julia
malex984 edited this page Nov 13, 2014
·
26 revisions
using Cxx
const singdir = "/home/wbhart/singular-4/T/home/wbhart/singular-4/"
addHeaderDir(joinpath(singdir, "include"), kind = C_System)
addHeaderDir(joinpath(singdir, "include/singular"), kind = C_System)
cxxinclude("Singular/libsingular.h", isAngled=false)
dlopen(joinpath(singdir, "lib/libSingular.so"), RTLD_GLOBAL)
@cxx siInit(pointer(joinpath(singdir, "bin/Singular")))
Here is my idea to wrap Singular "pointed" types (all of low level types):
abstract SingularPointer
abstract SingularNumbers
type SingularQQ <: SingularNumbers end
type SingularZZ <: SingularNumbers end
const sizeofptr = sizeof(Ptr{Void}) * 8;
bitstype sizeofptr GenericSingularNumber{Coeffs <: SingularNumbers} <: SingularPointer
reinterpret(GenericSingularNumber{SingularZZ}, 666) # GenericSingularNumber{SingularZZ}(0x000000000000029a)
InitSingularNumber{Coeffs <: SingularNumbers}( ::Type{Coeffs}, i) = reinterpret(GenericSingularNumber{Coeffs}, i)
a = InitSingularNumber( SingularQQ, 2 ) # GenericSingularNumber{SingularQQ}(0x0000000000000002)
- Pros: we avoid one extra level of indirection (types in Julia are pointers to heap allocated things)
- Cons: we need to do "proper" initialization/cleanup "by hand"