// Copyright (C) 2009 NICTA
// 
// Authors:
// - Conrad Sanderson (conradsand at ieee dot org)
// 
// This file is part of the Armadillo C++ library.
// It is provided without any warranty of fitness
// for any purpose. You can redistribute this file
// and/or modify it under the terms of the GNU
// Lesser General Public License (LGPL) as published
// by the Free Software Foundation, either version 3
// of the License or (at your option) any later version.
// (see http://www.opensource.org/licenses for more info)


#ifndef ARMA_INCLUDES
#define ARMA_INCLUDES


#define arma_hot
#define arma_pure
#define arma_const
#define arma_inline   inline
#define arma_aligned


#if defined(__GNUG__)

  #if (__GNUC__ < 4)
    #error "*** Need a newer compiler ***"
  #endif
  
  #if (__GNUC_MINOR__ >= 3)
    #undef  arma_hot
    #define arma_hot __attribute__((hot))
  #endif

  #undef  arma_pure
  #undef  arma_const
  #undef  arma_inline
  #undef  arma_aligned

  #define arma_pure           __attribute__((pure))
  #define arma_const          __attribute__((const))
  #define arma_inline  inline __attribute__((always_inline))
  #define arma_aligned        __attribute__((aligned))
  
  #define ARMA_GOOD_COMPILER
  
#elif defined(__INTEL_COMPILER)
  
  #if (__INTEL_COMPILER < 1000)
    #error "*** Need a newer compiler ***"
  #endif
  
  #define ARMA_GOOD_COMPILER
  
#elif defined(_MSC_VER)
  
  #pragma message ("*** WARNING: This compiler may have an incomplete implementation of the C++ standard ***")
  #undef ARMA_GOOD_COMPILER

#endif





#include "armadillo_bits/config.hpp"

#include <cstdlib>
#include <cstring>
#include <climits>
#include <cmath>

#include <iostream>
#include <fstream>
#include <sstream>
#include <stdexcept>
#include <limits>
#include <algorithm>
#include <complex>
#include <vector>


#if defined(ARMA_HAVE_GETTIMEOFDAY)
  #include <sys/time.h>
#endif


#if defined(ARMA_USE_BOOST)
  #include <boost/format.hpp>
  #include <boost/current_function.hpp>
  #include <boost/math/complex.hpp>
  #include <boost/math/special_functions/acosh.hpp>
  #include <boost/math/special_functions/asinh.hpp>
  #include <boost/math/special_functions/atanh.hpp>
#endif


#if defined(ARMA_USE_BOOST_DATE)
  #include <boost/date_time/posix_time/posix_time.hpp>
#endif


#if defined(ARMA_USE_ATLAS)
  #define ARMA_TMP_STRING(x) x

  #define ARMA_ATLAS_INCLUDE_1 <ARMA_TMP_STRING(ARMA_ATLAS_INCLUDE_DIR)/ARMA_TMP_STRING(cblas.h)>
  #define ARMA_ATLAS_INCLUDE_2 <ARMA_TMP_STRING(ARMA_ATLAS_INCLUDE_DIR)/ARMA_TMP_STRING(clapack.h)>
  
  extern "C"
    {
    #include ARMA_ATLAS_INCLUDE_1
    #include ARMA_ATLAS_INCLUDE_2
    }

  #undef ARMA_TMP_STRING
  #undef ARMA_ATLAS_INCLUDE_1
  #undef ARMA_ATLAS_INCLUDE_2
#endif


#include "armadillo_bits/itpp_wrap.hpp"


//! \namespace arma namespace for Armadillo classes and functions
namespace arma
  {
  
  // preliminaries
  
  #include "armadillo_bits/forward_proto.hpp"
  #include "armadillo_bits/static_assert.hpp"
  #include "armadillo_bits/typedef.hpp"
  #include "armadillo_bits/format_wrap.hpp"
  #include "armadillo_bits/cmath_wrap.hpp"
  #include "armadillo_bits/constants.hpp"
  #include "armadillo_bits/traits.hpp"
  #include "armadillo_bits/access.hpp"
  
  
  //
  // class prototypes
  
  #include "armadillo_bits/syslib_proto.hpp"
  #include "armadillo_bits/podarray_proto.hpp"
  
  #include "armadillo_bits/blas_proto.hpp"
  #include "armadillo_bits/lapack_proto.hpp"
  #include "armadillo_bits/atlas_proto.hpp"
  #include "armadillo_bits/auxlib_proto.hpp"
  
  #include "armadillo_bits/Base.hpp"
  #include "armadillo_bits/BaseCube.hpp"
  
  #include "armadillo_bits/Mat_proto.hpp"
  #include "armadillo_bits/Col_proto.hpp"
  #include "armadillo_bits/Row_proto.hpp"
  #include "armadillo_bits/Cube_proto.hpp"
  
  #include "armadillo_bits/field_proto.hpp"
  #include "armadillo_bits/subview_proto.hpp"
  #include "armadillo_bits/subview_field_proto.hpp"
  #include "armadillo_bits/subview_cube_proto.hpp"
  #include "armadillo_bits/diagview_proto.hpp"
  
  
  #include "armadillo_bits/diskio_proto.hpp"
  #include "armadillo_bits/wall_clock_proto.hpp"
  #include "armadillo_bits/running_stat_proto.hpp"
  #include "armadillo_bits/running_stat_vec_proto.hpp"
  
  #include "armadillo_bits/Op_proto.hpp"
  #include "armadillo_bits/OpCube_proto.hpp"
  #include "armadillo_bits/Glue_proto.hpp"
  #include "armadillo_bits/GlueCube_proto.hpp"
  
  #include "armadillo_bits/op_diagmat_proto.hpp"
  #include "armadillo_bits/op_dot_proto.hpp"
  #include "armadillo_bits/op_inv_proto.hpp"
  #include "armadillo_bits/op_htrans_proto.hpp"
  #include "armadillo_bits/op_misc_proto.hpp"
  #include "armadillo_bits/op_max_proto.hpp"
  #include "armadillo_bits/op_min_proto.hpp"
  #include "armadillo_bits/op_mean_proto.hpp"
  #include "armadillo_bits/op_median_proto.hpp"
  #include "armadillo_bits/op_neg_proto.hpp"
  #include "armadillo_bits/op_ones_proto.hpp"
  #include "armadillo_bits/op_rand_proto.hpp"
  #include "armadillo_bits/op_randn_proto.hpp"
  #include "armadillo_bits/op_scalar_misc_proto.hpp"
  #include "armadillo_bits/op_sort_proto.hpp"
  #include "armadillo_bits/op_sum_proto.hpp"
  #include "armadillo_bits/op_stddev_proto.hpp"
  #include "armadillo_bits/op_trig_proto.hpp"
  #include "armadillo_bits/op_trans_proto.hpp"
  #include "armadillo_bits/op_var_proto.hpp"
  #include "armadillo_bits/op_zeros_proto.hpp"
  #include "armadillo_bits/op_repmat_proto.hpp"
  #include "armadillo_bits/op_reshape_proto.hpp"
  #include "armadillo_bits/op_cov_proto.hpp"
  #include "armadillo_bits/op_cor_proto.hpp"
  #include "armadillo_bits/op_shuffle_proto.hpp"
  #include "armadillo_bits/op_prod_proto.hpp"
  #include "armadillo_bits/op_eps_proto.hpp"
  #include "armadillo_bits/op_pinv_proto.hpp"
  
  #include "armadillo_bits/glue_plus_proto.hpp"
  #include "armadillo_bits/glue_minus_proto.hpp"
  #include "armadillo_bits/glue_times_proto.hpp"
  #include "armadillo_bits/glue_schur_proto.hpp"
  #include "armadillo_bits/glue_div_proto.hpp"
  
  #include "armadillo_bits/glue_cov_proto.hpp"
  #include "armadillo_bits/glue_cor_proto.hpp"
  #include "armadillo_bits/glue_kron_proto.hpp"
  
  #include "armadillo_bits/glue_cube_plus_proto.hpp"
  #include "armadillo_bits/glue_cube_minus_proto.hpp"
  #include "armadillo_bits/glue_cube_schur_proto.hpp"
  #include "armadillo_bits/glue_cube_div_proto.hpp"
  
  
  //
  // debugging functions
  
  #include "armadillo_bits/debug.hpp"
  
  
  //
  // classes that underlay metaprogramming 
  
  #include "armadillo_bits/unwrap.hpp"
  #include "armadillo_bits/unwrap_cube.hpp"

  #include "armadillo_bits/Op_meat.hpp"
  #include "armadillo_bits/OpCube_meat.hpp"
  #include "armadillo_bits/Glue_meat.hpp"
  #include "armadillo_bits/GlueCube_meat.hpp"
  
  #include "armadillo_bits/glue_metaprog.hpp"
  #include "armadillo_bits/glue_cube_metaprog.hpp"
  
  
  //
  // ostream
  
  #include "armadillo_bits/arma_ostream_proto.hpp"
  #include "armadillo_bits/arma_ostream_meat.hpp"
  
  
  //
  // operators
  
  #include "armadillo_bits/operator_plus.hpp"
  #include "armadillo_bits/operator_minus.hpp"
  #include "armadillo_bits/operator_times.hpp"
  #include "armadillo_bits/operator_times_dot.hpp"
  #include "armadillo_bits/operator_schur.hpp"
  #include "armadillo_bits/operator_div.hpp"
  #include "armadillo_bits/operator_relational.hpp"
  
  #include "armadillo_bits/operator_cube_plus.hpp"
  #include "armadillo_bits/operator_cube_minus.hpp"
  #include "armadillo_bits/operator_cube_times.hpp"
  #include "armadillo_bits/operator_cube_schur.hpp"
  #include "armadillo_bits/operator_cube_div.hpp"
  #include "armadillo_bits/operator_cube_relational.hpp"
  
  #include "armadillo_bits/operator_ostream.hpp"
  
  
  //
  // user accessible functions
  
  // the order of the fn_*.hpp include files matters,
  // as some files require functionality given in preceding files
  
  #include "armadillo_bits/fn_conv_to.hpp"
  #include "armadillo_bits/fn_min.hpp"
  #include "armadillo_bits/fn_max.hpp"
  #include "armadillo_bits/fn_accu.hpp"
  #include "armadillo_bits/fn_sum.hpp"
  #include "armadillo_bits/fn_diagmat.hpp"
  #include "armadillo_bits/fn_inv.hpp"
  #include "armadillo_bits/fn_trace.hpp"
  #include "armadillo_bits/fn_trans.hpp"
  #include "armadillo_bits/fn_det.hpp"
  #include "armadillo_bits/fn_eig.hpp"
  #include "armadillo_bits/fn_lu.hpp"
  #include "armadillo_bits/fn_zeros.hpp"
  #include "armadillo_bits/fn_ones.hpp"
  #include "armadillo_bits/fn_misc.hpp"
  #include "armadillo_bits/fn_norm.hpp"
  #include "armadillo_bits/fn_dot.hpp"
  #include "armadillo_bits/fn_rand.hpp"
  #include "armadillo_bits/fn_randn.hpp"
  #include "armadillo_bits/fn_trig.hpp"
  #include "armadillo_bits/fn_mean.hpp"
  #include "armadillo_bits/fn_median.hpp"
  #include "armadillo_bits/fn_stddev.hpp"
  #include "armadillo_bits/fn_var.hpp"
  #include "armadillo_bits/fn_sort.hpp"
  #include "armadillo_bits/fn_sort_index.hpp"
  #include "armadillo_bits/fn_htrans.hpp"
  #include "armadillo_bits/fn_chol.hpp"
  #include "armadillo_bits/fn_qr.hpp"
  #include "armadillo_bits/fn_svd.hpp"
  #include "armadillo_bits/fn_solve.hpp"
  #include "armadillo_bits/fn_repmat.hpp"
  #include "armadillo_bits/fn_reshape.hpp"
  #include "armadillo_bits/fn_cov.hpp"
  #include "armadillo_bits/fn_cor.hpp"
  #include "armadillo_bits/fn_shuffle.hpp"
  #include "armadillo_bits/fn_prod.hpp"
  #include "armadillo_bits/fn_eps.hpp"
  #include "armadillo_bits/fn_pinv.hpp"
  #include "armadillo_bits/fn_rank.hpp"
  #include "armadillo_bits/fn_kron.hpp"
  
  //
  // class meat
  
  #include "armadillo_bits/gemm.hpp"
  #include "armadillo_bits/gemv.hpp"
  #include "armadillo_bits/gemm_mixed.hpp"
  
  #include "armadillo_bits/podarray_meat.hpp"
  #include "armadillo_bits/auxlib_meat.hpp"
  
  #include "armadillo_bits/Mat_meat.hpp"
  #include "armadillo_bits/Col_meat.hpp"
  #include "armadillo_bits/Row_meat.hpp"
  #include "armadillo_bits/Cube_meat.hpp"
  #include "armadillo_bits/field_meat.hpp"
  #include "armadillo_bits/subview_meat.hpp"
  #include "armadillo_bits/subview_field_meat.hpp"
  #include "armadillo_bits/subview_cube_meat.hpp"
  #include "armadillo_bits/diagview_meat.hpp"
  
  #include "armadillo_bits/diskio_meat.hpp"
  #include "armadillo_bits/wall_clock_meat.hpp"
  #include "armadillo_bits/running_stat_meat.hpp"
  #include "armadillo_bits/running_stat_vec_meat.hpp"
  
  #include "armadillo_bits/op_diagmat_meat.hpp"
  #include "armadillo_bits/op_dot_meat.hpp"
  #include "armadillo_bits/op_inv_meat.hpp"
  #include "armadillo_bits/op_htrans_meat.hpp"
  #include "armadillo_bits/op_misc_meat.hpp"
  #include "armadillo_bits/op_max_meat.hpp"
  #include "armadillo_bits/op_min_meat.hpp"
  #include "armadillo_bits/op_mean_meat.hpp"
  #include "armadillo_bits/op_median_meat.hpp"
  #include "armadillo_bits/op_neg_meat.hpp"
  #include "armadillo_bits/op_ones_meat.hpp"
  #include "armadillo_bits/op_rand_meat.hpp"
  #include "armadillo_bits/op_randn_meat.hpp"
  #include "armadillo_bits/op_scalar_misc_meat.hpp"
  #include "armadillo_bits/op_sort_meat.hpp"
  #include "armadillo_bits/op_sum_meat.hpp"
  #include "armadillo_bits/op_stddev_meat.hpp"
  #include "armadillo_bits/op_trans_meat.hpp"
  #include "armadillo_bits/op_trig_meat.hpp"
  #include "armadillo_bits/op_var_meat.hpp"
  #include "armadillo_bits/op_zeros_meat.hpp"
  #include "armadillo_bits/op_repmat_meat.hpp"
  #include "armadillo_bits/op_reshape_meat.hpp"
  #include "armadillo_bits/op_cov_meat.hpp"
  #include "armadillo_bits/op_cor_meat.hpp"
  #include "armadillo_bits/op_shuffle_meat.hpp"
  #include "armadillo_bits/op_prod_meat.hpp"
  #include "armadillo_bits/op_eps_meat.hpp"
  #include "armadillo_bits/op_pinv_meat.hpp"
  
  #include "armadillo_bits/glue_plus_meat.hpp"
  #include "armadillo_bits/glue_minus_meat.hpp"
  #include "armadillo_bits/glue_times_meat.hpp"
  #include "armadillo_bits/glue_schur_meat.hpp"
  #include "armadillo_bits/glue_div_meat.hpp"
  
  #include "armadillo_bits/glue_cov_meat.hpp"
  #include "armadillo_bits/glue_cor_meat.hpp"
  #include "armadillo_bits/glue_kron_meat.hpp"
  
  #include "armadillo_bits/glue_cube_plus_meat.hpp"
  #include "armadillo_bits/glue_cube_minus_meat.hpp"
  #include "armadillo_bits/glue_cube_schur_meat.hpp"
  #include "armadillo_bits/glue_cube_div_meat.hpp"
  }
  
#endif

