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