00001 /* 00002 * $Id$ 00003 * 00004 * Author: David Fournier 00005 * Copyright (c) 2008-2012 Regents of the University of California 00006 */ 00011 #include <fvar.hpp> 00012 00017 multi_index::multi_index(int min,int max,int dim) : 00018 mind(min),maxd(max),depth(min), index(1, dim) 00019 { 00020 index=min; 00021 } 00022 void multi_index::operator ++ (void) 00023 { 00024 int imin=index.indexmin(); 00025 int imax=index.indexmax(); 00026 index(imin)++; 00027 int tmpdepth=1; 00028 for (int i=imin;i<=imax;i++) 00029 { 00030 if (index(i)>maxd) 00031 { 00032 if (i<imax) 00033 { 00034 index(i+1)++; 00035 } 00036 index(i)=mind; 00037 tmpdepth=i+1; 00038 } 00039 else 00040 { 00041 break; 00042 } 00043 } 00044 if (tmpdepth>depth) 00045 depth =tmpdepth; 00046 } 00047 int multi_index::get_offset(void) 00048 { 00049 int imin=index.indexmin(); 00050 int imax=index.indexmax(); 00051 int offset=index(imin)-mind; 00052 int mx=min(depth,imax); 00053 int sz=maxd-mind+1; 00054 for (int i=imin+1;i<=mx;i++) 00055 { 00056 offset+=int(pow(double(sz),i-imin))*(index(i)-mind); 00057 } 00058 return offset; 00059 } 00060 00065 void multi_index::initialize(void) 00066 { 00067 index=mind; 00068 depth=mind; 00069 }
Generated on Tue Mar 8 2016 19:51:35 for ADMB Documentation by 1.8.0 |