00001
00017 #include <cassert>
00018 #include "deltas.h"
00019
00020
00021
00027 void
00028 GetDiff ( const buffer2D& buffer,
00029 DOUBLE* diff )
00030
00031 {
00032
00033 INT iWindow = (buffer.Size()-1)/2;
00034 INT iMiddle = iWindow;
00035 for (INT j = 0; j < buffer.Dim(); ++j)
00036 {
00037 diff[j] = 0;
00038 for (INT i = 1; i <= iWindow; ++i)
00039 diff[j] += i*(buffer[iMiddle+i][j] - buffer[iMiddle-i][j]);
00040 }
00041
00042
00043 DOUBLE acumulador = 0;
00044 for (INT i = 1; i <= iWindow; ++i)
00045 acumulador += i*i;
00046
00047 for (INT j = 0; j < buffer.Dim(); ++j)
00048 {
00049
00050 if (diff[j] != 0.0)
00051 diff[j] /= (2.0*acumulador);
00052 }
00053 }
00054
00055
00056
00064 DOUBLE
00065 GetDiff ( const buffer1D& buffer )
00066 {
00067 INT iWindow = (buffer.Size()-1)/2;
00068 INT iMiddle = iWindow;
00069
00070
00071 DOUBLE sal = 0;
00072 DOUBLE acumulador = 0;
00073 for (INT i = 1; i <= iWindow; ++i)
00074 {
00075 sal += i*(buffer[iMiddle+i] - buffer[iMiddle-i]);
00076 acumulador += i*i;
00077 }
00078
00079
00080 if (sal == 0.0)
00081 return 0.0;
00082 return sal /= (2.0*acumulador);
00083 }
00084
00085
00086
00087
00094 void
00095 ParamDeltas::Initialize (INT Ndeltas,
00096 INT* windowSize,
00097 INT Ndim)
00098 {
00099
00100 assert (Ndeltas >= 0);
00101
00102 m_Ndim = Ndim;
00103 m_bInit = false;
00104
00105
00106
00107
00108
00109
00110 m_vDeltaBuffers.resize(Ndeltas);
00111
00112 if (Ndeltas != 0)
00113 m_vMemBuffers.resize(Ndeltas);
00114 else
00115 {
00116 m_vMemBuffers.resize(1);
00117 m_vMemBuffers[0].Resize (1, Ndim);
00118 }
00119
00120 INT memsize = 1;
00121 for (INT i = Ndeltas-1; i >= 0; --i)
00122 {
00123 assert (windowSize[i] > 0);
00124 memsize += windowSize[i];
00125 m_vDeltaBuffers[i].Resize (2*windowSize[i]+1, Ndim);
00126 m_vMemBuffers[i].Resize (memsize, Ndim);
00127 }
00128
00129
00130 if (m_pdDiff)
00131 xfree(m_pdDiff);
00132 m_pdDiff = (DOUBLE*)xmalloc(Ndim*sizeof(DOUBLE));
00133 }
00134
00135
00136 void
00137 ParamDeltas::Push (const DOUBLE* e)
00138 {
00139 if (!m_bInit && Ndeltas() != 0)
00140 Populate(e);
00141
00142 if (Ndeltas() != 0)
00143
00144 m_vDeltaBuffers[0].Push(e);
00145
00146 m_vMemBuffers[0].Push(e);
00147
00148
00149 for (INT i = 1; i < Ndeltas(); ++i)
00150 {
00151 GetDiff (m_vDeltaBuffers[i-1], m_pdDiff);
00152 m_vDeltaBuffers[i].Push(m_pdDiff);
00153 m_vMemBuffers[i].Push(m_pdDiff);
00154 }
00155
00156
00157 }
00158
00159
00185 void
00186 ParamDeltas::Get(DOUBLE* e) const
00187 {
00188
00189 for (INT i = 0; i < Ndeltas(); ++i)
00190 GetSample(m_vMemBuffers[i], e+i*Ndim(), 0);
00191
00192
00193 if (Ndeltas() != 0)
00194 GetDiff (m_vDeltaBuffers[Ndeltas()-1], e+Ndeltas()*Ndim());
00195 else
00196 GetSample(m_vMemBuffers[0], e, 0);
00197 }
00198
00204 void
00205 ParamDeltas::Populate (const DOUBLE* e)
00206 {
00207 for (INT i = 0; i < m_vDeltaBuffers[0].Size()-1; ++i)
00208 m_vDeltaBuffers[0].Push(e);
00209 m_bInit = true;
00210 }