[mlpack-svn] r14228 - mlpack/branches/mlpack-1.x/src/mlpack/core/arma_extend
fastlab-svn at coffeetalk-1.cc.gatech.edu
fastlab-svn at coffeetalk-1.cc.gatech.edu
Fri Feb 8 15:20:50 EST 2013
Author: rcurtin
Date: 2013-02-08 15:20:50 -0500 (Fri, 08 Feb 2013)
New Revision: 14228
Added:
mlpack/branches/mlpack-1.x/src/mlpack/core/arma_extend/hdf5_misc.hpp
mlpack/branches/mlpack-1.x/src/mlpack/core/arma_extend/restrictors.hpp
Modified:
mlpack/branches/mlpack-1.x/src/mlpack/core/arma_extend/
mlpack/branches/mlpack-1.x/src/mlpack/core/arma_extend/CMakeLists.txt
mlpack/branches/mlpack-1.x/src/mlpack/core/arma_extend/arma_extend.hpp
mlpack/branches/mlpack-1.x/src/mlpack/core/arma_extend/promote_type.hpp
mlpack/branches/mlpack-1.x/src/mlpack/core/arma_extend/traits.hpp
mlpack/branches/mlpack-1.x/src/mlpack/core/arma_extend/typedef.hpp
Log:
Take Armadillo extensions from trunk so things work with Armadillo 3.6.2.
Property changes on: mlpack/branches/mlpack-1.x/src/mlpack/core/arma_extend
___________________________________________________________________
Added: svn:mergeinfo
+ /mlpack/trunk/src/mlpack/core/arma_extend:13981-14227
Modified: mlpack/branches/mlpack-1.x/src/mlpack/core/arma_extend/CMakeLists.txt
===================================================================
--- mlpack/branches/mlpack-1.x/src/mlpack/core/arma_extend/CMakeLists.txt 2013-02-08 20:19:35 UTC (rev 14227)
+++ mlpack/branches/mlpack-1.x/src/mlpack/core/arma_extend/CMakeLists.txt 2013-02-08 20:20:50 UTC (rev 14228)
@@ -5,9 +5,11 @@
fn_ccov.hpp
glue_ccov_meat.hpp
glue_ccov_proto.hpp
+ hdf5_misc.hpp
op_ccov_meat.hpp
op_ccov_proto.hpp
promote_type.hpp
+ restrictors.hpp
traits.hpp
typedef.hpp
)
Modified: mlpack/branches/mlpack-1.x/src/mlpack/core/arma_extend/arma_extend.hpp
===================================================================
--- mlpack/branches/mlpack-1.x/src/mlpack/core/arma_extend/arma_extend.hpp 2013-02-08 20:19:35 UTC (rev 14227)
+++ mlpack/branches/mlpack-1.x/src/mlpack/core/arma_extend/arma_extend.hpp 2013-02-08 20:20:50 UTC (rev 14228)
@@ -28,10 +28,12 @@
#endif
namespace arma {
- // u64
+ // u64/s64
#include "typedef.hpp"
#include "traits.hpp"
#include "promote_type.hpp"
+ #include "restrictors.hpp"
+ #include "hdf5_misc.hpp"
// ccov()
#include "op_ccov_proto.hpp"
Copied: mlpack/branches/mlpack-1.x/src/mlpack/core/arma_extend/hdf5_misc.hpp (from rev 14227, mlpack/trunk/src/mlpack/core/arma_extend/hdf5_misc.hpp)
===================================================================
--- mlpack/branches/mlpack-1.x/src/mlpack/core/arma_extend/hdf5_misc.hpp (rev 0)
+++ mlpack/branches/mlpack-1.x/src/mlpack/core/arma_extend/hdf5_misc.hpp 2013-02-08 20:20:50 UTC (rev 14228)
@@ -0,0 +1,23 @@
+// To hack in u64/s64 support to Armadillo when it is not compiled with
+// ARMA_64BIT_WORD.
+#if defined(ARMA_USE_HDF5)
+ #if !(defined(ARMA_64BIT_WORD) || defined(ARMA_USE_U64S64))
+ #if defined(ULLONG_MAX)
+ template<>
+ inline
+ hid_t
+ get_hdf5_type< long long >()
+ {
+ return H5Tcopy(H5T_NATIVE_LLONG);
+ }
+
+ template<>
+ inline
+ hid_t
+ get_hdf5_type< unsigned long long >()
+ {
+ return H5Tcopy(H5T_NATIVE_ULLONG);
+ }
+ #endif
+ #endif
+#endif
Modified: mlpack/branches/mlpack-1.x/src/mlpack/core/arma_extend/promote_type.hpp
===================================================================
--- mlpack/branches/mlpack-1.x/src/mlpack/core/arma_extend/promote_type.hpp 2013-02-08 20:19:35 UTC (rev 14227)
+++ mlpack/branches/mlpack-1.x/src/mlpack/core/arma_extend/promote_type.hpp 2013-02-08 20:20:50 UTC (rev 14228)
@@ -1,106 +1,50 @@
// Extra promote_type definitions until 64-bit index support is added to
-// Armadillo. The syntax was changed for 2.1.91, so we need to be careful about
-// how we do that.
-#if ((ARMA_VERSION_MAJOR > 2)) || \
- ((ARMA_VERSION_MAJOR == 2) && (ARMA_VERSION_MINOR > 1)) || \
- ((ARMA_VERSION_MAJOR == 2) && (ARMA_VERSION_MINOR == 1) && \
- (ARMA_VERSION_PATCH >= 91))
+// Armadillo. These aren't necessary on Armadillo > 3.6.1.
+#if (ARMA_VERSION_MAJOR < 3) || \
+ ((ARMA_VERSION_MAJOR == 3) && (ARMA_VERSION_MINOR < 6)) || \
+ ((ARMA_VERSION_MAJOR == 3) && (ARMA_VERSION_MINOR == 6) && \
+ (ARMA_VERSION_PATCH < 2))
+ #ifndef ARMA_64BIT_WORD
+ template<typename T> struct is_promotable<std::complex<T>, s64> : public is_promotable_ok { typedef std::complex<T> result; };
+ template<typename T> struct is_promotable<std::complex<T>, u64> : public is_promotable_ok { typedef std::complex<T> result; };
-// The new syntax changed the name of 'promote_type' to 'is_promotable'. We
-// have to update accordingly...
-#ifndef ARMA_64BIT_WORD
-template<typename T> struct is_promotable<std::complex<T>, s64> : public is_promotable_ok { typedef std::complex<T> result; };
-template<typename T> struct is_promotable<std::complex<T>, u64> : public is_promotable_ok { typedef std::complex<T> result; };
+ template<> struct is_promotable<double, s64> : public is_promotable_ok { typedef double result; };
+ template<> struct is_promotable<double, u64> : public is_promotable_ok { typedef double result; };
-template<> struct is_promotable<double, s64> : public is_promotable_ok { typedef double result; };
-template<> struct is_promotable<double, u64> : public is_promotable_ok { typedef double result; };
+ template<> struct is_promotable<float, s64> : public is_promotable_ok { typedef float result; };
+ template<> struct is_promotable<float, u64> : public is_promotable_ok { typedef float result; };
-template<> struct is_promotable<float, s64> : public is_promotable_ok { typedef float result; };
-template<> struct is_promotable<float, u64> : public is_promotable_ok { typedef float result; };
+ template<> struct is_promotable<s64, u64> : public is_promotable_ok { typedef s64 result; };
+ template<> struct is_promotable<s64, s32> : public is_promotable_ok { typedef s64 result; };
+ template<> struct is_promotable<s64, u32> : public is_promotable_ok { typedef s64 result; }; // float ?
+ template<> struct is_promotable<s64, s16> : public is_promotable_ok { typedef s64 result; };
+ template<> struct is_promotable<s64, u16> : public is_promotable_ok { typedef s64 result; };
+ template<> struct is_promotable<s64, s8 > : public is_promotable_ok { typedef s64 result; };
+ template<> struct is_promotable<s64, u8 > : public is_promotable_ok { typedef s64 result; };
-template<> struct is_promotable<s64, u64> : public is_promotable_ok { typedef s64 result; };
-template<> struct is_promotable<s64, s32> : public is_promotable_ok { typedef s64 result; };
-template<> struct is_promotable<s64, u32> : public is_promotable_ok { typedef s64 result; }; // float ?
-template<> struct is_promotable<s64, s16> : public is_promotable_ok { typedef s64 result; };
-template<> struct is_promotable<s64, u16> : public is_promotable_ok { typedef s64 result; };
-template<> struct is_promotable<s64, s8 > : public is_promotable_ok { typedef s64 result; };
-template<> struct is_promotable<s64, u8 > : public is_promotable_ok { typedef s64 result; };
+ template<> struct is_promotable<u64, u32> : public is_promotable_ok { typedef u64 result; };
+ template<> struct is_promotable<u64, u16> : public is_promotable_ok { typedef u64 result; };
+ template<> struct is_promotable<u64, u8 > : public is_promotable_ok { typedef u64 result; };
-template<> struct is_promotable<u64, u32> : public is_promotable_ok { typedef u64 result; };
-template<> struct is_promotable<u64, u16> : public is_promotable_ok { typedef u64 result; };
-template<> struct is_promotable<u64, u8 > : public is_promotable_ok { typedef u64 result; };
+ template<typename T> struct is_promotable<s64, std::complex<T> > : public is_promotable_ok { typedef std::complex<T> result; };
+ template<typename T> struct is_promotable<u64, std::complex<T> > : public is_promotable_ok { typedef std::complex<T> result; };
-template<typename T> struct is_promotable<s64, std::complex<T> > : public is_promotable_ok { typedef std::complex<T> result; };
-template<typename T> struct is_promotable<u64, std::complex<T> > : public is_promotable_ok { typedef std::complex<T> result; };
+ template<> struct is_promotable<s64, double> : public is_promotable_ok { typedef double result; };
+ template<> struct is_promotable<u64, double> : public is_promotable_ok { typedef double result; };
-template<> struct is_promotable<s64, double> : public is_promotable_ok { typedef double result; };
-template<> struct is_promotable<u64, double> : public is_promotable_ok { typedef double result; };
+ template<> struct is_promotable<s64, float> : public is_promotable_ok { typedef float result; };
+ template<> struct is_promotable<u64, float> : public is_promotable_ok { typedef float result; };
-template<> struct is_promotable<s64, float> : public is_promotable_ok { typedef float result; };
-template<> struct is_promotable<u64, float> : public is_promotable_ok { typedef float result; };
+ template<> struct is_promotable<u64, s64> : public is_promotable_ok { typedef s64 result; }; // float ?
-template<> struct is_promotable<u64, s64> : public is_promotable_ok { typedef s64 result; }; // float ?
+ template<> struct is_promotable<u32, s64> : public is_promotable_ok { typedef s64 result; }; // float ?
+ template<> struct is_promotable<s16, s64> : public is_promotable_ok { typedef s64 result; };
+ template<> struct is_promotable<u16, s64> : public is_promotable_ok { typedef s64 result; };
+ template<> struct is_promotable<s8 , s64> : public is_promotable_ok { typedef s64 result; };
+ template<> struct is_promotable<u8 , s64> : public is_promotable_ok { typedef s64 result; };
-template<> struct is_promotable<u32, s64> : public is_promotable_ok { typedef s64 result; }; // float ?
-template<> struct is_promotable<s16, s64> : public is_promotable_ok { typedef s64 result; };
-template<> struct is_promotable<u16, s64> : public is_promotable_ok { typedef s64 result; };
-template<> struct is_promotable<s8 , s64> : public is_promotable_ok { typedef s64 result; };
-template<> struct is_promotable<u8 , s64> : public is_promotable_ok { typedef s64 result; };
-
-template<> struct is_promotable<u32, u64> : public is_promotable_ok { typedef u64 result; };
-template<> struct is_promotable<u16, u64> : public is_promotable_ok { typedef u64 result; };
-template<> struct is_promotable<u8 , u64> : public is_promotable_ok { typedef u64 result; };
+ template<> struct is_promotable<u32, u64> : public is_promotable_ok { typedef u64 result; };
+ template<> struct is_promotable<u16, u64> : public is_promotable_ok { typedef u64 result; };
+ template<> struct is_promotable<u8 , u64> : public is_promotable_ok { typedef u64 result; };
+ #endif
#endif
-
-#else
-// The old syntax used the 'promote_type' struct. We just define all of these
-// for u64 and s64.
-template<typename T> struct promote_type<std::complex<T>, s64> : public promote_type_ok { typedef std::complex<T> result; };
-template<typename T> struct promote_type<std::complex<T>, u64> : public promote_type_ok { typedef std::complex<T> result; };
-
-template<> struct promote_type<double, s64 > : public promote_type_ok { typedef double result; };
-template<> struct promote_type<double, u64 > : public promote_type_ok { typedef double result; };
-
-template<> struct promote_type<float, s64> : public promote_type_ok { typedef float result; };
-template<> struct promote_type<float, u64> : public promote_type_ok { typedef float result; };
-
-template<> struct promote_type<s64, u64> : public promote_type_ok { typedef s64 result; };
-template<> struct promote_type<s64, s32> : public promote_type_ok { typedef s64 result; };
-template<> struct promote_type<s64, u32> : public promote_type_ok { typedef s64 result; }; // float ?
-template<> struct promote_type<s64, s16> : public promote_type_ok { typedef s64 result; };
-template<> struct promote_type<s64, u16> : public promote_type_ok { typedef s64 result; };
-template<> struct promote_type<s64, s8 > : public promote_type_ok { typedef s64 result; };
-template<> struct promote_type<s64, u8 > : public promote_type_ok { typedef s64 result; };
-
-template<> struct promote_type<u64, s32> : public promote_type_ok { typedef s64 result; }; // float ?
-template<> struct promote_type<u64, u32> : public promote_type_ok { typedef u64 result; };
-template<> struct promote_type<u64, s16> : public promote_type_ok { typedef s64 result; }; // float ?
-template<> struct promote_type<u64, u16> : public promote_type_ok { typedef u64 result; };
-template<> struct promote_type<u64, s8 > : public promote_type_ok { typedef s64 result; }; // float ?
-template<> struct promote_type<u64, u8 > : public promote_type_ok { typedef u64 result; };
-
-template<typename T> struct promote_type<s64, std::complex<T> > : public promote_type_ok { typedef std::complex<T> result; };
-template<typename T> struct promote_type<u64, std::complex<T> > : public promote_type_ok { typedef std::complex<T> result; };
-
-template<> struct promote_type<s64 , double> : public promote_type_ok { typedef double result; };
-template<> struct promote_type<u64 , double> : public promote_type_ok { typedef double result; };
-
-template<> struct promote_type<s64, float> : public promote_type_ok { typedef float result; };
-template<> struct promote_type<u64, float> : public promote_type_ok { typedef float result; };
-
-template<> struct promote_type<u64, s64> : public promote_type_ok { typedef s64 result; }; // float ?
-template<> struct promote_type<s32, s64> : public promote_type_ok { typedef s64 result; };
-template<> struct promote_type<u32, s64> : public promote_type_ok { typedef s64 result; }; // float ?
-template<> struct promote_type<s16, s64> : public promote_type_ok { typedef s64 result; };
-template<> struct promote_type<u16, s64> : public promote_type_ok { typedef s64 result; };
-template<> struct promote_type<s8 , s64> : public promote_type_ok { typedef s64 result; };
-template<> struct promote_type<u8 , s64> : public promote_type_ok { typedef s64 result; };
-
-template<> struct promote_type<s32, u64> : public promote_type_ok { typedef s64 result; }; // float ?
-template<> struct promote_type<u32, u64> : public promote_type_ok { typedef u64 result; };
-template<> struct promote_type<s16, u64> : public promote_type_ok { typedef s64 result; }; // float ?
-template<> struct promote_type<u16, u64> : public promote_type_ok { typedef u64 result; };
-template<> struct promote_type<s8 , u64> : public promote_type_ok { typedef s64 result; }; // float ?
-template<> struct promote_type<u8 , u64> : public promote_type_ok { typedef u64 result; };
-
-#endif
Copied: mlpack/branches/mlpack-1.x/src/mlpack/core/arma_extend/restrictors.hpp (from rev 14227, mlpack/trunk/src/mlpack/core/arma_extend/restrictors.hpp)
===================================================================
--- mlpack/branches/mlpack-1.x/src/mlpack/core/arma_extend/restrictors.hpp (rev 0)
+++ mlpack/branches/mlpack-1.x/src/mlpack/core/arma_extend/restrictors.hpp 2013-02-08 20:20:50 UTC (rev 14228)
@@ -0,0 +1,22 @@
+// Modifications to allow u64/s64 in Armadillo when ARMA_64BIT_WORD is not
+// defined. Only required on Armadillo < 3.6.2.
+#if (ARMA_VERSION_MAJOR < 3) || \
+ ((ARMA_VERSION_MAJOR == 3) && (ARMA_VERSION_MINOR < 6)) || \
+ ((ARMA_VERSION_MAJOR == 3) && (ARMA_VERSION_MINOR == 6) && \
+ (ARMA_VERSION_PATCH < 2))
+ #ifndef ARMA_64BIT_WORD
+
+ template<> struct arma_scalar_only<u64> { typedef u64 result; };
+ template<> struct arma_scalar_only<s64> { typedef s64 result; };
+
+ template<> struct arma_integral_only<u64> { typedef u64 result; };
+ template<> struct arma_integral_only<s64> { typedef s64 result; };
+
+ template<> struct arma_unsigned_integral_only<u64> { typedef u64 result; };
+
+ template<> struct arma_signed_integral_only<s64> { typedef s64 result; };
+
+ template<> struct arma_signed_only<s64> { typedef s64 result; };
+
+ #endif
+#endif
Modified: mlpack/branches/mlpack-1.x/src/mlpack/core/arma_extend/traits.hpp
===================================================================
--- mlpack/branches/mlpack-1.x/src/mlpack/core/arma_extend/traits.hpp 2013-02-08 20:19:35 UTC (rev 14227)
+++ mlpack/branches/mlpack-1.x/src/mlpack/core/arma_extend/traits.hpp 2013-02-08 20:20:50 UTC (rev 14228)
@@ -1,31 +1,49 @@
-// Extra traits to support u64 and s64 until that patch is applied to the
-// Armadillo sources.
+// Extra traits to support u64 and s64 (or, specifically, unsigned long and
+// long) until that is applied to the Armadillo sources.
-#if ARMA_VERSION_MAJOR < 1 || \
- (ARMA_VERSION_MAJOR == 1 && ARMA_VERSION_MINOR <= 2)
-// For old Armadillo versions ( <= 1.2.0 ), all we have to do is define these
-// two structs which say these element types are supported.
-template<> struct isnt_supported_elem_type< u64 > : public isnt_supported_elem_type_false {};
-template<> struct isnt_supported_elem_type< s64 > : public isnt_supported_elem_type_false {};
+// This isn't necessary if Armadillo was compiled with 64-bit support, or if
+// ARMA_USE_U64S64 is enabled, or if Armadillo >= 3.6.2 is used (by default
+// Armadillo 3.6.2 allows long types).
+#if (ARMA_VERSION_MAJOR < 3) || \
+ ((ARMA_VERSION_MAJOR == 3) && (ARMA_VERSION_MINOR < 6)) || \
+ ((ARMA_VERSION_MAJOR == 3) && (ARMA_VERSION_MINOR == 6) && \
+ (ARMA_VERSION_PATCH < 2))
+ #if !(defined(ARMA_64BIT_WORD) || defined(ARMA_USE_U64S64))
+ template<typename T1>
+ struct is_u64
+ { static const bool value = false; };
-#else
-// For new Armadillo versions ( > 1.2.0 ) we have to get a little bit more
-// tricky. We will overload the values for the is_supported_elem_type
-// structure, allowing us to redefine it to report success for u64s and s64s.
+ template<>
+ struct is_u64<u64>
+ { static const bool value = true; };
-// This isn't necessary if Armadillo was compiled with 64-bit support.
-#ifndef ARMA_64BIT_WORD
-template<>
-struct is_supported_elem_type<u64>
- {
- static const bool value = true;
- };
-template<>
-struct is_supported_elem_type<s64>
- {
- static const bool value = true;
- };
-#endif
+ template<typename T1>
+ struct is_s64
+ { static const bool value = false; };
+ template<>
+ struct is_s64<s64>
+ { static const bool value = true; };
+
+ template<>
+ struct is_supported_elem_type<u64>
+ {
+ static const bool value = true;
+ };
+
+ template<>
+ struct is_supported_elem_type<s64>
+ {
+ static const bool value = true;
+ };
+
+
+ template<>
+ struct is_signed<u64>
+ {
+ static const bool value = false;
+ };
+
+ #endif
#endif
Modified: mlpack/branches/mlpack-1.x/src/mlpack/core/arma_extend/typedef.hpp
===================================================================
--- mlpack/branches/mlpack-1.x/src/mlpack/core/arma_extend/typedef.hpp 2013-02-08 20:19:35 UTC (rev 14227)
+++ mlpack/branches/mlpack-1.x/src/mlpack/core/arma_extend/typedef.hpp 2013-02-08 20:20:50 UTC (rev 14228)
@@ -1,69 +1,30 @@
// Extensions to typedef u64 and s64 until that support is added into
-// Armadillo. We only need to typedef s64 on Armadillo > 1.2.0.
-
-#if ((ARMA_VERSION_MAJOR > 1)) || \
- ((ARMA_VERSION_MAJOR == 1) && (ARMA_VERSION_MINOR > 2)) || \
- ((ARMA_VERSION_MAJOR == 1) && (ARMA_VERSION_MINOR == 2) && \
- (ARMA_VERSION_PATCH > 0))
-#ifndef ARMA_64BIT_WORD
- // An unincluded header file typedefs u64 for us.
- template<const bool size_t_is_greater_or_equal_to_8_bytes>
- struct deduce_u64
- {
- };
-
- template<>
- struct deduce_u64<true>
- {
- typedef std::size_t u64;
-
- static const u64 max = (sizeof(u64) >= 8) ? 0xFFFFFFFFFFFFFFFF : 0xFFFFFFFF; // check required for silly compilers
- static const bool trunc = false;
- };
-
- template<>
- struct deduce_u64<false>
- {
- #if (ULONG_MAX >= 0xFFFFFFFFFFFFFFFF)
+// Armadillo. We only need to typedef s64 on Armadillo > 1.2.0. This is not
+// necessary for Armadillo > 3.6.1.
+#if (ARMA_VERSION_MAJOR < 3) || \
+ ((ARMA_VERSION_MAJOR == 3) && (ARMA_VERSION_MINOR < 6)) || \
+ ((ARMA_VERSION_MAJOR == 3) && (ARMA_VERSION_MINOR == 6) && \
+ (ARMA_VERSION_PATCH < 2))
+ #ifndef ARMA_64BIT_WORD
+ // We must typedef both u64 and s64.
+ #if ULONG_MAX >= 0xffffffffffffffff
typedef unsigned long u64;
- static const u64 max = 0xFFFFFFFFFFFFFFFF;
- static const bool trunc = false;
- #elif defined(ULLONG_MAX)
+ typedef long s64;
+ #elif ULLONG_MAX >= 0xffffffffffffffff
typedef unsigned long long u64;
- static const u64 max = 0xFFFFFFFFFFFFFFFF;
- static const bool trunc = false;
- #elif (_MSC_VER >= 1200)
- //#elif (_MSC_VER >= 1310) && defined(_MSC_EXTENSIONS)
- typedef unsigned __int64 u64;
- static const u64 max = 0xFFFFFFFFFFFFFFFF;
- static const bool trunc = false;
+ typedef long long s64;
#else
#error "don't know how to typedef 'u64' on this system"
#endif
- };
- typedef deduce_u64<(sizeof(std::size_t) >= 8)>::u64 u64;
-#endif
+ namespace junk
+ {
+ struct arma_64_elem_size_test
+ {
+ arma_static_check( (sizeof(u64) != 8), ERROR___TYPE_U64_HAS_UNSUPPORTED_SIZE );
+ arma_static_check( (sizeof(s64) != 8), ERROR___TYPE_S64_HAS_UNSUPPORTED_SIZE );
+ };
+ }
- // We only need to typedef s64.
- #if ULONG_MAX >= 0xffffffffffffffff
- typedef long s64;
- #elif ULLONG_MAX >= 0xffffffffffffffff
- typedef long s64;
- #else
- #error "don't know how to typedef 's64' on this system"
#endif
-#else
-
- // We must typedef both u64 and s64.
- #if ULONG_MAX >= 0xffffffffffffffff
- typedef unsigned long u64;
- typedef long s64;
- #elif ULLONG_MAX >= 0xffffffffffffffff
- typedef unsigned long long u64;
- typedef long long s64;
- #else
- #error "don't know how to typedef 'u64' on this system"
- #endif
-
#endif
More information about the mlpack-svn
mailing list