functor (F : Cstubs.FOREIGN) ->
  sig
    module Dense_real :
      sig
        val mat_struct :
          Owl_types.Dense_real.mat_struct Ctypes.structure Ctypes.typ
        val vec_struct :
          Owl_types.Dense_real.vec_struct Ctypes.structure Ctypes.typ
        val gsl_vector_alloc :
          (Unsigned.size_t ->
           Owl_types.Dense_real.vec_struct Ctypes.structure Ctypes_static.ptr
           F.return)
          F.result
        val gsl_matrix_alloc :
          (Unsigned.size_t ->
           Unsigned.size_t ->
           Owl_types.Dense_real.mat_struct Ctypes.structure Ctypes_static.ptr
           F.return)
          F.result
        val gsl_matrix_get_col :
          (Owl_types.Dense_real.vec_struct Ctypes.structure Ctypes_static.ptr ->
           Owl_types.Dense_real.mat_struct Ctypes.structure Ctypes_static.ptr ->
           int -> int F.return)
          F.result
        val gsl_matrix_equal :
          (Owl_types.Dense_real.mat_struct Ctypes.structure Ctypes_static.ptr ->
           Owl_types.Dense_real.mat_struct Ctypes.structure Ctypes_static.ptr ->
           int F.return)
          F.result
        val gsl_matrix_isnull :
          (Owl_types.Dense_real.mat_struct Ctypes.structure Ctypes_static.ptr ->
           int F.return)
          F.result
        val gsl_matrix_ispos :
          (Owl_types.Dense_real.mat_struct Ctypes.structure Ctypes_static.ptr ->
           int F.return)
          F.result
        val gsl_matrix_isneg :
          (Owl_types.Dense_real.mat_struct Ctypes.structure Ctypes_static.ptr ->
           int F.return)
          F.result
        val gsl_matrix_isnonneg :
          (Owl_types.Dense_real.mat_struct Ctypes.structure Ctypes_static.ptr ->
           int F.return)
          F.result
        val gsl_matrix_min :
          (Owl_types.Dense_real.mat_struct Ctypes.structure Ctypes_static.ptr ->
           float F.return)
          F.result
        val gsl_matrix_min_index :
          (Owl_types.Dense_real.mat_struct Ctypes.structure Ctypes_static.ptr ->
           Unsigned.size_t Ctypes_static.ptr ->
           Unsigned.size_t Ctypes_static.ptr -> unit F.return)
          F.result
        val gsl_matrix_max :
          (Owl_types.Dense_real.mat_struct Ctypes.structure Ctypes_static.ptr ->
           float F.return)
          F.result
        val gsl_matrix_max_index :
          (Owl_types.Dense_real.mat_struct Ctypes.structure Ctypes_static.ptr ->
           Unsigned.size_t Ctypes_static.ptr ->
           Unsigned.size_t Ctypes_static.ptr -> unit F.return)
          F.result
      end
    module Dense_complex :
      sig
        val mat_struct :
          Owl_types.Dense_complex.mat_struct Ctypes.structure Ctypes.typ
        val vec_struct :
          Owl_types.Dense_complex.vec_struct Ctypes.structure Ctypes.typ
        val gsl_matrix_complex_equal :
          (Owl_types.Dense_complex.mat_struct Ctypes.structure
           Ctypes_static.ptr ->
           Owl_types.Dense_complex.mat_struct Ctypes.structure
           Ctypes_static.ptr -> int F.return)
          F.result
        val gsl_matrix_complex_isnull :
          (Owl_types.Dense_complex.mat_struct Ctypes.structure
           Ctypes_static.ptr -> int F.return)
          F.result
        val gsl_matrix_complex_ispos :
          (Owl_types.Dense_complex.mat_struct Ctypes.structure
           Ctypes_static.ptr -> int F.return)
          F.result
        val gsl_matrix_complex_isneg :
          (Owl_types.Dense_complex.mat_struct Ctypes.structure
           Ctypes_static.ptr -> int F.return)
          F.result
        val gsl_matrix_complex_isnonneg :
          (Owl_types.Dense_complex.mat_struct Ctypes.structure
           Ctypes_static.ptr -> int F.return)
          F.result
      end
    module Sparse_real :
      sig
        val spmat_struct :
          Owl_types.Sparse_real.spmat_struct Ctypes.structure Ctypes.typ
        val gsl_spmatrix_alloc :
          (int ->
           int ->
           Owl_types.Sparse_real.spmat_struct Ctypes.structure
           Ctypes_static.ptr F.return)
          F.result
        val gsl_spmatrix_alloc_nzmax :
          (int ->
           int ->
           int ->
           int ->
           Owl_types.Sparse_real.spmat_struct Ctypes.structure
           Ctypes_static.ptr F.return)
          F.result
        val gsl_spmatrix_set :
          (Owl_types.Sparse_real.spmat_struct Ctypes.structure
           Ctypes_static.ptr -> int -> int -> float -> int F.return)
          F.result
        val gsl_spmatrix_get :
          (Owl_types.Sparse_real.spmat_struct Ctypes.structure
           Ctypes_static.ptr -> int -> int -> float F.return)
          F.result
        val gsl_spmatrix_add :
          (Owl_types.Sparse_real.spmat_struct Ctypes.structure
           Ctypes_static.ptr ->
           Owl_types.Sparse_real.spmat_struct Ctypes.structure
           Ctypes_static.ptr ->
           Owl_types.Sparse_real.spmat_struct Ctypes.structure
           Ctypes_static.ptr -> int F.return)
          F.result
        val gsl_spmatrix_scale :
          (Owl_types.Sparse_real.spmat_struct Ctypes.structure
           Ctypes_static.ptr -> float -> int F.return)
          F.result
        val gsl_spmatrix_memcpy :
          (Owl_types.Sparse_real.spmat_struct Ctypes.structure
           Ctypes_static.ptr ->
           Owl_types.Sparse_real.spmat_struct Ctypes.structure
           Ctypes_static.ptr -> int F.return)
          F.result
        val gsl_spmatrix_compcol :
          (Owl_types.Sparse_real.spmat_struct Ctypes.structure
           Ctypes_static.ptr ->
           Owl_types.Sparse_real.spmat_struct Ctypes.structure
           Ctypes_static.ptr F.return)
          F.result
        val gsl_spmatrix_minmax :
          (Owl_types.Sparse_real.spmat_struct Ctypes.structure
           Ctypes_static.ptr ->
           float Ctypes_static.ptr -> float Ctypes_static.ptr -> int F.return)
          F.result
        val gsl_spmatrix_equal :
          (Owl_types.Sparse_real.spmat_struct Ctypes.structure
           Ctypes_static.ptr ->
           Owl_types.Sparse_real.spmat_struct Ctypes.structure
           Ctypes_static.ptr -> int F.return)
          F.result
        val gsl_spmatrix_transpose_memcpy :
          (Owl_types.Sparse_real.spmat_struct Ctypes.structure
           Ctypes_static.ptr ->
           Owl_types.Sparse_real.spmat_struct Ctypes.structure
           Ctypes_static.ptr -> int F.return)
          F.result
        val gsl_spmatrix_set_zero :
          (Owl_types.Sparse_real.spmat_struct Ctypes.structure
           Ctypes_static.ptr -> int F.return)
          F.result
        val gsl_spblas_dgemm :
          (float ->
           Owl_types.Sparse_real.spmat_struct Ctypes.structure
           Ctypes_static.ptr ->
           Owl_types.Sparse_real.spmat_struct Ctypes.structure
           Ctypes_static.ptr ->
           Owl_types.Sparse_real.spmat_struct Ctypes.structure
           Ctypes_static.ptr -> int F.return)
          F.result
        val gsl_spmatrix_d2sp :
          (Owl_types.Sparse_real.spmat_struct Ctypes.structure
           Ctypes_static.ptr ->
           Owl_types.Dense_real.mat_struct Ctypes.structure Ctypes_static.ptr ->
           int F.return)
          F.result
        val gsl_spmatrix_sp2d :
          (Owl_types.Dense_real.mat_struct Ctypes.structure Ctypes_static.ptr ->
           Owl_types.Sparse_real.spmat_struct Ctypes.structure
           Ctypes_static.ptr -> int F.return)
          F.result
      end
  end