Skip to content

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"
Clone this wiki locally