ADMB Documentation  11.1.2501
 All Classes Files Functions Variables Typedefs Friends Defines
multiindex.cpp
Go to the documentation of this file.
00001 /*
00002  * $Id: multiindex.cpp 1919 2014-04-22 22:02:01Z johnoel $
00003  *
00004  * Author: David Fournier
00005  * Copyright (c) 2008-2012 Regents of the University of California
00006  */
00011 #include <fvar.hpp>
00012  //   class multi_index
00013  //   {
00014  //     int mind;
00015  //     int maxd;
00016  //     int depth;
00017  //     ivector index;
00018  //   public:
00019  //     multi_index(int min,int max,int dim);
00020  //     ivector& operator () (void) {return index;}
00021  //     void operator ++ (void);
00022  //     int get_depth(void) { return depth;}
00023  //   };
00024  //
00025 
00030   multi_index::multi_index(int min,int max,int dim) :
00031     mind(min),maxd(max),depth(min), index(1, dim)
00032   {
00033     index=min;
00034   }
00035   void multi_index::operator ++ (void)
00036   {
00037     int imin=index.indexmin();
00038     int imax=index.indexmax();
00039     index(imin)++;
00040     int tmpdepth=1;
00041     for (int i=imin;i<=imax;i++)
00042     {
00043       if (index(i)>maxd)
00044       {
00045         if (i<imax)
00046         {
00047           index(i+1)++;
00048         }
00049         index(i)=mind;
00050         tmpdepth=i+1;
00051       }
00052       else
00053       {
00054         break;
00055       }
00056     }
00057     if (tmpdepth>depth)
00058       depth =tmpdepth;
00059   }
00060   int multi_index::get_offset(void)
00061   {
00062     int imin=index.indexmin();
00063     int imax=index.indexmax();
00064     int offset=index(imin)-mind;
00065     int mx=min(depth,imax);
00066     int sz=maxd-mind+1;
00067     for (int i=imin+1;i<=mx;i++)
00068     {
00069 #if (defined(_MSC_VER) && (_MSC_VER >= 1400)) || defined(__SUNPRO_CC)
00070       offset+=int(pow(double(sz),i-imin))*(index(i)-mind);
00071 #else
00072       offset+=pow(sz,i-imin)*(index(i)-mind);
00073 #endif
00074     }
00075     return offset;
00076   }
00077 
00082   void multi_index::initialize(void)
00083   {
00084     index=mind;
00085     depth=mind;
00086   }
00087 
00088  //
00089  //   void main()
00090  //   {
00091  //     multi_index mi(1,3,4);
00092  //
00093  //     mi()=3;
00094  //     do
00095  //     {
00096  //       cout << mi() << "   " << mi.get_depth() << endl;
00097  //       ++mi;
00098  //     }
00099  //     while(mi.get_depth()<5);
00100  //   }
00101  //