get_julia_type.hpp
Go to the documentation of this file.
1 
7 #ifndef MLPACK_BINDINGS_JULIA_GET_JULIA_TYPE_HPP
8 #define MLPACK_BINDINGS_JULIA_GET_JULIA_TYPE_HPP
9 
10 #include <mlpack/prereqs.hpp>
11 
12 namespace mlpack {
13 namespace bindings {
14 namespace julia {
15 
16 template<typename T>
17 inline std::string GetJuliaType(
18  const typename std::enable_if<!util::IsStdVector<T>::value>::type* = 0,
19  const typename std::enable_if<!arma::is_arma_type<T>::value>::type* = 0,
20  const typename std::enable_if<!std::is_same<T,
21  std::tuple<data::DatasetInfo, arma::mat>>::value>::type* = 0,
22  const typename std::enable_if<!data::HasSerialize<T>::value>::type* = 0)
23 {
24  return "unknown_"; // This will cause an error most likely...
25 }
26 
27 template<>
28 inline std::string GetJuliaType<bool>(
29  const typename std::enable_if<!util::IsStdVector<bool>::value>::type*,
30  const typename std::enable_if<!arma::is_arma_type<bool>::value>::type*,
31  const typename std::enable_if<!std::is_same<bool,
32  std::tuple<data::DatasetInfo, arma::mat>>::value>::type*,
33  const typename std::enable_if<!data::HasSerialize<bool>::value>::type*)
34 {
35  return "Bool";
36 }
37 
38 template<>
39 inline std::string GetJuliaType<int>(
40  const typename std::enable_if<!util::IsStdVector<int>::value>::type*,
41  const typename std::enable_if<!arma::is_arma_type<int>::value>::type*,
42  const typename std::enable_if<!std::is_same<int,
43  std::tuple<data::DatasetInfo, arma::mat>>::value>::type*,
44  const typename std::enable_if<!data::HasSerialize<int>::value>::type*)
45 {
46  return "Int";
47 }
48 
49 template<>
50 inline std::string GetJuliaType<size_t>(
51  const typename std::enable_if<!util::IsStdVector<size_t>::value>::type*,
52  const typename std::enable_if<!arma::is_arma_type<size_t>::value>::type*,
53  const typename std::enable_if<!std::is_same<size_t,
54  std::tuple<data::DatasetInfo, arma::mat>>::value>::type*,
55  const typename std::enable_if<!data::HasSerialize<size_t>::value>::type*)
56 {
57  return "UInt";
58 }
59 
60 template<>
61 inline std::string GetJuliaType<double>(
62  const typename std::enable_if<!util::IsStdVector<double>::value>::type*,
63  const typename std::enable_if<!arma::is_arma_type<double>::value>::type*,
64  const typename std::enable_if<!std::is_same<double,
65  std::tuple<data::DatasetInfo, arma::mat>>::value>::type*,
66  const typename std::enable_if<!data::HasSerialize<double>::value>::type*)
67 {
68  // I suppose on some systems this may not be 64 bit.
69  return "Float64";
70 }
71 
72 template<>
73 inline std::string GetJuliaType<std::string>(
74  const typename std::enable_if<
76  const typename std::enable_if<
77  !arma::is_arma_type<std::string>::value>::type*,
78  const typename std::enable_if<!std::is_same<std::string,
79  std::tuple<data::DatasetInfo, arma::mat>>::value>::type*,
80  const typename std::enable_if<
82 {
83  return "String";
84 }
85 
86 template<typename T>
87 inline std::string GetJuliaType(
88  const typename std::enable_if<util::IsStdVector<T>::value>::type* = 0,
89  const typename std::enable_if<!std::is_same<T,
90  std::tuple<data::DatasetInfo, arma::mat>>::value>::type* = 0,
91  const typename std::enable_if<!arma::is_arma_type<T>::value>::type* = 0)
92 {
93  return "Vector{" + GetJuliaType<typename T::value_type>() + "}";
94 }
95 
96 template<typename T>
97 inline std::string GetJuliaType(
98  const typename std::enable_if<!util::IsStdVector<T>::value>::type* = 0,
99  const typename std::enable_if<!std::is_same<T,
100  std::tuple<data::DatasetInfo, arma::mat>>::value>::type* = 0,
101  const typename std::enable_if<arma::is_arma_type<T>::value>::type* = 0)
102 {
103  // size_t matrices are special: we want to represent them in Julia as
104  // Array{Int64, X} not UInt64 because Julia displays UInt64s strangely.
105  if (std::is_same<typename T::elem_type, size_t>::value)
106  return std::string("Array{Int64, ") + (T::is_col || T::is_row ? "1" : "2")
107  + "}";
108  else
109  return "Array{" + GetJuliaType<typename T::elem_type>() + ", "
110  + (T::is_col || T::is_row ? "1" : "2") + "}";
111 }
112 
113 template<typename T>
114 inline std::string GetJuliaType(
115  const typename std::enable_if<std::is_same<T,
116  std::tuple<data::DatasetInfo, arma::mat>>::value>::type* = 0)
117 {
118  return "Tuple{Array{Bool, 1}, Array{Float64, 2}}";
119 }
120 
121 // for serializable types
122 template<typename T>
123 inline std::string GetJuliaType(
124  const typename std::enable_if<!util::IsStdVector<T>::value>::type* = 0,
125  const typename std::enable_if<!arma::is_arma_type<T>::value>::type* = 0,
126  const typename std::enable_if<data::HasSerialize<T>::value>::type* = 0)
127 {
128  // Serializable types are just held as a pointer to nothing...
129  return "Ptr{Nothing}";
130 }
131 
132 } // namespace julia
133 } // namespace bindings
134 } // namespace mlpack
135 
136 #endif
std::string GetJuliaType< bool >(const typename std::enable_if<!util::IsStdVector< bool >::value >::type *, const typename std::enable_if<!arma::is_arma_type< bool >::value >::type *, const typename std::enable_if<!std::is_same< bool, std::tuple< data::DatasetInfo, arma::mat >>::value >::type *, const typename std::enable_if<!data::HasSerialize< bool >::value >::type *)
strip_type.hpp
Definition: add_to_po.hpp:21
std::string GetJuliaType< int >(const typename std::enable_if<!util::IsStdVector< int >::value >::type *, const typename std::enable_if<!arma::is_arma_type< int >::value >::type *, const typename std::enable_if<!std::is_same< int, std::tuple< data::DatasetInfo, arma::mat >>::value >::type *, const typename std::enable_if<!data::HasSerialize< int >::value >::type *)
The core includes that mlpack expects; standard C++ includes and Armadillo.
std::string GetJuliaType< double >(const typename std::enable_if<!util::IsStdVector< double >::value >::type *, const typename std::enable_if<!arma::is_arma_type< double >::value >::type *, const typename std::enable_if<!std::is_same< double, std::tuple< data::DatasetInfo, arma::mat >>::value >::type *, const typename std::enable_if<!data::HasSerialize< double >::value >::type *)
Metaprogramming structure for vector detection.
std::string GetJuliaType< size_t >(const typename std::enable_if<!util::IsStdVector< size_t >::value >::type *, const typename std::enable_if<!arma::is_arma_type< size_t >::value >::type *, const typename std::enable_if<!std::is_same< size_t, std::tuple< data::DatasetInfo, arma::mat >>::value >::type *, const typename std::enable_if<!data::HasSerialize< size_t >::value >::type *)
std::string GetJuliaType(const typename std::enable_if<!util::IsStdVector< T >::value >::type *=0, const typename std::enable_if<!arma::is_arma_type< T >::value >::type *=0, const typename std::enable_if<!std::is_same< T, std::tuple< data::DatasetInfo, arma::mat >>::value >::type *=0, const typename std::enable_if<!data::HasSerialize< T >::value >::type *=0)