double DoubleDeriv1 (edge *TheEdge, position *ThePosition, line *TheLine, int index_x, int index_y) { int index; double dv[3], v[3], newv[3], hat[3], temp1; if (!TheEdge || !ThePosition || !TheLine) return (0.0); if (index_y < index_x) { index = index_x; index_x = index_y; index_y = index; } ComputeV (v, *TheLine); RotateQuaternion (newv, ThePosition->q, v); temp1 = InnerProduct (newv, TheEdge->m); if ((index_x == THETA) && (index_y == THETA) || (index_x == OMEGA) && (index_y == OMEGA)) return (-2.0 * sqr(temp1)); if ((index_x == THETA) && (index_y == OMEGA)) return (0.0); if (((index_x == THETA) || (index_x == OMEGA)) && ((index_y == ALPHA) || (index_y == BETA) || (index_y == GAMMA))) { if (index_x == THETA) { hat[0] = 0.0; hat[1] = -1.0; hat[2] = 0.0; } else { hat[0] = 1.0; hat[1] = 0.0; hat[2] = 0.0; } RotateQuaternion (v, TheLine->q, hat); RotateQuaternion (newv, ThePosition->q, v); DerivR (dv, newv, IndexToAxis (index_y)); return (2.0 * temp1 * InnerProduct (dv, TheEdge->m)); } if ( ((index_x == ALPHA) || (index_x == BETA) || (index_x == GAMMA)) && ((index_y == ALPHA) || (index_y == BETA) || (index_y == GAMMA)) ) { ComputeV (v, *TheLine); RotateQuaternion (newv, ThePosition->q, v); DoubleDerivR (dv, newv, IndexToAxis (index_x), IndexToAxis (index_y)); return (2.0 * temp1 * InnerProduct (dv, TheEdge->m)); } pexit ("Bad Parameters to DoubleDeriv1"); return 0.0; }
double Deriv1 (edge *TheEdge, position *ThePosition, line *TheLine, int index) { double v[3], newv[3], dv[3], hat[3]; if (!TheEdge || !ThePosition || !TheLine) return (0.0); switch (index) { case THETA : hat[0] = 0.0; hat[1] = -1.0; hat[2] = 0.0; RotateQuaternion (dv, TheLine->q, hat); RotateQuaternion (newv, ThePosition->q, dv); return (InnerProduct (newv, TheEdge->m)); break; case OMEGA : hat[0] = 1.0; hat[1] = 0.0; hat[2] = 0.0; RotateQuaternion (dv, TheLine->q, hat); RotateQuaternion (newv, ThePosition->q, dv); return (InnerProduct (newv, TheEdge->m)); break; case ALPHA : ComputeV (v, *TheLine); RotateQuaternion (newv, ThePosition->q, v); DerivR (dv, newv, 'x'); return (InnerProduct (dv, TheEdge->m)); break; case BETA : ComputeV (v, *TheLine); RotateQuaternion (newv, ThePosition->q, v); DerivR (dv, newv, 'y'); return (InnerProduct (dv, TheEdge->m)); break; case GAMMA : ComputeV (v, *TheLine); RotateQuaternion (newv, ThePosition->q, v); DerivR (dv, newv, 'z'); return (InnerProduct (dv, TheEdge->m)); break; default : pexit ("Bad parameters to Deriv1"); break; } return 0.0; }
void RawIDA::PrepareInterpolation() { CRYPTOPP_ASSERT(m_inputChannelIds.size() == size_t(m_threshold)); PrepareBulkPolynomialInterpolation(field, m_w.begin(), &(m_inputChannelIds[0]), (unsigned int)(m_threshold)); for (unsigned int i=0; i<m_outputChannelIds.size(); i++) ComputeV(i); }
void RawIDA::AddOutputChannel(word32 channelId) { m_outputChannelIds.push_back(channelId); m_outputChannelIdStrings.push_back(WordToString(channelId)); m_outputQueues.push_back(ByteQueue()); if (m_inputChannelIds.size() == size_t(m_threshold)) ComputeV((unsigned int)m_outputChannelIds.size() - 1); }
double Error1 (edge *TheEdge, position *ThePosition, line *TheLine) { double v[3], newv[3], temp; if (!TheEdge || !ThePosition || !TheLine) return (0.0); ComputeV (v, *TheLine); RotateQuaternion (newv, ThePosition->q, v); temp = InnerProduct (newv, TheEdge->m); return (sqr(temp) / (TheEdge->m_error)); }
double Gradient1 (edge *TheEdge, position *ThePosition, line *TheLine, int index) { double v[3], newv[3], temp1, temp2; if (!TheEdge || !ThePosition || !TheLine) return (0.0); ComputeV (v, *TheLine); RotateQuaternion (newv, ThePosition->q, v); temp1 = InnerProduct (newv, TheEdge->m); temp2 = Deriv1 (TheEdge, ThePosition, TheLine, index); return ( (2.0*temp1*temp2) / (TheEdge->m_error) ); }