turtlebot_arm_arm_ikfast_solver.cpp
Go to the documentation of this file.
1 #define IKFAST_HAS_LIBRARY
22 #include "ikfast.h" // found inside share/openrave-X.Y/python/ikfast.h
23 using namespace ikfast;
24 
25 // check if the included ikfast version matches what this file was compiled with
26 #define IKFAST_COMPILE_ASSERT(x) extern int __dummy[(int)x]
28 
29 #include <cmath>
30 #include <vector>
31 #include <limits>
32 #include <algorithm>
33 #include <complex>
34 
35 #ifndef IKFAST_ASSERT
36 #include <stdexcept>
37 #include <sstream>
38 #include <iostream>
39 
40 #ifdef _MSC_VER
41 #ifndef __PRETTY_FUNCTION__
42 #define __PRETTY_FUNCTION__ __FUNCDNAME__
43 #endif
44 #endif
45 
46 #ifndef __PRETTY_FUNCTION__
47 #define __PRETTY_FUNCTION__ __func__
48 #endif
49 
50 #define IKFAST_ASSERT(b) { if( !(b) ) { std::stringstream ss; ss << "ikfast exception: " << __FILE__ << ":" << __LINE__ << ": " <<__PRETTY_FUNCTION__ << ": Assertion '" << #b << "' failed"; throw std::runtime_error(ss.str()); } }
51 
52 #endif
53 
54 #if defined(_MSC_VER)
55 #define IKFAST_ALIGNED16(x) __declspec(align(16)) x
56 #else
57 #define IKFAST_ALIGNED16(x) x __attribute((aligned(16)))
58 #endif
59 
60 #define IK2PI ((IkReal)6.28318530717959)
61 #define IKPI ((IkReal)3.14159265358979)
62 #define IKPI_2 ((IkReal)1.57079632679490)
63 
64 #ifdef _MSC_VER
65 #ifndef isnan
66 #define isnan _isnan
67 #endif
68 #ifndef isinf
69 #define isinf _isinf
70 #endif
71 //#ifndef isfinite
72 //#define isfinite _isfinite
73 //#endif
74 #endif // _MSC_VER
75 
76 // lapack routines
77 extern "C" {
78  void dgetrf_ (const int* m, const int* n, double* a, const int* lda, int* ipiv, int* info);
79  void zgetrf_ (const int* m, const int* n, std::complex<double>* a, const int* lda, int* ipiv, int* info);
80  void dgetri_(const int* n, const double* a, const int* lda, int* ipiv, double* work, const int* lwork, int* info);
81  void dgesv_ (const int* n, const int* nrhs, double* a, const int* lda, int* ipiv, double* b, const int* ldb, int* info);
82  void dgetrs_(const char *trans, const int *n, const int *nrhs, double *a, const int *lda, int *ipiv, double *b, const int *ldb, int *info);
83  void dgeev_(const char *jobvl, const char *jobvr, const int *n, double *a, const int *lda, double *wr, double *wi,double *vl, const int *ldvl, double *vr, const int *ldvr, double *work, const int *lwork, int *info);
84 }
85 
86 using namespace std; // necessary to get std math routines
87 
88 #ifdef IKFAST_NAMESPACE
89 namespace IKFAST_NAMESPACE {
90 #endif
91 
92 inline float IKabs(float f) { return fabsf(f); }
93 inline double IKabs(double f) { return fabs(f); }
94 
95 inline float IKsqr(float f) { return f*f; }
96 inline double IKsqr(double f) { return f*f; }
97 
98 inline float IKlog(float f) { return logf(f); }
99 inline double IKlog(double f) { return log(f); }
100 
101 // allows asin and acos to exceed 1. has to be smaller than thresholds used for branch conds and evaluation
102 #ifndef IKFAST_SINCOS_THRESH
103 #define IKFAST_SINCOS_THRESH ((IkReal)1e-7)
104 #endif
105 
106 // used to check input to atan2 for degenerate cases. has to be smaller than thresholds used for branch conds and evaluation
107 #ifndef IKFAST_ATAN2_MAGTHRESH
108 #define IKFAST_ATAN2_MAGTHRESH ((IkReal)1e-7)
109 #endif
110 
111 // minimum distance of separate solutions
112 #ifndef IKFAST_SOLUTION_THRESH
113 #define IKFAST_SOLUTION_THRESH ((IkReal)1e-6)
114 #endif
115 
116 // there are checkpoints in ikfast that are evaluated to make sure they are 0. This threshold speicfies by how much they can deviate
117 #ifndef IKFAST_EVALCOND_THRESH
118 #define IKFAST_EVALCOND_THRESH ((IkReal)0.00001)
119 #endif
120 
121 
122 inline float IKasin(float f)
123 {
124 IKFAST_ASSERT( f > -1-IKFAST_SINCOS_THRESH && f < 1+IKFAST_SINCOS_THRESH ); // any more error implies something is wrong with the solver
125 if( f <= -1 ) return float(-IKPI_2);
126 else if( f >= 1 ) return float(IKPI_2);
127 return asinf(f);
128 }
129 inline double IKasin(double f)
130 {
131 IKFAST_ASSERT( f > -1-IKFAST_SINCOS_THRESH && f < 1+IKFAST_SINCOS_THRESH ); // any more error implies something is wrong with the solver
132 if( f <= -1 ) return -IKPI_2;
133 else if( f >= 1 ) return IKPI_2;
134 return asin(f);
135 }
136 
137 // return positive value in [0,y)
138 inline float IKfmod(float x, float y)
139 {
140  while(x < 0) {
141  x += y;
142  }
143  return fmodf(x,y);
144 }
145 
146 // return positive value in [0,y)
147 inline double IKfmod(double x, double y)
148 {
149  while(x < 0) {
150  x += y;
151  }
152  return fmod(x,y);
153 }
154 
155 inline float IKacos(float f)
156 {
157 IKFAST_ASSERT( f > -1-IKFAST_SINCOS_THRESH && f < 1+IKFAST_SINCOS_THRESH ); // any more error implies something is wrong with the solver
158 if( f <= -1 ) return float(IKPI);
159 else if( f >= 1 ) return float(0);
160 return acosf(f);
161 }
162 inline double IKacos(double f)
163 {
164 IKFAST_ASSERT( f > -1-IKFAST_SINCOS_THRESH && f < 1+IKFAST_SINCOS_THRESH ); // any more error implies something is wrong with the solver
165 if( f <= -1 ) return IKPI;
166 else if( f >= 1 ) return 0;
167 return acos(f);
168 }
169 inline float IKsin(float f) { return sinf(f); }
170 inline double IKsin(double f) { return sin(f); }
171 inline float IKcos(float f) { return cosf(f); }
172 inline double IKcos(double f) { return cos(f); }
173 inline float IKtan(float f) { return tanf(f); }
174 inline double IKtan(double f) { return tan(f); }
175 inline float IKsqrt(float f) { if( f <= 0.0f ) return 0.0f; return sqrtf(f); }
176 inline double IKsqrt(double f) { if( f <= 0.0 ) return 0.0; return sqrt(f); }
177 inline float IKatan2Simple(float fy, float fx) {
178  return atan2f(fy,fx);
179 }
180 inline float IKatan2(float fy, float fx) {
181  if( isnan(fy) ) {
182  IKFAST_ASSERT(!isnan(fx)); // if both are nan, probably wrong value will be returned
183  return float(IKPI_2);
184  }
185  else if( isnan(fx) ) {
186  return 0;
187  }
188  return atan2f(fy,fx);
189 }
190 inline double IKatan2Simple(double fy, double fx) {
191  return atan2(fy,fx);
192 }
193 inline double IKatan2(double fy, double fx) {
194  if( isnan(fy) ) {
195  IKFAST_ASSERT(!isnan(fx)); // if both are nan, probably wrong value will be returned
196  return IKPI_2;
197  }
198  else if( isnan(fx) ) {
199  return 0;
200  }
201  return atan2(fy,fx);
202 }
203 
204 template <typename T>
206 {
207  T value;
208  bool valid;
209 };
210 
211 template <typename T>
212 inline CheckValue<T> IKatan2WithCheck(T fy, T fx, T epsilon)
213 {
214  CheckValue<T> ret;
215  ret.valid = false;
216  ret.value = 0;
217  if( !isnan(fy) && !isnan(fx) ) {
219  ret.value = IKatan2Simple(fy,fx);
220  ret.valid = true;
221  }
222  }
223  return ret;
224 }
225 
226 inline float IKsign(float f) {
227  if( f > 0 ) {
228  return float(1);
229  }
230  else if( f < 0 ) {
231  return float(-1);
232  }
233  return 0;
234 }
235 
236 inline double IKsign(double f) {
237  if( f > 0 ) {
238  return 1.0;
239  }
240  else if( f < 0 ) {
241  return -1.0;
242  }
243  return 0;
244 }
245 
246 template <typename T>
248 {
249  CheckValue<T> ret;
250  ret.valid = true;
251  if( n == 0 ) {
252  ret.value = 1.0;
253  return ret;
254  }
255  else if( n == 1 )
256  {
257  ret.value = f;
258  return ret;
259  }
260  else if( n < 0 )
261  {
262  if( f == 0 )
263  {
264  ret.valid = false;
265  ret.value = (T)1.0e30;
266  return ret;
267  }
268  if( n == -1 ) {
269  ret.value = T(1.0)/f;
270  return ret;
271  }
272  }
273 
274  int num = n > 0 ? n : -n;
275  if( num == 2 ) {
276  ret.value = f*f;
277  }
278  else if( num == 3 ) {
279  ret.value = f*f*f;
280  }
281  else {
282  ret.value = 1.0;
283  while(num>0) {
284  if( num & 1 ) {
285  ret.value *= f;
286  }
287  num >>= 1;
288  f *= f;
289  }
290  }
291 
292  if( n < 0 ) {
293  ret.value = T(1.0)/ret.value;
294  }
295  return ret;
296 }
297 
300 IKFAST_API void ComputeFk(const IkReal* j, IkReal* eetrans, IkReal* eerot) {
301 IkReal x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,x16,x17,x18,x19,x20,x21,x22,x23,x24;
302 x0=IKcos(j[0]);
303 x1=IKsin(j[2]);
304 x2=IKcos(j[1]);
305 x3=IKsin(j[1]);
306 x4=IKcos(j[2]);
307 x5=IKsin(j[0]);
308 x6=IKcos(j[3]);
309 x7=IKsin(j[3]);
310 x8=IKcos(j[4]);
311 x9=IKsin(j[4]);
312 x10=((0.112)*x1);
313 x11=((0.112)*x4);
314 x12=((0.106)*x4);
315 x13=((1.0)*x6);
316 x14=((1.0)*x4);
317 x15=((1.0)*x7);
318 x16=((1.1e-7)*x4);
319 x17=((1.1e-7)*x1);
320 x18=(x0*x3);
321 x19=(x3*x5);
322 x20=(x1*x2);
323 x21=(x0*x2);
324 x22=(x2*x5);
325 x23=(x1*x3);
326 x24=((1.1e-7)*x21);
327 eetrans[0]=((-3.0e-8)+((x7*((((x11*x21))+(((-1.0)*x10*x18))))))+(((0.106)*x18))+(((-1.0)*x24))+(((-1.0)*x16*x21))+((x17*x18))+((x12*x18))+(((0.106)*x0*x20))+((x6*((((x11*x18))+((x10*x21)))))));
328 eetrans[1]=(((x6*((((x11*x19))+((x10*x22))))))+(((0.106)*x20*x5))+(((0.106)*x19))+(((-1.0)*x16*x22))+(((-1.1e-7)*x22))+((x17*x19))+((x12*x19))+((x7*((((x11*x22))+(((-1.0)*x10*x19)))))));
329 IkReal x25=((1.0)*x3);
330 eetrans[2]=((0.0605)+(((0.106)*x2))+(((1.1e-7)*x3))+(((-0.106)*x23))+((x17*x2))+((x16*x3))+((x7*(((((-1.0)*x10*x2))+(((-1.0)*x11*x25))))))+((x6*(((((-1.0)*x10*x25))+((x11*x2))))))+((x12*x2)));
331 eerot[0]=(((x5*x9))+((x8*((((x7*((((x18*x4))+((x0*x20))))))+((x6*((((x1*x18))+(((-1.0)*x14*x21)))))))))));
332 IkReal x26=((1.0)*x19);
333 eerot[1]=((((-1.0)*x8*((((x13*(((((-1.0)*x1*x26))+((x22*x4))))))+((x15*(((((-1.0)*x14*x26))+(((-1.0)*x20*x5))))))))))+(((-1.0)*x0*x9)));
334 IkReal x27=((1.0)*x14);
335 eerot[2]=((-1.0)*x8*((((x13*(((((-1.0)*x20))+(((-1.0)*x27*x3))))))+((x15*((x23+(((-1.0)*x2*x27)))))))));
336 }
337 
338 IKFAST_API int GetNumFreeParameters() { return 0; }
339 IKFAST_API int* GetFreeParameters() { return NULL; }
340 IKFAST_API int GetNumJoints() { return 5; }
341 
342 IKFAST_API int GetIkRealSize() { return sizeof(IkReal); }
343 
344 IKFAST_API int GetIkType() { return 0x56000007; }
345 
346 class IKSolver {
347 public:
348 IkReal j0,cj0,sj0,htj0,j0mul,j1,cj1,sj1,htj1,j1mul,j2,cj2,sj2,htj2,j2mul,j3,cj3,sj3,htj3,j3mul,j5,cj5,sj5,htj5,j5mul,new_r00,r00,rxp0_0,new_r01,r01,rxp0_1,new_r02,r02,rxp0_2,new_px,px,npx,new_py,py,npy,new_pz,pz,npz,pp;
349 unsigned char _ij0[2], _nj0,_ij1[2], _nj1,_ij2[2], _nj2,_ij3[2], _nj3,_ij5[2], _nj5;
350 
351 IkReal j100, cj100, sj100;
352 unsigned char _ij100[2], _nj100;
353 bool ComputeIk(const IkReal* eetrans, const IkReal* eerot, const IkReal* pfree, IkSolutionListBase<IkReal>& solutions) {
354 j0=numeric_limits<IkReal>::quiet_NaN(); _ij0[0] = -1; _ij0[1] = -1; _nj0 = -1; j1=numeric_limits<IkReal>::quiet_NaN(); _ij1[0] = -1; _ij1[1] = -1; _nj1 = -1; j2=numeric_limits<IkReal>::quiet_NaN(); _ij2[0] = -1; _ij2[1] = -1; _nj2 = -1; j3=numeric_limits<IkReal>::quiet_NaN(); _ij3[0] = -1; _ij3[1] = -1; _nj3 = -1; j5=numeric_limits<IkReal>::quiet_NaN(); _ij5[0] = -1; _ij5[1] = -1; _nj5 = -1;
355 for(int dummyiter = 0; dummyiter < 1; ++dummyiter) {
356  solutions.Clear();
357 px = eetrans[0]; py = eetrans[1]; pz = eetrans[2];
358 
359 r00 = eerot[0];
360 r01 = eerot[1];
361 r02 = eerot[2];
362 px = eetrans[0]; py = eetrans[1]; pz = eetrans[2];
363 new_r00=r01;
364 new_px=py;
365 new_r01=((-1.0)*r00);
366 new_py=((-3.0e-8)+(((-1.0)*px)));
367 new_r02=r02;
368 new_pz=((-0.0605)+pz);
369 r00 = new_r00; r01 = new_r01; r02 = new_r02; px = new_px; py = new_py; pz = new_pz;
370 
371 pp=((px*px)+(py*py)+(pz*pz));
372 {
373 IkReal j0eval[1];
374 j0eval[0]=((IKabs(px))+(IKabs(py)));
375 if( IKabs(j0eval[0]) < 0.0000010000000000 )
376 {
377 continue; // no branches [j0]
378 
379 } else
380 {
381 {
382 IkReal j0array[2], cj0array[2], sj0array[2];
383 bool j0valid[2]={false};
384 _nj0 = 2;
385 CheckValue<IkReal> x29 = IKatan2WithCheck(IkReal(((-1.0)*px)),IkReal(((-1.0)*py)),IKFAST_ATAN2_MAGTHRESH);
386 if(!x29.valid){
387 continue;
388 }
389 IkReal x28=x29.value;
390 j0array[0]=((-1.0)*x28);
391 sj0array[0]=IKsin(j0array[0]);
392 cj0array[0]=IKcos(j0array[0]);
393 j0array[1]=((3.14159265358979)+(((-1.0)*x28)));
394 sj0array[1]=IKsin(j0array[1]);
395 cj0array[1]=IKcos(j0array[1]);
396 if( j0array[0] > IKPI )
397 {
398  j0array[0]-=IK2PI;
399 }
400 else if( j0array[0] < -IKPI )
401 { j0array[0]+=IK2PI;
402 }
403 j0valid[0] = true;
404 if( j0array[1] > IKPI )
405 {
406  j0array[1]-=IK2PI;
407 }
408 else if( j0array[1] < -IKPI )
409 { j0array[1]+=IK2PI;
410 }
411 j0valid[1] = true;
412 for(int ij0 = 0; ij0 < 2; ++ij0)
413 {
414 if( !j0valid[ij0] )
415 {
416  continue;
417 }
418 _ij0[0] = ij0; _ij0[1] = -1;
419 for(int iij0 = ij0+1; iij0 < 2; ++iij0)
420 {
421 if( j0valid[iij0] && IKabs(cj0array[ij0]-cj0array[iij0]) < IKFAST_SOLUTION_THRESH && IKabs(sj0array[ij0]-sj0array[iij0]) < IKFAST_SOLUTION_THRESH )
422 {
423  j0valid[iij0]=false; _ij0[1] = iij0; break;
424 }
425 }
426 j0 = j0array[ij0]; cj0 = cj0array[ij0]; sj0 = sj0array[ij0];
427 
428 IkReal op[4+1], zeror[4];
429 int numroots;
430 op[0]=((((4.4e-7)*cj0*py*(px*px)*(r01*r01)))+(((-1.0)*(cj0*cj0)*(py*py*py*py)*(r01*r01)))+(((0.005318656)*pz*(cj0*cj0)*(r01*r01)))+(((1.17010432e-9)*r00*r02*sj0))+(((-8.0)*px*pz*r00*r02*(cj0*cj0)*(py*py)))+(((2.0)*(cj0*cj0)*(py*py)*(pz*pz)*(r01*r01)))+(((-4.4e-7)*cj0*py*(px*px)*(r02*r02)))+(((-8.8e-7)*pz*r00*r02*sj0*(py*py)))+(((-4.0)*cj0*pz*r01*r02*sj0*(px*px*px)))+(((0.039712)*cj0*r00*r01*sj0*(pz*pz)))+(((2.0)*cj0*r00*r01*sj0*(pz*pz*pz*pz)))+(((4.0)*py*r00*r01*(cj0*cj0)*(px*px*px)))+(((8.0)*cj0*px*py*sj0*(pz*pz)*(r02*r02)))+(((-5.51936e-9)*cj0*py*(r01*r01)))+(((-0.140064)*py*pz*r01*r02))+(((-8.0)*py*pz*r01*r02*(px*px)*(sj0*sj0)))+(((1.32e-6)*py*r00*r01*sj0*(px*px)))+(((4.0)*cj0*py*sj0*(px*px*px)*(r00*r00)))+(((1.696)*cj0*px*py*pz*sj0*(r02*r02)))+(((-4.0)*(px*px)*(pz*pz)*(r02*r02)*(sj0*sj0)))+(((-4.0)*(px*px)*(pz*pz)*(r00*r00)))+(((0.848)*px*py*pz*r00*r01*(sj0*sj0)))+(((0.848)*px*py*pz*r00*r01*(cj0*cj0)))+(((-0.424)*r01*r02*(cj0*cj0)*(py*py*py)))+(((-0.005318656)*pz*(r02*r02)))+(((-4.0)*px*r00*r01*(cj0*cj0)*(py*py*py)))+(((-0.039712)*cj0*py*pz*r00*r02*sj0))+(((2.0)*(px*px)*(py*py)*(r00*r00)*(sj0*sj0)))+(((-1.0)*(px*px*px*px)*(r00*r00)*(sj0*sj0)))+(((-8.8e-7)*cj0*py*(px*px)*(r00*r00)))+(((-0.005318656)*py*r01*r02))+(((-1.0)*(cj0*cj0)*(pz*pz*pz*pz)*(r01*r01)))+(((-4.0)*cj0*px*r01*r02*sj0*(pz*pz*pz)))+(((-4.0)*py*r00*r01*(px*px*px)*(sj0*sj0)))+(((4.4e-7)*px*sj0*(pz*pz)*(r02*r02)))+(((0.005318656)*cj0*px*r01*r02*sj0))+(((4.0)*px*py*r00*r01*(cj0*cj0)*(pz*pz)))+(((-0.848)*pz*(px*px)*(r02*r02)*(sj0*sj0)))+(((-0.424)*r00*r02*(px*px*px)*(sj0*sj0)))+(((-0.848)*cj0*px*py*pz*sj0*(r01*r01)))+(((0.848)*cj0*r00*r01*sj0*(pz*pz*pz)))+(((0.0250879999999516)*(px*px)*(r02*r02)))+(((-0.019856)*(cj0*cj0)*(px*px)*(r01*r01)))+(((0.424)*py*r01*r02*(px*px)))+(((-0.424)*(pz*pz*pz)*(r02*r02)))+(((12.0)*cj0*px*pz*r01*r02*sj0*(py*py)))+(((-5.51936e-9)*px*sj0*(r02*r02)))+(((-4.0)*cj0*py*r00*r02*sj0*(pz*pz*pz)))+(((-0.019856)*(cj0*cj0)*(pz*pz)*(r01*r01)))+(((5.51936e-9)*py*r00*r01*sj0))+(((-2.0)*(px*px)*(py*py)*(r02*r02)))+(((-4.0)*cj0*px*py*sj0*(pz*pz)*(r01*r01)))+(((0.424)*py*r01*r02*(cj0*cj0)*(px*px)))+(((-8.0)*px*py*r00*r01*(pz*pz)))+(((2.0)*(cj0*cj0)*(px*px)*(py*py)*(r01*r01)))+(((-0.039712)*cj0*px*py*sj0*(r01*r01)))+(((1.103872e-8)*pz*r00*r02*sj0))+(((-0.000157351935999393)*(r02*r02)))+(((-0.005318656)*px*r00*r02*(sj0*sj0)))+(((0.019856)*(cj0*cj0)*(py*py)*(r01*r01)))+(((5.51936e-9)*cj0*py*(r02*r02)))+(((-0.019856)*(pz*pz)*(r00*r00)*(sj0*sj0)))+(((-4.0)*cj0*px*sj0*(py*py*py)*(r00*r00)))+(((-2.0)*cj0*r00*r01*sj0*(py*py*py*py)))+(((2.0)*(px*px)*(pz*pz)*(r00*r00)*(sj0*sj0)))+(((-0.039712)*cj0*px*py*sj0*(r00*r00)))+(((0.039712)*py*pz*r01*r02*(cj0*cj0)))+(((-9.328e-8)*cj0*px*py*r00*r02))+(((1.272)*py*r01*r02*(cj0*cj0)*(pz*pz)))+(((-0.039712)*cj0*px*pz*r01*r02*sj0))+(((4.0)*pz*r01*r02*(py*py*py)))+(((-0.424)*(pz*pz*pz)*(r00*r00)*(sj0*sj0)))+(((1.272)*cj0*py*r00*r02*sj0*(px*px)))+(((-0.848)*px*r00*r02*(cj0*cj0)*(py*py)))+(((-1.32e-6)*cj0*px*r00*r01*(py*py)))+(((-4.4e-7)*cj0*py*(pz*pz)*(r02*r02)))+(((-0.848)*pz*(cj0*cj0)*(py*py)*(r02*r02)))+(((-4.0)*py*r01*r02*(pz*pz*pz)))+(((-0.424)*pz*(py*py)*(r00*r00)*(sj0*sj0)))+(((-4.0)*cj0*pz*r00*r02*sj0*(py*py*py)))+(((-1.272)*cj0*py*r00*r02*sj0*(pz*pz)))+(((-4.0)*cj0*py*sj0*(px*px*px)*(r01*r01)))+(((-0.424)*cj0*r01*r02*sj0*(px*px*px)))+(((-1.17010432e-9)*cj0*r01*r02))+(((4.4e-7)*sj0*(px*px*px)*(r02*r02)))+(((4.0)*px*r00*r01*(py*py*py)*(sj0*sj0)))+(((4.0)*py*pz*r01*r02*(px*px)))+(((9.328e-8)*py*pz*r00*r01*sj0))+(((-4.4e-7)*px*sj0*(py*py)*(r00*r00)))+(((-4.4e-7)*cj0*py*(pz*pz)*(r01*r01)))+(((0.424)*px*r00*r02*(py*py)))+(((-4.4e-7)*cj0*px*r00*r01*(pz*pz)))+(((4.4e-7)*px*sj0*(py*py)*(r02*r02)))+(((-9.328e-8)*r00*r02*sj0*(py*py)))+(((9.328e-8)*px*pz*sj0*(r00*r00)))+(((4.0)*cj0*px*sj0*(py*py*py)*(r01*r01)))+(((4.0)*pz*r00*r02*(px*px*px)))+(((0.0250879999999516)*(py*py)*(r02*r02)))+(((-0.424)*pz*(cj0*cj0)*(px*px)*(r01*r01)))+(((4.4e-7)*cj0*r00*r01*(px*px*px)))+(((-1.272)*cj0*px*r01*r02*sj0*(pz*pz)))+(((-0.848)*pz*(px*px)*(r00*r00)))+(((1.272)*px*r00*r02*(pz*pz)*(sj0*sj0)))+(((0.424)*r00*r02*(px*px*px)))+(((5.51936e-9)*px*sj0*(r00*r00)))+(((-4.0)*pz*r01*r02*(cj0*cj0)*(py*py*py)))+(((-4.4e-7)*r00*r01*sj0*(py*py*py)))+(((-0.140064)*px*pz*r00*r02))+(((-4.0)*cj0*px*py*sj0*(pz*pz)*(r00*r00)))+(((-4.0)*pz*r00*r02*(px*px*px)*(sj0*sj0)))+(((-1.696)*px*py*pz*r00*r01))+(((-2.0)*(py*py)*(pz*pz)*(r00*r00)*(sj0*sj0)))+(((-0.848)*pz*(py*py)*(r01*r01)))+(((-0.848)*cj0*px*py*pz*sj0*(r00*r00)))+(((-9.328e-8)*cj0*py*pz*(r01*r01)))+(((2.0)*(px*px)*(pz*pz)*(r02*r02)))+(((4.4e-7)*sj0*(px*px*px)*(r00*r00)))+(((0.424)*pz*(px*px)*(r02*r02)))+(((-0.0008128512)*cj0*r00*r01*sj0))+(((-1.0)*(py*py*py*py)*(r02*r02)))+(((0.019856)*(px*px)*(r00*r00)*(sj0*sj0)))+(((-2.0)*(cj0*cj0)*(px*px)*(pz*pz)*(r01*r01)))+(((4.0)*px*r00*r02*(pz*pz*pz)*(sj0*sj0)))+(((-0.010637312)*cj0*pz*r00*r01*sj0))+(((-0.070032)*(pz*pz)*(r02*r02)))+(((0.005318656)*pz*(r00*r00)*(sj0*sj0)))+(((-0.424)*(cj0*cj0)*(pz*pz*pz)*(r01*r01)))+(((-2.0)*cj0*r00*r01*sj0*(px*px*px*px)))+(((0.0004064256)*(cj0*cj0)*(r01*r01)))+(((-1.0)*(pz*pz*pz*pz)*(r00*r00)*(sj0*sj0)))+(((-1.272)*px*r00*r02*(pz*pz)))+(((4.0)*px*pz*r00*r02*(py*py)*(sj0*sj0)))+(((9.328e-8)*px*pz*sj0*(r02*r02)))+(((-4.4e-7)*cj0*(py*py*py)*(r02*r02)))+(((-8.8e-7)*cj0*px*py*pz*r00*r02))+(((0.039712)*px*py*r00*r01*(sj0*sj0)))+(((-0.424)*cj0*r00*r02*sj0*(py*py*py)))+(((0.424)*pz*(cj0*cj0)*(py*py)*(r01*r01)))+(((4.0)*py*r01*r02*(cj0*cj0)*(pz*pz*pz)))+(((9.328e-8)*px*py*r01*r02*sj0))+(((-4.0)*(cj0*cj0)*(px*px)*(py*py)*(r00*r00)))+(((9.328e-8)*cj0*r01*r02*(px*px)))+(((-4.0)*(py*py)*(pz*pz)*(r01*r01)))+(((-1.0)*(pz*pz*pz*pz)*(r02*r02)))+(((0.424)*pz*(px*px)*(r00*r00)*(sj0*sj0)))+(((12.0)*cj0*r00*r01*sj0*(px*px)*(py*py)))+(((-0.005318656)*px*r00*r02))+(((-4.0)*px*r00*r02*(pz*pz*pz)))+(((0.0004064256)*(r00*r00)*(sj0*sj0)))+(((-9.328e-8)*cj0*px*pz*r00*r01))+(((4.4e-7)*px*sj0*(pz*pz)*(r00*r00)))+(((-0.0449440000000484)*(py*py)*(r01*r01)))+(((0.424)*r01*r02*(py*py*py)))+(((8.8e-7)*cj0*pz*r01*r02*(px*px)))+(((4.0)*px*py*r00*r01*(pz*pz)*(sj0*sj0)))+(((-0.005318656)*py*r01*r02*(cj0*cj0)))+(((-1.272)*py*r01*r02*(pz*pz)))+(((8.8e-7)*px*sj0*(py*py)*(r01*r01)))+(((0.039712)*px*pz*r00*r02*(sj0*sj0)))+(((4.0)*py*pz*r01*r02*(cj0*cj0)*(px*px)))+(((1.272)*cj0*px*r01*r02*sj0*(py*py)))+(((0.424)*px*r00*r02*(py*py)*(sj0*sj0)))+(((4.0)*px*pz*r00*r02*(py*py)))+(((2.0)*(py*py)*(pz*pz)*(r02*r02)))+(((-1.103872e-8)*cj0*pz*r01*r02))+(((0.424)*pz*(py*py)*(r02*r02)))+(((-5.51936e-9)*cj0*px*r00*r01))+(((-4.0)*(px*px)*(py*py)*(r01*r01)*(sj0*sj0)))+(((4.4e-7)*py*r00*r01*sj0*(pz*pz)))+(((-1.0)*(cj0*cj0)*(px*px*px*px)*(r01*r01)))+(((-1.0)*(py*py*py*py)*(r00*r00)*(sj0*sj0)))+(((0.039712)*px*py*r00*r01*(cj0*cj0)))+(((8.8e-7)*px*py*pz*r01*r02*sj0))+(((-9.328e-8)*cj0*py*pz*(r02*r02)))+(((-4.4e-7)*cj0*(py*py*py)*(r01*r01)))+(((0.005318656)*cj0*py*r00*r02*sj0))+(((-0.019856)*(py*py)*(r00*r00)*(sj0*sj0)))+(((-1.0)*(px*px*px*px)*(r02*r02)))+(((-4.0)*(cj0*cj0)*(py*py)*(pz*pz)*(r02*r02)))+(((12.0)*cj0*py*pz*r00*r02*sj0*(px*px)))+(((-0.0449440000000484)*(px*px)*(r00*r00)))+(((-0.848)*py*r01*r02*(px*px)*(sj0*sj0)))+(((-0.0898880000000968)*px*py*r00*r01)));
431 op[1]=((((1.696)*px*sj0*(py*py)*(r01*r01)))+(((1.696)*cj0*pz*r01*r02*(px*px)))+(((0.179775999999806)*px*py*r01*r02*sj0))+(((-8.8e-7)*r00*r02*(px*px*px)))+(((-8.8e-7)*pz*(px*px)*(r02*r02)))+(((-0.179775999999806)*cj0*px*pz*r00*r01))+(((-0.848)*cj0*py*(pz*pz)*(r01*r01)))+(((-0.848)*cj0*px*r00*r01*(pz*pz)))+(((-0.848)*cj0*(py*py*py)*(r01*r01)))+(((1.8656e-7)*(py*py)*(r00*r00)*(sj0*sj0)))+(((-1.696)*cj0*px*py*pz*r00*r02))+(((-8.8e-7)*px*r00*r02*(py*py)))+(((-0.010637312)*cj0*py*(r01*r01)))+(((-8.8e-7)*py*r01*r02*(cj0*cj0)*(px*px)))+(((-0.848)*px*sj0*(py*py)*(r00*r00)))+(((1.103872e-8)*px*r00*r02*(sj0*sj0)))+(((-2.64e-6)*cj0*py*r00*r02*sj0*(px*px)))+(((2.207744e-8)*cj0*pz*r00*r01*sj0))+(((-2.34020864e-9)*(r00*r00)*(sj0*sj0)))+(((-1.8656e-7)*(cj0*cj0)*(py*py)*(r01*r01)))+(((2.544)*py*r00*r01*sj0*(px*px)))+(((-1.76e-6)*px*py*pz*r00*r01*(cj0*cj0)))+(((0.848)*sj0*(px*px*px)*(r00*r00)))+(((0.00225511014399757)*r00*r02*sj0))+(((-0.179775999999806)*r00*r02*sj0*(py*py)))+(((1.8656e-7)*(cj0*cj0)*(px*px)*(r01*r01)))+(((1.76e-6)*pz*(px*px)*(r02*r02)*(sj0*sj0)))+(((0.010637312)*py*r00*r01*sj0))+(((8.8e-7)*(pz*pz*pz)*(r00*r00)*(sj0*sj0)))+(((-3.7312e-7)*py*pz*r01*r02*(cj0*cj0)))+(((-0.179775999999806)*cj0*py*pz*(r01*r01)))+(((-1.696)*pz*r00*r02*sj0*(py*py)))+(((-2.64e-6)*py*r01*r02*(cj0*cj0)*(pz*pz)))+(((1.76e-6)*pz*(px*px)*(r00*r00)))+(((0.179775999999806)*px*pz*sj0*(r02*r02)))+(((1.76e-6)*cj0*px*py*pz*sj0*(r01*r01)))+(((-3.7312e-7)*px*pz*r00*r02*(sj0*sj0)))+(((3.7312e-7)*cj0*px*py*sj0*(r00*r00)))+(((-1.103872e-8)*pz*(cj0*cj0)*(r01*r01)))+(((-3.52e-6)*cj0*px*py*pz*sj0*(r02*r02)))+(((3.7312e-7)*cj0*py*pz*r00*r02*sj0))+(((-1.8656e-7)*(px*px)*(r02*r02)))+(((8.8e-7)*pz*(py*py)*(r00*r00)*(sj0*sj0)))+(((-0.848)*cj0*py*(px*px)*(r02*r02)))+(((0.848)*sj0*(px*px*px)*(r02*r02)))+(((1.8656e-7)*(pz*pz)*(r00*r00)*(sj0*sj0)))+(((3.7312e-7)*cj0*px*py*sj0*(r01*r01)))+(((-8.8e-7)*pz*(py*py)*(r02*r02)))+(((8.8e-7)*cj0*r01*r02*sj0*(px*px*px)))+(((-1.76e-6)*cj0*r00*r01*sj0*(pz*pz*pz)))+(((-1.103872e-8)*pz*(r00*r00)*(sj0*sj0)))+(((1.103872e-8)*py*r01*r02))+(((-1.103872e-8)*cj0*px*r01*r02*sj0))+(((2.64e-6)*cj0*px*r01*r02*sj0*(pz*pz)))+(((-3.7312e-7)*cj0*r00*r01*sj0*(pz*pz)))+(((3.7312e-7)*cj0*px*pz*r01*r02*sj0))+(((2.64e-6)*py*r01*r02*(pz*pz)))+(((0.179775999999806)*cj0*r01*r02*(px*px)))+(((0.010637312)*px*sj0*(r00*r00)))+(((-2.34020864e-9)*(cj0*cj0)*(r01*r01)))+(((1.76e-6)*pz*(cj0*cj0)*(py*py)*(r02*r02)))+(((8.8e-7)*(cj0*cj0)*(pz*pz*pz)*(r01*r01)))+(((-0.00225511014399757)*cj0*r01*r02))+(((2.64e-6)*px*r00*r02*(pz*pz)))+(((1.76e-6)*pz*(py*py)*(r01*r01)))+(((0.848)*py*r00*r01*sj0*(pz*pz)))+(((2.64e-6)*cj0*py*r00*r02*sj0*(pz*pz)))+(((0.848)*px*sj0*(py*py)*(r02*r02)))+(((3.52e-6)*px*py*pz*r00*r01))+(((8.8e-7)*(pz*pz*pz)*(r02*r02)))+(((0.021274624)*pz*r00*r02*sj0))+(((-0.179775999999806)*cj0*px*py*r00*r02))+(((1.8656e-7)*(cj0*cj0)*(pz*pz)*(r01*r01)))+(((-2.64e-6)*px*r00*r02*(pz*pz)*(sj0*sj0)))+(((-0.848)*cj0*py*(pz*pz)*(r02*r02)))+(((-0.848)*cj0*(py*py*py)*(r02*r02)))+(((0.179775999999806)*px*pz*sj0*(r00*r00)))+(((1.8656e-7)*(pz*pz)*(r02*r02)))+(((1.696)*px*py*pz*r01*r02*sj0))+(((-1.696)*cj0*py*(px*px)*(r00*r00)))+(((-8.8e-7)*px*r00*r02*(py*py)*(sj0*sj0)))+(((-1.103872e-8)*cj0*py*r00*r02*sj0))+(((0.848)*cj0*py*(px*px)*(r01*r01)))+(((-1.76e-6)*px*py*pz*r00*r01*(sj0*sj0)))+(((1.103872e-8)*px*r00*r02))+(((-8.8e-7)*pz*(px*px)*(r00*r00)*(sj0*sj0)))+(((4.68041728e-9)*cj0*r00*r01*sj0))+(((-0.021274624)*cj0*pz*r01*r02))+(((2.34020864e-9)*(r02*r02)))+(((8.8e-7)*r00*r02*(px*px*px)*(sj0*sj0)))+(((-0.848)*r00*r01*sj0*(py*py*py)))+(((-8.8e-7)*py*r01*r02*(px*px)))+(((-2.64e-6)*cj0*px*r01*r02*sj0*(py*py)))+(((-3.7312e-7)*px*py*r00*r01*(cj0*cj0)))+(((3.7312e-7)*px*pz*r00*r02))+(((-1.8656e-7)*(py*py)*(r02*r02)))+(((1.76e-6)*cj0*px*py*pz*sj0*(r00*r00)))+(((-8.8e-7)*r01*r02*(py*py*py)))+(((-0.010637312)*cj0*px*r00*r01))+(((0.179775999999806)*py*pz*r00*r01*sj0))+(((8.8e-7)*cj0*r00*r02*sj0*(py*py*py)))+(((0.848)*px*sj0*(pz*pz)*(r00*r00)))+(((1.76e-6)*py*r01*r02*(px*px)*(sj0*sj0)))+(((0.848)*px*sj0*(pz*pz)*(r02*r02)))+(((8.8e-7)*pz*(cj0*cj0)*(px*px)*(r01*r01)))+(((1.103872e-8)*pz*(r02*r02)))+(((1.103872e-8)*py*r01*r02*(cj0*cj0)))+(((3.7312e-7)*py*pz*r01*r02))+(((0.010637312)*cj0*py*(r02*r02)))+(((-0.179775999999806)*cj0*py*pz*(r02*r02)))+(((-0.010637312)*px*sj0*(r02*r02)))+(((-3.7312e-7)*px*py*r00*r01*(sj0*sj0)))+(((-1.8656e-7)*(px*px)*(r00*r00)*(sj0*sj0)))+(((-2.544)*cj0*px*r00*r01*(py*py)))+(((0.848)*cj0*r00*r01*(px*px*px)))+(((-8.8e-7)*pz*(cj0*cj0)*(py*py)*(r01*r01)))+(((1.76e-6)*px*r00*r02*(cj0*cj0)*(py*py)))+(((8.8e-7)*r01*r02*(cj0*cj0)*(py*py*py))));
432 op[2]=((((-8.0)*cj0*px*py*sj0*(pz*pz)*(r01*r01)))+(((0.0794239999996128)*px*pz*r00*r02))+(((7.02062592e-9)*cj0*r01*r02))+(((-2.0)*(px*px*px*px)*(r00*r00)*(sj0*sj0)))+(((-8.0)*px*r00*r02*(pz*pz*pz)))+(((-2.0)*(pz*pz*pz*pz)*(r00*r00)*(sj0*sj0)))+(((-2.0)*(cj0*cj0)*(pz*pz*pz*pz)*(r01*r01)))+(((-8.0)*cj0*pz*r01*r02*sj0*(px*px*px)))+(((8.0)*px*py*r00*r01*(pz*pz)*(sj0*sj0)))+(((0.00288451788799514)*cj0*r00*r01*sj0))+(((-2.0)*(cj0*cj0)*(px*px*px*px)*(r01*r01)))+(((-2.0)*(px*px*px*px)*(r02*r02)))+(((-0.140063999999806)*(px*px)*(r00*r00)*(sj0*sj0)))+(((0.280127999999613)*cj0*py*pz*r00*r02*sj0))+(((0.00194040627199879)*(r02*r02)))+(((5.5968e-7)*cj0*px*py*r00*r02))+(((4.0)*(px*px)*(pz*pz)*(r00*r00)*(sj0*sj0)))+(((8.0)*px*r00*r02*(pz*pz*pz)*(sj0*sj0)))+(((4.0)*(px*px)*(pz*pz)*(r02*r02)))+(((-2.0)*(py*py*py*py)*(r00*r00)*(sj0*sj0)))+(((24.0)*cj0*px*pz*r01*r02*sj0*(py*py)))+(((-0.00144225894399757)*(r00*r00)*(sj0*sj0)))+(((0.140063999999806)*(pz*pz)*(r00*r00)*(sj0*sj0)))+(((-8.0)*(px*px)*(pz*pz)*(r00*r00)))+(((-8.0)*(px*px)*(pz*pz)*(r02*r02)*(sj0*sj0)))+(((8.0)*pz*r01*r02*(py*py*py)))+(((0.280127999999613)*cj0*px*py*sj0*(r00*r00)))+(((-4.0)*cj0*r00*r01*sj0*(py*py*py*py)))+(((-0.140063999999806)*(cj0*cj0)*(py*py)*(r01*r01)))+(((-8.0)*py*r01*r02*(pz*pz*pz)))+(((4.0)*(cj0*cj0)*(px*px)*(py*py)*(r01*r01)))+(((-2.0)*(pz*pz*pz*pz)*(r02*r02)))+(((-8.0)*px*r00*r01*(cj0*cj0)*(py*py*py)))+(((-8.0)*(cj0*cj0)*(py*py)*(pz*pz)*(r02*r02)))+(((8.0)*px*pz*r00*r02*(py*py)*(sj0*sj0)))+(((24.0)*cj0*py*pz*r00*r02*sj0*(px*px)))+(((-5.5968e-7)*px*pz*sj0*(r02*r02)))+(((-8.0)*cj0*pz*r00*r02*sj0*(py*py*py)))+(((-5.5968e-7)*py*pz*r00*r01*sj0))+(((-8.0)*pz*r00*r02*(px*px*px)*(sj0*sj0)))+(((8.0)*py*r00*r01*(cj0*cj0)*(px*px*px)))+(((-0.129599999999903)*(py*py)*(r02*r02)))+(((8.0)*px*r00*r01*(py*py*py)*(sj0*sj0)))+(((-4.0)*(px*px)*(py*py)*(r02*r02)))+(((-16.0)*px*pz*r00*r02*(cj0*cj0)*(py*py)))+(((8.0)*cj0*px*sj0*(py*py*py)*(r01*r01)))+(((-0.129599999999903)*(px*px)*(r02*r02)))+(((-8.0)*(cj0*cj0)*(px*px)*(py*py)*(r00*r00)))+(((0.280127999999613)*cj0*px*pz*r01*r02*sj0))+(((0.140063999999806)*(cj0*cj0)*(pz*pz)*(r01*r01)))+(((4.0)*cj0*r00*r01*sj0*(pz*pz*pz*pz)))+(((-5.5968e-7)*px*pz*sj0*(r00*r00)))+(((8.0)*px*py*r00*r01*(cj0*cj0)*(pz*pz)))+(((0.0794239999996128)*py*pz*r01*r02))+(((-0.280127999999613)*px*py*r00*r01*(sj0*sj0)))+(((-4.0)*(cj0*cj0)*(px*px)*(pz*pz)*(r01*r01)))+(((-0.280127999999613)*px*pz*r00*r02*(sj0*sj0)))+(((24.0)*cj0*r00*r01*sj0*(px*px)*(py*py)))+(((4.0)*(cj0*cj0)*(py*py)*(pz*pz)*(r01*r01)))+(((8.0)*cj0*py*sj0*(px*px*px)*(r00*r00)))+(((0.140063999999806)*(cj0*cj0)*(px*px)*(r01*r01)))+(((-0.280127999999613)*px*py*r00*r01*(cj0*cj0)))+(((-16.0)*py*pz*r01*r02*(px*px)*(sj0*sj0)))+(((8.0)*py*pz*r01*r02*(cj0*cj0)*(px*px)))+(((8.0)*py*r01*r02*(cj0*cj0)*(pz*pz*pz)))+(((0.280127999999613)*cj0*px*py*sj0*(r01*r01)))+(((-8.0)*pz*r01*r02*(cj0*cj0)*(py*py*py)))+(((16.0)*cj0*px*py*sj0*(pz*pz)*(r02*r02)))+(((-8.0)*py*r00*r01*(px*px*px)*(sj0*sj0)))+(((0.0397119999998064)*(pz*pz)*(r02*r02)))+(((0.140063999999806)*(py*py)*(r00*r00)*(sj0*sj0)))+(((8.0)*py*pz*r01*r02*(px*px)))+(((-16.0)*px*py*r00*r01*(pz*pz)))+(((5.5968e-7)*cj0*py*pz*(r01*r01)))+(((4.0)*(px*px)*(py*py)*(r00*r00)*(sj0*sj0)))+(((-8.0)*cj0*px*py*sj0*(pz*pz)*(r00*r00)))+(((-0.280127999999613)*cj0*r00*r01*sj0*(pz*pz)))+(((-2.0)*(py*py*py*py)*(r02*r02)))+(((-5.5968e-7)*cj0*r01*r02*(px*px)))+(((-2.0)*(cj0*cj0)*(py*py*py*py)*(r01*r01)))+(((-8.0)*(px*px)*(py*py)*(r01*r01)*(sj0*sj0)))+(((5.5968e-7)*cj0*py*pz*(r02*r02)))+(((-8.0)*cj0*py*r00*r02*sj0*(pz*pz*pz)))+(((8.0)*pz*r00*r02*(px*px*px)))+(((-5.5968e-7)*px*py*r01*r02*sj0))+(((-4.0)*cj0*r00*r01*sj0*(px*px*px*px)))+(((8.0)*px*pz*r00*r02*(py*py)))+(((-0.0898880000000968)*(py*py)*(r01*r01)))+(((-8.0)*cj0*px*r01*r02*sj0*(pz*pz*pz)))+(((5.5968e-7)*cj0*px*pz*r00*r01))+(((-8.0)*(py*py)*(pz*pz)*(r01*r01)))+(((4.0)*(py*py)*(pz*pz)*(r02*r02)))+(((-0.179776000000194)*px*py*r00*r01))+(((-0.00144225894399757)*(cj0*cj0)*(r01*r01)))+(((-7.02062592e-9)*r00*r02*sj0))+(((-0.280127999999613)*py*pz*r01*r02*(cj0*cj0)))+(((-8.0)*cj0*px*sj0*(py*py*py)*(r00*r00)))+(((-8.0)*cj0*py*sj0*(px*px*px)*(r01*r01)))+(((5.5968e-7)*r00*r02*sj0*(py*py)))+(((-4.0)*(py*py)*(pz*pz)*(r00*r00)*(sj0*sj0)))+(((-0.0898880000000968)*(px*px)*(r00*r00))));
433 op[3]=((((1.696)*px*sj0*(py*py)*(r01*r01)))+(((1.696)*cj0*pz*r01*r02*(px*px)))+(((-3.7312e-7)*px*pz*r00*r02))+(((-2.34020864e-9)*(r02*r02)))+(((0.179775999999806)*r00*r02*sj0*(py*py)))+(((-3.7312e-7)*cj0*px*py*sj0*(r01*r01)))+(((-8.8e-7)*r00*r02*(px*px*px)))+(((-8.8e-7)*pz*(px*px)*(r02*r02)))+(((-0.179775999999806)*px*py*r01*r02*sj0))+(((-0.848)*cj0*py*(pz*pz)*(r01*r01)))+(((2.34020864e-9)*(r00*r00)*(sj0*sj0)))+(((-0.848)*cj0*px*r00*r01*(pz*pz)))+(((-3.7312e-7)*cj0*px*pz*r01*r02*sj0))+(((-0.848)*cj0*(py*py*py)*(r01*r01)))+(((-1.696)*cj0*px*py*pz*r00*r02))+(((-8.8e-7)*px*r00*r02*(py*py)))+(((-0.010637312)*cj0*py*(r01*r01)))+(((-8.8e-7)*py*r01*r02*(cj0*cj0)*(px*px)))+(((-0.848)*px*sj0*(py*py)*(r00*r00)))+(((1.103872e-8)*px*r00*r02*(sj0*sj0)))+(((-2.64e-6)*cj0*py*r00*r02*sj0*(px*px)))+(((3.7312e-7)*px*py*r00*r01*(cj0*cj0)))+(((-1.8656e-7)*(pz*pz)*(r00*r00)*(sj0*sj0)))+(((2.207744e-8)*cj0*pz*r00*r01*sj0))+(((1.8656e-7)*(px*px)*(r00*r00)*(sj0*sj0)))+(((2.544)*py*r00*r01*sj0*(px*px)))+(((-4.68041728e-9)*cj0*r00*r01*sj0))+(((-0.00225511014399757)*r00*r02*sj0))+(((-1.76e-6)*px*py*pz*r00*r01*(cj0*cj0)))+(((0.848)*sj0*(px*px*px)*(r00*r00)))+(((3.7312e-7)*px*pz*r00*r02*(sj0*sj0)))+(((0.179775999999806)*cj0*py*pz*(r02*r02)))+(((1.76e-6)*pz*(px*px)*(r02*r02)*(sj0*sj0)))+(((0.010637312)*py*r00*r01*sj0))+(((8.8e-7)*(pz*pz*pz)*(r00*r00)*(sj0*sj0)))+(((2.34020864e-9)*(cj0*cj0)*(r01*r01)))+(((-1.8656e-7)*(cj0*cj0)*(px*px)*(r01*r01)))+(((-1.696)*pz*r00*r02*sj0*(py*py)))+(((-2.64e-6)*py*r01*r02*(cj0*cj0)*(pz*pz)))+(((3.7312e-7)*cj0*r00*r01*sj0*(pz*pz)))+(((-0.179775999999806)*py*pz*r00*r01*sj0))+(((1.76e-6)*pz*(px*px)*(r00*r00)))+(((1.76e-6)*cj0*px*py*pz*sj0*(r01*r01)))+(((-1.103872e-8)*pz*(cj0*cj0)*(r01*r01)))+(((-3.52e-6)*cj0*px*py*pz*sj0*(r02*r02)))+(((8.8e-7)*pz*(py*py)*(r00*r00)*(sj0*sj0)))+(((-0.848)*cj0*py*(px*px)*(r02*r02)))+(((0.179775999999806)*cj0*px*pz*r00*r01))+(((0.848)*sj0*(px*px*px)*(r02*r02)))+(((1.8656e-7)*(py*py)*(r02*r02)))+(((-0.179775999999806)*cj0*r01*r02*(px*px)))+(((-8.8e-7)*pz*(py*py)*(r02*r02)))+(((8.8e-7)*cj0*r01*r02*sj0*(px*px*px)))+(((-1.76e-6)*cj0*r00*r01*sj0*(pz*pz*pz)))+(((-1.8656e-7)*(py*py)*(r00*r00)*(sj0*sj0)))+(((-1.103872e-8)*pz*(r00*r00)*(sj0*sj0)))+(((1.103872e-8)*py*r01*r02))+(((-1.103872e-8)*cj0*px*r01*r02*sj0))+(((2.64e-6)*cj0*px*r01*r02*sj0*(pz*pz)))+(((2.64e-6)*py*r01*r02*(pz*pz)))+(((0.010637312)*px*sj0*(r00*r00)))+(((1.76e-6)*pz*(cj0*cj0)*(py*py)*(r02*r02)))+(((-1.8656e-7)*(cj0*cj0)*(pz*pz)*(r01*r01)))+(((8.8e-7)*(cj0*cj0)*(pz*pz*pz)*(r01*r01)))+(((2.64e-6)*px*r00*r02*(pz*pz)))+(((1.76e-6)*pz*(py*py)*(r01*r01)))+(((0.848)*py*r00*r01*sj0*(pz*pz)))+(((-3.7312e-7)*cj0*px*py*sj0*(r00*r00)))+(((-0.179775999999806)*px*pz*sj0*(r02*r02)))+(((2.64e-6)*cj0*py*r00*r02*sj0*(pz*pz)))+(((0.848)*px*sj0*(py*py)*(r02*r02)))+(((3.52e-6)*px*py*pz*r00*r01))+(((8.8e-7)*(pz*pz*pz)*(r02*r02)))+(((0.021274624)*pz*r00*r02*sj0))+(((1.8656e-7)*(cj0*cj0)*(py*py)*(r01*r01)))+(((-2.64e-6)*px*r00*r02*(pz*pz)*(sj0*sj0)))+(((-0.848)*cj0*py*(pz*pz)*(r02*r02)))+(((-0.848)*cj0*(py*py*py)*(r02*r02)))+(((1.696)*px*py*pz*r01*r02*sj0))+(((-1.696)*cj0*py*(px*px)*(r00*r00)))+(((3.7312e-7)*px*py*r00*r01*(sj0*sj0)))+(((-8.8e-7)*px*r00*r02*(py*py)*(sj0*sj0)))+(((-1.103872e-8)*cj0*py*r00*r02*sj0))+(((-3.7312e-7)*cj0*py*pz*r00*r02*sj0))+(((0.848)*cj0*py*(px*px)*(r01*r01)))+(((-1.76e-6)*px*py*pz*r00*r01*(sj0*sj0)))+(((1.103872e-8)*px*r00*r02))+(((1.8656e-7)*(px*px)*(r02*r02)))+(((-8.8e-7)*pz*(px*px)*(r00*r00)*(sj0*sj0)))+(((-0.021274624)*cj0*pz*r01*r02))+(((8.8e-7)*r00*r02*(px*px*px)*(sj0*sj0)))+(((-0.848)*r00*r01*sj0*(py*py*py)))+(((-8.8e-7)*py*r01*r02*(px*px)))+(((-1.8656e-7)*(pz*pz)*(r02*r02)))+(((-2.64e-6)*cj0*px*r01*r02*sj0*(py*py)))+(((-0.179775999999806)*px*pz*sj0*(r00*r00)))+(((0.179775999999806)*cj0*py*pz*(r01*r01)))+(((1.76e-6)*cj0*px*py*pz*sj0*(r00*r00)))+(((-8.8e-7)*r01*r02*(py*py*py)))+(((-0.010637312)*cj0*px*r00*r01))+(((8.8e-7)*cj0*r00*r02*sj0*(py*py*py)))+(((3.7312e-7)*py*pz*r01*r02*(cj0*cj0)))+(((0.00225511014399757)*cj0*r01*r02))+(((0.848)*px*sj0*(pz*pz)*(r00*r00)))+(((0.179775999999806)*cj0*px*py*r00*r02))+(((1.76e-6)*py*r01*r02*(px*px)*(sj0*sj0)))+(((0.848)*px*sj0*(pz*pz)*(r02*r02)))+(((8.8e-7)*pz*(cj0*cj0)*(px*px)*(r01*r01)))+(((-3.7312e-7)*py*pz*r01*r02))+(((1.103872e-8)*pz*(r02*r02)))+(((1.103872e-8)*py*r01*r02*(cj0*cj0)))+(((0.010637312)*cj0*py*(r02*r02)))+(((-0.010637312)*px*sj0*(r02*r02)))+(((-2.544)*cj0*px*r00*r01*(py*py)))+(((0.848)*cj0*r00*r01*(px*px*px)))+(((-8.8e-7)*pz*(cj0*cj0)*(py*py)*(r01*r01)))+(((1.76e-6)*px*r00*r02*(cj0*cj0)*(py*py)))+(((8.8e-7)*r01*r02*(cj0*cj0)*(py*py*py))));
434 op[4]=((((1.32e-6)*cj0*px*r00*r01*(py*py)))+(((-1.0)*(cj0*cj0)*(py*py*py*py)*(r01*r01)))+(((4.4e-7)*cj0*px*r00*r01*(pz*pz)))+(((8.8e-7)*cj0*py*(px*px)*(r00*r00)))+(((1.17010432e-9)*r00*r02*sj0))+(((-8.0)*px*pz*r00*r02*(cj0*cj0)*(py*py)))+(((2.0)*(cj0*cj0)*(py*py)*(pz*pz)*(r01*r01)))+(((-4.0)*cj0*pz*r01*r02*sj0*(px*px*px)))+(((0.039712)*cj0*r00*r01*sj0*(pz*pz)))+(((2.0)*cj0*r00*r01*sj0*(pz*pz*pz*pz)))+(((4.0)*py*r00*r01*(cj0*cj0)*(px*px*px)))+(((8.0)*cj0*px*py*sj0*(pz*pz)*(r02*r02)))+(((-0.140064)*py*pz*r01*r02))+(((-8.0)*py*pz*r01*r02*(px*px)*(sj0*sj0)))+(((4.0)*cj0*py*sj0*(px*px*px)*(r00*r00)))+(((-1.272)*cj0*px*r01*r02*sj0*(py*py)))+(((-4.0)*(px*px)*(pz*pz)*(r02*r02)*(sj0*sj0)))+(((-4.0)*(px*px)*(pz*pz)*(r00*r00)))+(((-0.848)*px*py*pz*r00*r01*(sj0*sj0)))+(((-4.4e-7)*cj0*py*(px*px)*(r01*r01)))+(((-4.4e-7)*py*r00*r01*sj0*(pz*pz)))+(((-4.0)*px*r00*r01*(cj0*cj0)*(py*py*py)))+(((0.424)*cj0*r01*r02*sj0*(px*px*px)))+(((-0.424)*py*r01*r02*(cj0*cj0)*(px*px)))+(((-0.039712)*cj0*py*pz*r00*r02*sj0))+(((2.0)*(px*px)*(py*py)*(r00*r00)*(sj0*sj0)))+(((-1.0)*(px*px*px*px)*(r00*r00)*(sj0*sj0)))+(((1.272)*cj0*px*r01*r02*sj0*(pz*pz)))+(((-1.0)*(cj0*cj0)*(pz*pz*pz*pz)*(r01*r01)))+(((0.848)*py*r01*r02*(px*px)*(sj0*sj0)))+(((-4.0)*cj0*px*r01*r02*sj0*(pz*pz*pz)))+(((-1.272)*px*r00*r02*(pz*pz)*(sj0*sj0)))+(((-4.0)*py*r00*r01*(px*px*px)*(sj0*sj0)))+(((-1.32e-6)*py*r00*r01*sj0*(px*px)))+(((4.0)*px*py*r00*r01*(cj0*cj0)*(pz*pz)))+(((0.0250879999999516)*(px*px)*(r02*r02)))+(((-0.019856)*(cj0*cj0)*(px*px)*(r01*r01)))+(((4.4e-7)*cj0*py*(pz*pz)*(r02*r02)))+(((12.0)*cj0*px*pz*r01*r02*sj0*(py*py)))+(((-4.0)*cj0*py*r00*r02*sj0*(pz*pz*pz)))+(((-0.019856)*(cj0*cj0)*(pz*pz)*(r01*r01)))+(((0.424)*cj0*r00*r02*sj0*(py*py*py)))+(((-4.4e-7)*px*sj0*(pz*pz)*(r02*r02)))+(((-2.0)*(px*px)*(py*py)*(r02*r02)))+(((-4.0)*cj0*px*py*sj0*(pz*pz)*(r01*r01)))+(((-8.0)*px*py*r00*r01*(pz*pz)))+(((0.848)*cj0*px*py*pz*sj0*(r01*r01)))+(((2.0)*(cj0*cj0)*(px*px)*(py*py)*(r01*r01)))+(((-0.039712)*cj0*px*py*sj0*(r01*r01)))+(((-0.424)*py*r01*r02*(px*px)))+(((0.424)*(pz*pz*pz)*(r02*r02)))+(((-5.51936e-9)*cj0*py*(r02*r02)))+(((0.424)*(pz*pz*pz)*(r00*r00)*(sj0*sj0)))+(((-0.000157351935999393)*(r02*r02)))+(((0.019856)*(cj0*cj0)*(py*py)*(r01*r01)))+(((0.424)*(cj0*cj0)*(pz*pz*pz)*(r01*r01)))+(((-0.019856)*(pz*pz)*(r00*r00)*(sj0*sj0)))+(((0.424)*r00*r02*(px*px*px)*(sj0*sj0)))+(((-0.005318656)*pz*(r00*r00)*(sj0*sj0)))+(((-4.0)*cj0*px*sj0*(py*py*py)*(r00*r00)))+(((-2.0)*cj0*r00*r01*sj0*(py*py*py*py)))+(((2.0)*(px*px)*(pz*pz)*(r00*r00)*(sj0*sj0)))+(((-0.039712)*cj0*px*py*sj0*(r00*r00)))+(((0.039712)*py*pz*r01*r02*(cj0*cj0)))+(((-9.328e-8)*cj0*px*py*r00*r02))+(((-1.272)*cj0*py*r00*r02*sj0*(px*px)))+(((4.4e-7)*px*sj0*(py*py)*(r00*r00)))+(((-0.039712)*cj0*px*pz*r01*r02*sj0))+(((4.0)*pz*r01*r02*(py*py*py)))+(((-0.005318656)*cj0*px*r01*r02*sj0))+(((0.010637312)*cj0*pz*r00*r01*sj0))+(((0.848)*cj0*px*py*pz*sj0*(r00*r00)))+(((5.51936e-9)*px*sj0*(r02*r02)))+(((-0.848)*px*py*pz*r00*r01*(cj0*cj0)))+(((1.103872e-8)*cj0*pz*r01*r02))+(((-0.424)*pz*(px*px)*(r02*r02)))+(((0.424)*pz*(cj0*cj0)*(px*px)*(r01*r01)))+(((-4.4e-7)*cj0*r00*r01*(px*px*px)))+(((-4.0)*py*r01*r02*(pz*pz*pz)))+(((-4.0)*cj0*pz*r00*r02*sj0*(py*py*py)))+(((-0.424)*px*r00*r02*(py*py)))+(((-4.0)*cj0*py*sj0*(px*px*px)*(r01*r01)))+(((-1.17010432e-9)*cj0*r01*r02))+(((4.0)*px*r00*r01*(py*py*py)*(sj0*sj0)))+(((4.0)*py*pz*r01*r02*(px*px)))+(((9.328e-8)*py*pz*r00*r01*sj0))+(((1.272)*py*r01*r02*(pz*pz)))+(((5.51936e-9)*cj0*py*(r01*r01)))+(((4.4e-7)*cj0*py*(pz*pz)*(r01*r01)))+(((-9.328e-8)*r00*r02*sj0*(py*py)))+(((0.005318656)*px*r00*r02*(sj0*sj0)))+(((-0.424)*r01*r02*(py*py*py)))+(((9.328e-8)*px*pz*sj0*(r00*r00)))+(((4.0)*cj0*px*sj0*(py*py*py)*(r01*r01)))+(((4.0)*pz*r00*r02*(px*px*px)))+(((0.005318656)*px*r00*r02))+(((4.4e-7)*cj0*(py*py*py)*(r02*r02)))+(((0.0250879999999516)*(py*py)*(r02*r02)))+(((0.424)*pz*(py*py)*(r00*r00)*(sj0*sj0)))+(((1.272)*cj0*py*r00*r02*sj0*(pz*pz)))+(((-1.103872e-8)*pz*r00*r02*sj0))+(((-4.0)*pz*r01*r02*(cj0*cj0)*(py*py*py)))+(((0.005318656)*pz*(r02*r02)))+(((-0.005318656)*pz*(cj0*cj0)*(r01*r01)))+(((-0.140064)*px*pz*r00*r02))+(((0.005318656)*py*r01*r02))+(((-4.0)*cj0*px*py*sj0*(pz*pz)*(r00*r00)))+(((-4.0)*pz*r00*r02*(px*px*px)*(sj0*sj0)))+(((-2.0)*(py*py)*(pz*pz)*(r00*r00)*(sj0*sj0)))+(((-0.424)*px*r00*r02*(py*py)*(sj0*sj0)))+(((-9.328e-8)*cj0*py*pz*(r01*r01)))+(((2.0)*(px*px)*(pz*pz)*(r02*r02)))+(((-0.848)*cj0*r00*r01*sj0*(pz*pz*pz)))+(((-0.0008128512)*cj0*r00*r01*sj0))+(((-1.0)*(py*py*py*py)*(r02*r02)))+(((-0.005318656)*cj0*py*r00*r02*sj0))+(((0.019856)*(px*px)*(r00*r00)*(sj0*sj0)))+(((-2.0)*(cj0*cj0)*(px*px)*(pz*pz)*(r01*r01)))+(((4.0)*px*r00*r02*(pz*pz*pz)*(sj0*sj0)))+(((-4.4e-7)*px*sj0*(py*py)*(r02*r02)))+(((-1.696)*cj0*px*py*pz*sj0*(r02*r02)))+(((-0.070032)*(pz*pz)*(r02*r02)))+(((-8.8e-7)*px*sj0*(py*py)*(r01*r01)))+(((8.8e-7)*cj0*px*py*pz*r00*r02))+(((-2.0)*cj0*r00*r01*sj0*(px*px*px*px)))+(((0.0004064256)*(cj0*cj0)*(r01*r01)))+(((-0.424)*r00*r02*(px*px*px)))+(((-1.0)*(pz*pz*pz*pz)*(r00*r00)*(sj0*sj0)))+(((4.0)*px*pz*r00*r02*(py*py)*(sj0*sj0)))+(((-0.424)*pz*(px*px)*(r00*r00)*(sj0*sj0)))+(((9.328e-8)*px*pz*sj0*(r02*r02)))+(((0.848)*pz*(py*py)*(r01*r01)))+(((-8.8e-7)*cj0*pz*r01*r02*(px*px)))+(((0.039712)*px*py*r00*r01*(sj0*sj0)))+(((0.424)*r01*r02*(cj0*cj0)*(py*py*py)))+(((-4.4e-7)*sj0*(px*px*px)*(r02*r02)))+(((4.0)*py*r01*r02*(cj0*cj0)*(pz*pz*pz)))+(((9.328e-8)*px*py*r01*r02*sj0))+(((-4.0)*(cj0*cj0)*(px*px)*(py*py)*(r00*r00)))+(((9.328e-8)*cj0*r01*r02*(px*px)))+(((-4.0)*(py*py)*(pz*pz)*(r01*r01)))+(((-1.0)*(pz*pz*pz*pz)*(r02*r02)))+(((-4.4e-7)*sj0*(px*px*px)*(r00*r00)))+(((12.0)*cj0*r00*r01*sj0*(px*px)*(py*py)))+(((-4.0)*px*r00*r02*(pz*pz*pz)))+(((0.0004064256)*(r00*r00)*(sj0*sj0)))+(((-9.328e-8)*cj0*px*pz*r00*r01))+(((0.848)*px*r00*r02*(cj0*cj0)*(py*py)))+(((-5.51936e-9)*py*r00*r01*sj0))+(((-5.51936e-9)*px*sj0*(r00*r00)))+(((-4.4e-7)*px*sj0*(pz*pz)*(r00*r00)))+(((-0.0449440000000484)*(py*py)*(r01*r01)))+(((-0.424)*pz*(cj0*cj0)*(py*py)*(r01*r01)))+(((0.848)*pz*(px*px)*(r02*r02)*(sj0*sj0)))+(((8.8e-7)*pz*r00*r02*sj0*(py*py)))+(((4.0)*px*py*r00*r01*(pz*pz)*(sj0*sj0)))+(((-8.8e-7)*px*py*pz*r01*r02*sj0))+(((0.039712)*px*pz*r00*r02*(sj0*sj0)))+(((4.0)*py*pz*r01*r02*(cj0*cj0)*(px*px)))+(((4.0)*px*pz*r00*r02*(py*py)))+(((2.0)*(py*py)*(pz*pz)*(r02*r02)))+(((0.848)*pz*(px*px)*(r00*r00)))+(((1.696)*px*py*pz*r00*r01))+(((0.005318656)*py*r01*r02*(cj0*cj0)))+(((0.848)*pz*(cj0*cj0)*(py*py)*(r02*r02)))+(((1.272)*px*r00*r02*(pz*pz)))+(((-1.272)*py*r01*r02*(cj0*cj0)*(pz*pz)))+(((-4.0)*(px*px)*(py*py)*(r01*r01)*(sj0*sj0)))+(((-1.0)*(cj0*cj0)*(px*px*px*px)*(r01*r01)))+(((-1.0)*(py*py*py*py)*(r00*r00)*(sj0*sj0)))+(((4.4e-7)*cj0*py*(px*px)*(r02*r02)))+(((0.039712)*px*py*r00*r01*(cj0*cj0)))+(((-9.328e-8)*cj0*py*pz*(r02*r02)))+(((-0.424)*pz*(py*py)*(r02*r02)))+(((-0.019856)*(py*py)*(r00*r00)*(sj0*sj0)))+(((5.51936e-9)*cj0*px*r00*r01))+(((-1.0)*(px*px*px*px)*(r02*r02)))+(((-4.0)*(cj0*cj0)*(py*py)*(pz*pz)*(r02*r02)))+(((12.0)*cj0*py*pz*r00*r02*sj0*(px*px)))+(((4.4e-7)*cj0*(py*py*py)*(r01*r01)))+(((4.4e-7)*r00*r01*sj0*(py*py*py)))+(((-0.0449440000000484)*(px*px)*(r00*r00)))+(((-0.0898880000000968)*px*py*r00*r01)));
435 polyroots4(op,zeror,numroots);
436 IkReal j1array[4], cj1array[4], sj1array[4], tempj1array[1];
437 int numsolutions = 0;
438 for(int ij1 = 0; ij1 < numroots; ++ij1)
439 {
440 IkReal htj1 = zeror[ij1];
441 tempj1array[0]=((2.0)*(atan(htj1)));
442 for(int kj1 = 0; kj1 < 1; ++kj1)
443 {
444 j1array[numsolutions] = tempj1array[kj1];
445 if( j1array[numsolutions] > IKPI )
446 {
447  j1array[numsolutions]-=IK2PI;
448 }
449 else if( j1array[numsolutions] < -IKPI )
450 {
451  j1array[numsolutions]+=IK2PI;
452 }
453 sj1array[numsolutions] = IKsin(j1array[numsolutions]);
454 cj1array[numsolutions] = IKcos(j1array[numsolutions]);
455 numsolutions++;
456 }
457 }
458 bool j1valid[4]={true,true,true,true};
459 _nj1 = 4;
460 for(int ij1 = 0; ij1 < numsolutions; ++ij1)
461  {
462 if( !j1valid[ij1] )
463 {
464  continue;
465 }
466  j1 = j1array[ij1]; cj1 = cj1array[ij1]; sj1 = sj1array[ij1];
467 htj1 = IKtan(j1/2);
468 
469 _ij1[0] = ij1; _ij1[1] = -1;
470 for(int iij1 = ij1+1; iij1 < numsolutions; ++iij1)
471 {
472 if( j1valid[iij1] && IKabs(cj1array[ij1]-cj1array[iij1]) < IKFAST_SOLUTION_THRESH && IKabs(sj1array[ij1]-sj1array[iij1]) < IKFAST_SOLUTION_THRESH )
473 {
474  j1valid[iij1]=false; _ij1[1] = iij1; break;
475 }
476 }
477 {
478 IkReal j5array[2], cj5array[2], sj5array[2];
479 bool j5valid[2]={false};
480 _nj5 = 2;
481 sj5array[0]=((((-1.0)*r01*sj0))+(((-1.0)*cj0*r00)));
482 if( sj5array[0] >= -1-IKFAST_SINCOS_THRESH && sj5array[0] <= 1+IKFAST_SINCOS_THRESH )
483 {
484  j5valid[0] = j5valid[1] = true;
485  j5array[0] = IKasin(sj5array[0]);
486  cj5array[0] = IKcos(j5array[0]);
487  sj5array[1] = sj5array[0];
488  j5array[1] = j5array[0] > 0 ? (IKPI-j5array[0]) : (-IKPI-j5array[0]);
489  cj5array[1] = -cj5array[0];
490 }
491 else if( isnan(sj5array[0]) )
492 {
493  // probably any value will work
494  j5valid[0] = true;
495  cj5array[0] = 1; sj5array[0] = 0; j5array[0] = 0;
496 }
497 for(int ij5 = 0; ij5 < 2; ++ij5)
498 {
499 if( !j5valid[ij5] )
500 {
501  continue;
502 }
503 _ij5[0] = ij5; _ij5[1] = -1;
504 for(int iij5 = ij5+1; iij5 < 2; ++iij5)
505 {
506 if( j5valid[iij5] && IKabs(cj5array[ij5]-cj5array[iij5]) < IKFAST_SOLUTION_THRESH && IKabs(sj5array[ij5]-sj5array[iij5]) < IKFAST_SOLUTION_THRESH )
507 {
508  j5valid[iij5]=false; _ij5[1] = iij5; break;
509 }
510 }
511 j5 = j5array[ij5]; cj5 = cj5array[ij5]; sj5 = sj5array[ij5];
512 
513 {
514 IkReal j3eval[2];
515 j3eval[0]=cj5;
516 j3eval[1]=IKsign(cj5);
517 if( IKabs(j3eval[0]) < 0.0000010000000000 || IKabs(j3eval[1]) < 0.0000010000000000 )
518 {
519 {
520 IkReal evalcond[1];
521 bool bgotonextstatement = true;
522 do
523 {
524 evalcond[0]=((-3.14159265358979)+(IKfmod(((3.14159265358979)+(IKabs(((-1.5707963267949)+j5)))), 6.28318530717959)));
525 if( IKabs(evalcond[0]) < 0.0000050000000000 )
526 {
527 bgotonextstatement=false;
528 {
529 IkReal j3array[2], cj3array[2], sj3array[2];
530 bool j3valid[2]={false};
531 _nj3 = 2;
532 IkReal x30=((8.92857142856662)*sj1);
533 IkReal x31=(px*sj0);
534 IkReal x32=(cj0*py);
535 IkReal x33=((9.26549865228612e-6)*cj1);
536 if( (((-0.528301886792168)+(((42.1159029649369)*(py*py)))+(((-8.92857142856662)*cj1*pz))+(((42.1159029649369)*(px*px)))+(((-9.26549865228612e-6)*pz*sj1))+(((-1.0)*x30*x31))+(((-1.0)*x32*x33))+(((42.1159029649369)*(pz*pz)))+((x30*x32))+((x31*x33)))) < -1-IKFAST_SINCOS_THRESH || (((-0.528301886792168)+(((42.1159029649369)*(py*py)))+(((-8.92857142856662)*cj1*pz))+(((42.1159029649369)*(px*px)))+(((-9.26549865228612e-6)*pz*sj1))+(((-1.0)*x30*x31))+(((-1.0)*x32*x33))+(((42.1159029649369)*(pz*pz)))+((x30*x32))+((x31*x33)))) > 1+IKFAST_SINCOS_THRESH )
537  continue;
538 IkReal x34=((-1.0)*(IKasin(((-0.528301886792168)+(((42.1159029649369)*(py*py)))+(((-8.92857142856662)*cj1*pz))+(((42.1159029649369)*(px*px)))+(((-9.26549865228612e-6)*pz*sj1))+(((-1.0)*x30*x31))+(((-1.0)*x32*x33))+(((42.1159029649369)*(pz*pz)))+((x30*x32))+((x31*x33))))));
539 j3array[0]=((-1.57079736453075)+(((-1.0)*x34)));
540 sj3array[0]=IKsin(j3array[0]);
541 cj3array[0]=IKcos(j3array[0]);
542 j3array[1]=((1.57079528905905)+x34);
543 sj3array[1]=IKsin(j3array[1]);
544 cj3array[1]=IKcos(j3array[1]);
545 if( j3array[0] > IKPI )
546 {
547  j3array[0]-=IK2PI;
548 }
549 else if( j3array[0] < -IKPI )
550 { j3array[0]+=IK2PI;
551 }
552 j3valid[0] = true;
553 if( j3array[1] > IKPI )
554 {
555  j3array[1]-=IK2PI;
556 }
557 else if( j3array[1] < -IKPI )
558 { j3array[1]+=IK2PI;
559 }
560 j3valid[1] = true;
561 for(int ij3 = 0; ij3 < 2; ++ij3)
562 {
563 if( !j3valid[ij3] )
564 {
565  continue;
566 }
567 _ij3[0] = ij3; _ij3[1] = -1;
568 for(int iij3 = ij3+1; iij3 < 2; ++iij3)
569 {
570 if( j3valid[iij3] && IKabs(cj3array[ij3]-cj3array[iij3]) < IKFAST_SOLUTION_THRESH && IKabs(sj3array[ij3]-sj3array[iij3]) < IKFAST_SOLUTION_THRESH )
571 {
572  j3valid[iij3]=false; _ij3[1] = iij3; break;
573 }
574 }
575 j3 = j3array[ij3]; cj3 = cj3array[ij3]; sj3 = sj3array[ij3];
576 {
577 IkReal evalcond[1];
578 IkReal x35=px*px;
579 IkReal x36=py*py;
580 IkReal x37=pz*pz;
581 IkReal x38=((0.212)*py);
582 IkReal x39=(r00*sj1);
583 IkReal x40=(cj0*r00);
584 IkReal x41=(px*r01);
585 IkReal x42=((2.2e-7)*cj1);
586 IkReal x43=(cj1*r02);
587 IkReal x44=((2.0)*px);
588 IkReal x45=(pz*r02);
589 IkReal x46=(py*sj0);
590 IkReal x47=(r01*sj0);
591 IkReal x48=((2.2e-7)*sj1);
592 IkReal x49=(cj0*px);
593 IkReal x50=((1.0)*x40);
594 IkReal x51=((0.212)*cj1*pz);
595 evalcond[0]=((-0.0237800000000121)+(((2.0)*x45*x46))+(((2.0)*cj0*py*x41))+(((-1.0)*sj0*x38*x43))+(((-0.212)*x43*x49))+(((-1.0)*x38*x39))+((x35*x40))+((cj0*x44*x45))+(((2.464e-8)*(IKsin(j3))))+((x36*x47))+(((0.212)*sj1*x41))+((py*r00*x42))+(((-1.0)*x41*x42))+(((-1.0)*x37*x50))+(((-1.0)*x37*x47))+(((-0.023744)*(IKcos(j3))))+((pz*x47*x48))+(((-1.0)*r02*x48*x49))+((x40*x51))+(((-1.0)*x36*x50))+((x47*x51))+((r00*x44*x46))+(((-0.0112360000000121)*x47))+(((-0.0112360000000121)*x40))+(((-1.0)*r02*x46*x48))+(((2.2e-7)*cj0*pz*x39))+(((-1.0)*x35*x47)));
596 if( IKabs(evalcond[0]) > IKFAST_EVALCOND_THRESH )
597 {
598 continue;
599 }
600 }
601 
602 {
603 IkReal j2eval[2];
604 sj5=1.0;
605 cj5=0;
606 j5=1.5707963267949;
607 j2eval[0]=((965097.402597894)+(((-1.0)*sj3))+(((963636.363636364)*cj3)));
608 j2eval[1]=IKsign(((0.0237800000000121)+(((-2.464e-8)*sj3))+(((0.023744)*cj3))));
609 if( IKabs(j2eval[0]) < 0.0000010000000000 || IKabs(j2eval[1]) < 0.0000010000000000 )
610 {
611 continue; // no branches [j2]
612 
613 } else
614 {
615 {
616 IkReal j2array[1], cj2array[1], sj2array[1];
617 bool j2valid[1]={false};
618 _nj2 = 1;
619 IkReal x52=((0.112)*cj1);
620 IkReal x53=(cj0*py);
621 IkReal x54=((0.106)*cj1);
622 IkReal x55=(px*sj0);
623 IkReal x56=(cj3*pz);
624 IkReal x57=((1.1e-7)*cj1);
625 IkReal x58=((0.106)*sj1);
626 IkReal x59=((1.1e-7)*sj1);
627 IkReal x60=((0.112)*sj1);
628 IkReal x61=((0.112)*pz*sj3);
629 CheckValue<IkReal> x62=IKPowWithIntegerCheck(IKsign(((0.0237800000000121)+(((-2.464e-8)*sj3))+(((0.023744)*cj3)))),-1);
630 if(!x62.valid){
631 continue;
632 }
633 CheckValue<IkReal> x63 = IKatan2WithCheck(IkReal(((((-1.0)*x53*x59))+(((-1.0)*x53*x54))+(((-1.0)*x56*x60))+(((1.232e-8)*cj3))+((cj3*x52*x55))+(((-1.0)*pz*sj3*x52))+(((-1.0)*sj3*x55*x60))+(((-1.0)*pz*x58))+((sj3*x53*x60))+((pz*x57))+(((-1.0)*cj3*x52*x53))+(((0.011872)*sj3))+((x55*x59))+((x54*x55)))),IkReal(((-0.0112360000000121)+(((-1.0)*x53*x58))+(((-1.0)*sj3*x52*x53))+(((-1.0)*pz*sj3*x60))+((cj3*x55*x60))+(((1.232e-8)*sj3))+(((-1.0)*x55*x57))+((x53*x57))+((x52*x56))+(((-0.011872)*cj3))+((pz*x54))+((pz*x59))+((sj3*x52*x55))+((x55*x58))+(((-1.0)*cj3*x53*x60)))),IKFAST_ATAN2_MAGTHRESH);
634 if(!x63.valid){
635 continue;
636 }
637 j2array[0]=((-1.5707963267949)+(((1.5707963267949)*(x62.value)))+(x63.value));
638 sj2array[0]=IKsin(j2array[0]);
639 cj2array[0]=IKcos(j2array[0]);
640 if( j2array[0] > IKPI )
641 {
642  j2array[0]-=IK2PI;
643 }
644 else if( j2array[0] < -IKPI )
645 { j2array[0]+=IK2PI;
646 }
647 j2valid[0] = true;
648 for(int ij2 = 0; ij2 < 1; ++ij2)
649 {
650 if( !j2valid[ij2] )
651 {
652  continue;
653 }
654 _ij2[0] = ij2; _ij2[1] = -1;
655 for(int iij2 = ij2+1; iij2 < 1; ++iij2)
656 {
657 if( j2valid[iij2] && IKabs(cj2array[ij2]-cj2array[iij2]) < IKFAST_SOLUTION_THRESH && IKabs(sj2array[ij2]-sj2array[iij2]) < IKFAST_SOLUTION_THRESH )
658 {
659  j2valid[iij2]=false; _ij2[1] = iij2; break;
660 }
661 }
662 j2 = j2array[ij2]; cj2 = cj2array[ij2]; sj2 = sj2array[ij2];
663 {
664 IkReal evalcond[4];
665 IkReal x64=IKsin(j2);
666 IkReal x65=IKcos(j2);
667 IkReal x66=((1.0)*r01);
668 IkReal x67=(cj1*pz);
669 IkReal x68=(r00*sj1);
670 IkReal x69=(cj0*r00);
671 IkReal x70=(px*sj1);
672 IkReal x71=(cj0*r02);
673 IkReal x72=(cj1*py);
674 IkReal x73=(r02*sj0);
675 IkReal x74=(r01*sj0);
676 IkReal x75=(cj1*px);
677 IkReal x76=(pz*sj1);
678 IkReal x77=((1.1e-7)*x64);
679 IkReal x78=((0.106)*x65);
680 IkReal x79=((1.1e-7)*x65);
681 IkReal x80=((0.106)*x64);
682 IkReal x81=((0.112)*x65);
683 IkReal x82=((0.112)*x64);
684 IkReal x83=((1.0)*py*sj1);
685 IkReal x84=(sj3*x82);
686 IkReal x85=(cj3*x81);
687 IkReal x86=(cj3*x82);
688 IkReal x87=(sj3*x81);
689 IkReal x88=(x77+x78+x85);
690 IkReal x89=(x80+x86+x87);
691 evalcond[0]=((-1.1e-7)+(((-1.0)*x79))+((cj0*x72))+x76+x89+(((-1.0)*sj0*x75)));
692 evalcond[1]=((-0.106)+(((-1.0)*cj0*x83))+x67+x84+((sj0*x70))+(((-1.0)*x88)));
693 evalcond[2]=((((-1.0)*sj0*x66*x67))+(((-1.0)*x66*x70))+(((0.106)*x74))+(((0.106)*x69))+x84+(((-1.0)*x67*x69))+((x72*x73))+(((-1.0)*x88))+((py*x68))+((x71*x75)));
694 evalcond[3]=((((-1.0)*x73*x83))+(((-1.0)*x70*x71))+(((-1.0)*x66*x75))+((cj0*pz*x68))+(((-1.1e-7)*x74))+x79+(((-1.1e-7)*x69))+(((-1.0)*x89))+((x74*x76))+((r00*x72)));
695 if( IKabs(evalcond[0]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[1]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[2]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[3]) > IKFAST_EVALCOND_THRESH )
696 {
697 continue;
698 }
699 }
700 
701 {
702 std::vector<IkSingleDOFSolutionBase<IkReal> > vinfos(5);
703 vinfos[0].jointtype = 1;
704 vinfos[0].foffset = j0;
705 vinfos[0].indices[0] = _ij0[0];
706 vinfos[0].indices[1] = _ij0[1];
707 vinfos[0].maxsolutions = _nj0;
708 vinfos[1].jointtype = 1;
709 vinfos[1].foffset = j1;
710 vinfos[1].indices[0] = _ij1[0];
711 vinfos[1].indices[1] = _ij1[1];
712 vinfos[1].maxsolutions = _nj1;
713 vinfos[2].jointtype = 1;
714 vinfos[2].foffset = j2;
715 vinfos[2].indices[0] = _ij2[0];
716 vinfos[2].indices[1] = _ij2[1];
717 vinfos[2].maxsolutions = _nj2;
718 vinfos[3].jointtype = 1;
719 vinfos[3].foffset = j3;
720 vinfos[3].indices[0] = _ij3[0];
721 vinfos[3].indices[1] = _ij3[1];
722 vinfos[3].maxsolutions = _nj3;
723 vinfos[4].jointtype = 1;
724 vinfos[4].foffset = j5;
725 vinfos[4].indices[0] = _ij5[0];
726 vinfos[4].indices[1] = _ij5[1];
727 vinfos[4].maxsolutions = _nj5;
728 std::vector<int> vfree(0);
729 solutions.AddSolution(vinfos,vfree);
730 }
731 }
732 }
733 
734 }
735 
736 }
737 }
738 }
739 
740 }
741 } while(0);
742 if( bgotonextstatement )
743 {
744 bool bgotonextstatement = true;
745 do
746 {
747 evalcond[0]=((-3.14159265358979)+(IKfmod(((3.14159265358979)+(IKabs(((1.5707963267949)+j5)))), 6.28318530717959)));
748 if( IKabs(evalcond[0]) < 0.0000050000000000 )
749 {
750 bgotonextstatement=false;
751 {
752 IkReal j3array[2], cj3array[2], sj3array[2];
753 bool j3valid[2]={false};
754 _nj3 = 2;
755 IkReal x90=((8.92857142856662)*sj1);
756 IkReal x91=(px*sj0);
757 IkReal x92=(cj0*py);
758 IkReal x93=((9.26549865228612e-6)*cj1);
759 if( (((-0.528301886792168)+(((42.1159029649369)*(py*py)))+(((-8.92857142856662)*cj1*pz))+(((42.1159029649369)*(px*px)))+(((-9.26549865228612e-6)*pz*sj1))+(((-1.0)*x90*x91))+((x90*x92))+(((42.1159029649369)*(pz*pz)))+(((-1.0)*x92*x93))+((x91*x93)))) < -1-IKFAST_SINCOS_THRESH || (((-0.528301886792168)+(((42.1159029649369)*(py*py)))+(((-8.92857142856662)*cj1*pz))+(((42.1159029649369)*(px*px)))+(((-9.26549865228612e-6)*pz*sj1))+(((-1.0)*x90*x91))+((x90*x92))+(((42.1159029649369)*(pz*pz)))+(((-1.0)*x92*x93))+((x91*x93)))) > 1+IKFAST_SINCOS_THRESH )
760  continue;
761 IkReal x94=((-1.0)*(IKasin(((-0.528301886792168)+(((42.1159029649369)*(py*py)))+(((-8.92857142856662)*cj1*pz))+(((42.1159029649369)*(px*px)))+(((-9.26549865228612e-6)*pz*sj1))+(((-1.0)*x90*x91))+((x90*x92))+(((42.1159029649369)*(pz*pz)))+(((-1.0)*x92*x93))+((x91*x93))))));
762 j3array[0]=((-1.57079736453075)+(((-1.0)*x94)));
763 sj3array[0]=IKsin(j3array[0]);
764 cj3array[0]=IKcos(j3array[0]);
765 j3array[1]=((1.57079528905905)+x94);
766 sj3array[1]=IKsin(j3array[1]);
767 cj3array[1]=IKcos(j3array[1]);
768 if( j3array[0] > IKPI )
769 {
770  j3array[0]-=IK2PI;
771 }
772 else if( j3array[0] < -IKPI )
773 { j3array[0]+=IK2PI;
774 }
775 j3valid[0] = true;
776 if( j3array[1] > IKPI )
777 {
778  j3array[1]-=IK2PI;
779 }
780 else if( j3array[1] < -IKPI )
781 { j3array[1]+=IK2PI;
782 }
783 j3valid[1] = true;
784 for(int ij3 = 0; ij3 < 2; ++ij3)
785 {
786 if( !j3valid[ij3] )
787 {
788  continue;
789 }
790 _ij3[0] = ij3; _ij3[1] = -1;
791 for(int iij3 = ij3+1; iij3 < 2; ++iij3)
792 {
793 if( j3valid[iij3] && IKabs(cj3array[ij3]-cj3array[iij3]) < IKFAST_SOLUTION_THRESH && IKabs(sj3array[ij3]-sj3array[iij3]) < IKFAST_SOLUTION_THRESH )
794 {
795  j3valid[iij3]=false; _ij3[1] = iij3; break;
796 }
797 }
798 j3 = j3array[ij3]; cj3 = cj3array[ij3]; sj3 = sj3array[ij3];
799 {
800 IkReal evalcond[1];
801 IkReal x95=px*px;
802 IkReal x96=py*py;
803 IkReal x97=pz*pz;
804 IkReal x98=((0.212)*py);
805 IkReal x99=(r00*sj1);
806 IkReal x100=(cj0*r00);
807 IkReal x101=(px*r01);
808 IkReal x102=((2.2e-7)*cj1);
809 IkReal x103=(cj1*r02);
810 IkReal x104=((2.0)*px);
811 IkReal x105=(pz*r02);
812 IkReal x106=(py*sj0);
813 IkReal x107=(r01*sj0);
814 IkReal x108=((2.2e-7)*sj1);
815 IkReal x109=(cj0*px);
816 IkReal x110=((1.0)*x100);
817 IkReal x111=((0.212)*cj1*pz);
818 evalcond[0]=((0.0237800000000121)+(((2.2e-7)*cj0*pz*x99))+((x100*x111))+(((-1.0)*x98*x99))+((x100*x95))+(((-1.0)*x101*x102))+(((2.0)*x105*x106))+((x107*x96))+(((-1.0)*r02*x106*x108))+((pz*x107*x108))+(((-1.0)*r02*x108*x109))+(((-2.464e-8)*(IKsin(j3))))+(((-1.0)*x107*x97))+(((-1.0)*x107*x95))+(((-1.0)*x110*x96))+(((-1.0)*x110*x97))+(((2.0)*cj0*py*x101))+(((-0.212)*x103*x109))+(((0.212)*sj1*x101))+(((0.023744)*(IKcos(j3))))+(((-1.0)*sj0*x103*x98))+((cj0*x104*x105))+((r00*x104*x106))+(((-0.0112360000000121)*x100))+(((-0.0112360000000121)*x107))+((py*r00*x102))+((x107*x111)));
819 if( IKabs(evalcond[0]) > IKFAST_EVALCOND_THRESH )
820 {
821 continue;
822 }
823 }
824 
825 {
826 IkReal j2eval[2];
827 sj5=-1.0;
828 cj5=0;
829 j5=-1.5707963267949;
830 j2eval[0]=((965097.402597894)+(((-1.0)*sj3))+(((963636.363636364)*cj3)));
831 j2eval[1]=IKsign(((0.0237800000000121)+(((-2.464e-8)*sj3))+(((0.023744)*cj3))));
832 if( IKabs(j2eval[0]) < 0.0000010000000000 || IKabs(j2eval[1]) < 0.0000010000000000 )
833 {
834 continue; // no branches [j2]
835 
836 } else
837 {
838 {
839 IkReal j2array[1], cj2array[1], sj2array[1];
840 bool j2valid[1]={false};
841 _nj2 = 1;
842 IkReal x112=((0.112)*cj1);
843 IkReal x113=(cj0*py);
844 IkReal x114=((0.106)*cj1);
845 IkReal x115=(px*sj0);
846 IkReal x116=(cj3*pz);
847 IkReal x117=((1.1e-7)*cj1);
848 IkReal x118=((0.106)*sj1);
849 IkReal x119=((1.1e-7)*sj1);
850 IkReal x120=((0.112)*sj1);
851 IkReal x121=((0.112)*pz*sj3);
852 CheckValue<IkReal> x122=IKPowWithIntegerCheck(IKsign(((0.0237800000000121)+(((-2.464e-8)*sj3))+(((0.023744)*cj3)))),-1);
853 if(!x122.valid){
854 continue;
855 }
856 CheckValue<IkReal> x123 = IKatan2WithCheck(IkReal((((cj3*x112*x115))+(((-1.0)*sj3*x115*x120))+(((1.232e-8)*cj3))+((pz*x117))+((x114*x115))+(((-1.0)*x113*x119))+(((-1.0)*x113*x114))+(((-1.0)*x116*x120))+(((-1.0)*cj3*x112*x113))+(((-1.0)*pz*sj3*x112))+(((0.011872)*sj3))+((x115*x119))+((sj3*x113*x120))+(((-1.0)*pz*x118)))),IkReal(((-0.0112360000000121)+((sj3*x112*x115))+((x112*x116))+(((-1.0)*cj3*x113*x120))+((pz*x119))+((pz*x114))+(((-1.0)*x113*x118))+(((1.232e-8)*sj3))+((x113*x117))+((cj3*x115*x120))+(((-1.0)*x115*x117))+(((-1.0)*pz*sj3*x120))+(((-1.0)*sj3*x112*x113))+(((-0.011872)*cj3))+((x115*x118)))),IKFAST_ATAN2_MAGTHRESH);
857 if(!x123.valid){
858 continue;
859 }
860 j2array[0]=((-1.5707963267949)+(((1.5707963267949)*(x122.value)))+(x123.value));
861 sj2array[0]=IKsin(j2array[0]);
862 cj2array[0]=IKcos(j2array[0]);
863 if( j2array[0] > IKPI )
864 {
865  j2array[0]-=IK2PI;
866 }
867 else if( j2array[0] < -IKPI )
868 { j2array[0]+=IK2PI;
869 }
870 j2valid[0] = true;
871 for(int ij2 = 0; ij2 < 1; ++ij2)
872 {
873 if( !j2valid[ij2] )
874 {
875  continue;
876 }
877 _ij2[0] = ij2; _ij2[1] = -1;
878 for(int iij2 = ij2+1; iij2 < 1; ++iij2)
879 {
880 if( j2valid[iij2] && IKabs(cj2array[ij2]-cj2array[iij2]) < IKFAST_SOLUTION_THRESH && IKabs(sj2array[ij2]-sj2array[iij2]) < IKFAST_SOLUTION_THRESH )
881 {
882  j2valid[iij2]=false; _ij2[1] = iij2; break;
883 }
884 }
885 j2 = j2array[ij2]; cj2 = cj2array[ij2]; sj2 = sj2array[ij2];
886 {
887 IkReal evalcond[4];
888 IkReal x124=IKsin(j2);
889 IkReal x125=IKcos(j2);
890 IkReal x126=((1.0)*r01);
891 IkReal x127=(cj1*pz);
892 IkReal x128=(r00*sj1);
893 IkReal x129=(cj0*r00);
894 IkReal x130=(px*sj1);
895 IkReal x131=(cj0*r02);
896 IkReal x132=(cj1*py);
897 IkReal x133=(r02*sj0);
898 IkReal x134=(r01*sj0);
899 IkReal x135=(cj1*px);
900 IkReal x136=(pz*sj1);
901 IkReal x137=((1.1e-7)*x124);
902 IkReal x138=((0.106)*x125);
903 IkReal x139=((0.106)*x124);
904 IkReal x140=((1.1e-7)*x125);
905 IkReal x141=((0.112)*x125);
906 IkReal x142=((0.112)*x124);
907 IkReal x143=((1.0)*py*sj1);
908 IkReal x144=(cj3*x141);
909 IkReal x145=(sj3*x142);
910 IkReal x146=(cj3*x142);
911 IkReal x147=(sj3*x141);
912 IkReal x148=(x144+x137+x138);
913 IkReal x149=(x146+x147+x139);
914 evalcond[0]=((-1.1e-7)+(((-1.0)*x140))+((cj0*x132))+x149+x136+(((-1.0)*sj0*x135)));
915 evalcond[1]=((-0.106)+(((-1.0)*x148))+(((-1.0)*cj0*x143))+x145+x127+((sj0*x130)));
916 evalcond[2]=((((-1.0)*x145))+(((0.106)*x134))+(((0.106)*x129))+(((-1.0)*x127*x129))+((py*x128))+(((-1.0)*x126*x130))+x148+((x131*x135))+(((-1.0)*sj0*x126*x127))+((x132*x133)));
917 evalcond[3]=(((cj0*pz*x128))+(((-1.0)*x140))+(((-1.0)*x130*x131))+(((-1.0)*x133*x143))+(((-1.1e-7)*x129))+(((-1.0)*x126*x135))+(((-1.1e-7)*x134))+((r00*x132))+x149+((x134*x136)));
918 if( IKabs(evalcond[0]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[1]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[2]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[3]) > IKFAST_EVALCOND_THRESH )
919 {
920 continue;
921 }
922 }
923 
924 {
925 std::vector<IkSingleDOFSolutionBase<IkReal> > vinfos(5);
926 vinfos[0].jointtype = 1;
927 vinfos[0].foffset = j0;
928 vinfos[0].indices[0] = _ij0[0];
929 vinfos[0].indices[1] = _ij0[1];
930 vinfos[0].maxsolutions = _nj0;
931 vinfos[1].jointtype = 1;
932 vinfos[1].foffset = j1;
933 vinfos[1].indices[0] = _ij1[0];
934 vinfos[1].indices[1] = _ij1[1];
935 vinfos[1].maxsolutions = _nj1;
936 vinfos[2].jointtype = 1;
937 vinfos[2].foffset = j2;
938 vinfos[2].indices[0] = _ij2[0];
939 vinfos[2].indices[1] = _ij2[1];
940 vinfos[2].maxsolutions = _nj2;
941 vinfos[3].jointtype = 1;
942 vinfos[3].foffset = j3;
943 vinfos[3].indices[0] = _ij3[0];
944 vinfos[3].indices[1] = _ij3[1];
945 vinfos[3].maxsolutions = _nj3;
946 vinfos[4].jointtype = 1;
947 vinfos[4].foffset = j5;
948 vinfos[4].indices[0] = _ij5[0];
949 vinfos[4].indices[1] = _ij5[1];
950 vinfos[4].maxsolutions = _nj5;
951 std::vector<int> vfree(0);
952 solutions.AddSolution(vinfos,vfree);
953 }
954 }
955 }
956 
957 }
958 
959 }
960 }
961 }
962 
963 }
964 } while(0);
965 if( bgotonextstatement )
966 {
967 bool bgotonextstatement = true;
968 do
969 {
970 if( 1 )
971 {
972 bgotonextstatement=false;
973 continue; // branch miss [j2, j3]
974 
975 }
976 } while(0);
977 if( bgotonextstatement )
978 {
979 }
980 }
981 }
982 }
983 
984 } else
985 {
986 {
987 IkReal j3array[1], cj3array[1], sj3array[1];
988 bool j3valid[1]={false};
989 _nj3 = 1;
990 IkReal x150=((1100000000.0)*px);
991 IkReal x151=(r02*sj0);
992 IkReal x152=((112360000000121.0)*r02);
993 IkReal x153=((1.06e+15)*r00);
994 IkReal x154=(pz*sj0);
995 IkReal x155=((112360000000121.0)*sj1);
996 IkReal x156=(cj0*r01);
997 IkReal x157=(py*r01);
998 IkReal x158=(r00*sj0);
999 IkReal x159=((112360000000121.0)*cj1);
1000 IkReal x160=(pz*r02);
1001 IkReal x161=(cj0*py*r02);
1002 CheckValue<IkReal> x162 = IKatan2WithCheck(IkReal(((((1100000000.0)*r00*x154))+(((1.06e+15)*x160))+(((1.06e+15)*x157))+(((1100000000.0)*x161))+(((123200000.0)*cj5))+(((-1.0)*x150*x151))+((x155*x156))+(((-1100000000.0)*pz*x156))+((px*x153))+(((-1.0)*cj1*x152))+(((-1.0)*x155*x158)))),IkReal(((((-1.06e+15)*x161))+(((1100000000.0)*x157))+(((1100000000.0)*x160))+(((-1.0)*x153*x154))+((r00*x150))+(((-118720000000000.0)*cj5))+(((1.06e+15)*px*x151))+(((1.06e+15)*pz*x156))+(((-1.0)*x156*x159))+((x158*x159))+(((-1.0)*sj1*x152)))),IKFAST_ATAN2_MAGTHRESH);
1003 if(!x162.valid){
1004 continue;
1005 }
1007 if(!x163.valid){
1008 continue;
1009 }
1010 j3array[0]=((-1.5707963267949)+(x162.value)+(((1.5707963267949)*(x163.value))));
1011 sj3array[0]=IKsin(j3array[0]);
1012 cj3array[0]=IKcos(j3array[0]);
1013 if( j3array[0] > IKPI )
1014 {
1015  j3array[0]-=IK2PI;
1016 }
1017 else if( j3array[0] < -IKPI )
1018 { j3array[0]+=IK2PI;
1019 }
1020 j3valid[0] = true;
1021 for(int ij3 = 0; ij3 < 1; ++ij3)
1022 {
1023 if( !j3valid[ij3] )
1024 {
1025  continue;
1026 }
1027 _ij3[0] = ij3; _ij3[1] = -1;
1028 for(int iij3 = ij3+1; iij3 < 1; ++iij3)
1029 {
1030 if( j3valid[iij3] && IKabs(cj3array[ij3]-cj3array[iij3]) < IKFAST_SOLUTION_THRESH && IKabs(sj3array[ij3]-sj3array[iij3]) < IKFAST_SOLUTION_THRESH )
1031 {
1032  j3valid[iij3]=false; _ij3[1] = iij3; break;
1033 }
1034 }
1035 j3 = j3array[ij3]; cj3 = cj3array[ij3]; sj3 = sj3array[ij3];
1036 {
1037 IkReal evalcond[4];
1038 IkReal x164=IKcos(j3);
1039 IkReal x165=IKsin(j3);
1040 IkReal x166=px*px;
1041 IkReal x167=py*py;
1042 IkReal x168=pz*pz;
1043 IkReal x169=(py*r00);
1044 IkReal x170=((2.0)*px);
1045 IkReal x171=((1.1e-7)*cj1);
1046 IkReal x172=(cj0*r01);
1047 IkReal x173=((0.212)*sj1);
1048 IkReal x174=(cj0*r00);
1049 IkReal x175=(r00*sj0);
1050 IkReal x176=((0.212)*cj1);
1051 IkReal x177=(cj0*py);
1052 IkReal x178=((1.1e-7)*sj1);
1053 IkReal x179=((2.2e-7)*cj1);
1054 IkReal x180=(px*r01);
1055 IkReal x181=((0.106)*cj1);
1056 IkReal x182=(cj0*r02);
1057 IkReal x183=(px*sj0);
1058 IkReal x184=((1.0)*pz);
1059 IkReal x185=(r01*sj0);
1060 IkReal x186=((2.2e-7)*sj1);
1061 IkReal x187=((0.106)*sj1);
1062 IkReal x188=(cj5*x165);
1063 IkReal x189=((1.0)*x167);
1064 IkReal x190=(py*r02*sj0);
1065 IkReal x191=((0.023744)*x164);
1066 IkReal x192=((2.464e-8)*x165);
1067 IkReal x193=(pz*x186);
1068 IkReal x194=(cj5*x164);
1069 IkReal x195=((1.0)*x168);
1070 IkReal x196=((1.0)*x166);
1071 evalcond[0]=((((-1.0)*px*r00))+(((1.1e-7)*x194))+(((-1.0)*r02*x184))+(((0.106)*x188))+((x175*x187))+((x171*x172))+(((-1.0)*x171*x175))+(((-1.0)*py*r01))+((r02*x181))+(((-1.0)*x172*x187))+((r02*x178)));
1072 evalcond[1]=((0.012544)+((pz*x176))+((x173*x183))+(((-1.0)*x189))+(((-1.0)*x195))+(((-1.0)*x196))+(((-1.0)*x192))+x193+x191+(((-1.0)*x179*x183))+(((-1.0)*x173*x177))+((x177*x179)));
1073 evalcond[2]=(((pz*x175))+(((-1.0)*x175*x178))+(((-1.0)*r02*x183))+(((0.112)*cj5))+((x172*x181))+(((-1.0)*r02*x171))+((x172*x178))+(((0.106)*x194))+(((-1.1e-7)*x188))+(((-1.0)*x175*x181))+((r02*x187))+(((-1.0)*x172*x184))+((r02*x177)));
1074 evalcond[3]=((((-1.0)*px*x182*x186))+((pz*x176*x185))+((pz*x170*x182))+(((-0.0112360000000121)*x185))+((py*x170*x172))+((x173*x180))+(((-1.0)*x186*x190))+(((-0.0112360000000121)*x174))+((x169*x179))+(((-1.0)*px*x176*x182))+((x174*x193))+((pz*x174*x176))+((x185*x193))+(((2.0)*pz*x190))+((x167*x185))+((x166*x174))+(((-0.0237800000000121)*sj5))+(((-1.0)*x176*x190))+(((-1.0)*sj5*x191))+(((-1.0)*x185*x196))+(((-1.0)*x185*x195))+(((-1.0)*x169*x173))+(((-1.0)*x179*x180))+(((-1.0)*x174*x195))+(((-1.0)*x174*x189))+((sj0*x169*x170))+((sj5*x192)));
1075 if( IKabs(evalcond[0]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[1]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[2]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[3]) > IKFAST_EVALCOND_THRESH )
1076 {
1077 continue;
1078 }
1079 }
1080 
1081 {
1082 IkReal j2eval[2];
1083 j2eval[0]=cj5;
1084 j2eval[1]=IKsign(cj5);
1085 if( IKabs(j2eval[0]) < 0.0000010000000000 || IKabs(j2eval[1]) < 0.0000010000000000 )
1086 {
1087 {
1088 IkReal j2eval[2];
1089 IkReal x197=(cj3*cj5);
1090 IkReal x198=(cj5*sj3);
1091 j2eval[0]=((((-1.0)*x197))+(((-963636.363636364)*x198)));
1092 j2eval[1]=IKsign(((((-1.1e-7)*x197))+(((-0.106)*x198))));
1093 if( IKabs(j2eval[0]) < 0.0000010000000000 || IKabs(j2eval[1]) < 0.0000010000000000 )
1094 {
1095 {
1096 IkReal j2eval[2];
1097 IkReal x199=(cj3*cj5);
1098 IkReal x200=(cj5*sj3);
1099 j2eval[0]=((((1018181.81818182)*cj5))+(((963636.363636364)*x199))+(((-1.0)*x200)));
1100 j2eval[1]=IKsign(((((0.112)*cj5))+(((0.106)*x199))+(((-1.1e-7)*x200))));
1101 if( IKabs(j2eval[0]) < 0.0000010000000000 || IKabs(j2eval[1]) < 0.0000010000000000 )
1102 {
1103 {
1104 IkReal evalcond[1];
1105 bool bgotonextstatement = true;
1106 do
1107 {
1108 evalcond[0]=((-3.14159265358979)+(IKfmod(((3.14159265358979)+(IKabs(((-1.5707963267949)+j5)))), 6.28318530717959)));
1109 if( IKabs(evalcond[0]) < 0.0000050000000000 )
1110 {
1111 bgotonextstatement=false;
1112 {
1113 IkReal j2eval[2];
1114 sj5=1.0;
1115 cj5=0;
1116 j5=1.5707963267949;
1117 j2eval[0]=((965097.402597894)+(((-1.0)*sj3))+(((963636.363636364)*cj3)));
1118 j2eval[1]=IKsign(((0.0237800000000121)+(((-2.464e-8)*sj3))+(((0.023744)*cj3))));
1119 if( IKabs(j2eval[0]) < 0.0000010000000000 || IKabs(j2eval[1]) < 0.0000010000000000 )
1120 {
1121 continue; // no branches [j2]
1122 
1123 } else
1124 {
1125 {
1126 IkReal j2array[1], cj2array[1], sj2array[1];
1127 bool j2valid[1]={false};
1128 _nj2 = 1;
1129 IkReal x201=((0.112)*cj1);
1130 IkReal x202=(cj0*py);
1131 IkReal x203=((0.106)*cj1);
1132 IkReal x204=(px*sj0);
1133 IkReal x205=(cj3*pz);
1134 IkReal x206=((1.1e-7)*cj1);
1135 IkReal x207=((0.106)*sj1);
1136 IkReal x208=((1.1e-7)*sj1);
1137 IkReal x209=((0.112)*sj1);
1138 IkReal x210=((0.112)*pz*sj3);
1139 CheckValue<IkReal> x211 = IKatan2WithCheck(IkReal(((((1.232e-8)*cj3))+((cj3*x201*x204))+(((-1.0)*pz*sj3*x201))+((sj3*x202*x209))+(((-1.0)*pz*x207))+(((-1.0)*x202*x203))+(((-1.0)*x202*x208))+(((-1.0)*sj3*x204*x209))+((pz*x206))+((x204*x208))+(((-1.0)*cj3*x201*x202))+(((-1.0)*x205*x209))+((x203*x204))+(((0.011872)*sj3)))),IkReal(((-0.0112360000000121)+(((-1.0)*cj3*x202*x209))+(((-1.0)*x204*x206))+(((-1.0)*sj3*x201*x202))+((x201*x205))+(((-1.0)*pz*sj3*x209))+(((1.232e-8)*sj3))+(((-1.0)*x202*x207))+((pz*x203))+((pz*x208))+((x204*x207))+((cj3*x204*x209))+((x202*x206))+(((-0.011872)*cj3))+((sj3*x201*x204)))),IKFAST_ATAN2_MAGTHRESH);
1140 if(!x211.valid){
1141 continue;
1142 }
1143 CheckValue<IkReal> x212=IKPowWithIntegerCheck(IKsign(((0.0237800000000121)+(((-2.464e-8)*sj3))+(((0.023744)*cj3)))),-1);
1144 if(!x212.valid){
1145 continue;
1146 }
1147 j2array[0]=((-1.5707963267949)+(x211.value)+(((1.5707963267949)*(x212.value))));
1148 sj2array[0]=IKsin(j2array[0]);
1149 cj2array[0]=IKcos(j2array[0]);
1150 if( j2array[0] > IKPI )
1151 {
1152  j2array[0]-=IK2PI;
1153 }
1154 else if( j2array[0] < -IKPI )
1155 { j2array[0]+=IK2PI;
1156 }
1157 j2valid[0] = true;
1158 for(int ij2 = 0; ij2 < 1; ++ij2)
1159 {
1160 if( !j2valid[ij2] )
1161 {
1162  continue;
1163 }
1164 _ij2[0] = ij2; _ij2[1] = -1;
1165 for(int iij2 = ij2+1; iij2 < 1; ++iij2)
1166 {
1167 if( j2valid[iij2] && IKabs(cj2array[ij2]-cj2array[iij2]) < IKFAST_SOLUTION_THRESH && IKabs(sj2array[ij2]-sj2array[iij2]) < IKFAST_SOLUTION_THRESH )
1168 {
1169  j2valid[iij2]=false; _ij2[1] = iij2; break;
1170 }
1171 }
1172 j2 = j2array[ij2]; cj2 = cj2array[ij2]; sj2 = sj2array[ij2];
1173 {
1174 IkReal evalcond[4];
1175 IkReal x213=IKsin(j2);
1176 IkReal x214=IKcos(j2);
1177 IkReal x215=((1.0)*r01);
1178 IkReal x216=(cj1*pz);
1179 IkReal x217=(r00*sj1);
1180 IkReal x218=(cj0*r00);
1181 IkReal x219=(px*sj1);
1182 IkReal x220=(cj0*r02);
1183 IkReal x221=(cj1*py);
1184 IkReal x222=(r02*sj0);
1185 IkReal x223=(r01*sj0);
1186 IkReal x224=(cj1*px);
1187 IkReal x225=(pz*sj1);
1188 IkReal x226=((1.1e-7)*x213);
1189 IkReal x227=((0.106)*x214);
1190 IkReal x228=((1.1e-7)*x214);
1191 IkReal x229=((0.106)*x213);
1192 IkReal x230=((0.112)*x214);
1193 IkReal x231=((0.112)*x213);
1194 IkReal x232=((1.0)*py*sj1);
1195 IkReal x233=(sj3*x231);
1196 IkReal x234=(cj3*x230);
1197 IkReal x235=(cj3*x231);
1198 IkReal x236=(sj3*x230);
1199 IkReal x237=(x227+x226+x234);
1200 IkReal x238=(x229+x236+x235);
1201 evalcond[0]=((-1.1e-7)+(((-1.0)*sj0*x224))+((cj0*x221))+x225+x238+(((-1.0)*x228)));
1202 evalcond[1]=((-0.106)+(((-1.0)*cj0*x232))+(((-1.0)*x237))+x216+x233+((sj0*x219)));
1203 evalcond[2]=((((0.106)*x223))+((py*x217))+(((-1.0)*x216*x218))+(((0.106)*x218))+(((-1.0)*x237))+x233+((x220*x224))+((x221*x222))+(((-1.0)*x215*x219))+(((-1.0)*sj0*x215*x216)));
1204 evalcond[3]=((((-1.1e-7)*x223))+((cj0*pz*x217))+(((-1.0)*x215*x224))+(((-1.1e-7)*x218))+((r00*x221))+((x223*x225))+(((-1.0)*x238))+x228+(((-1.0)*x219*x220))+(((-1.0)*x222*x232)));
1205 if( IKabs(evalcond[0]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[1]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[2]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[3]) > IKFAST_EVALCOND_THRESH )
1206 {
1207 continue;
1208 }
1209 }
1210 
1211 {
1212 std::vector<IkSingleDOFSolutionBase<IkReal> > vinfos(5);
1213 vinfos[0].jointtype = 1;
1214 vinfos[0].foffset = j0;
1215 vinfos[0].indices[0] = _ij0[0];
1216 vinfos[0].indices[1] = _ij0[1];
1217 vinfos[0].maxsolutions = _nj0;
1218 vinfos[1].jointtype = 1;
1219 vinfos[1].foffset = j1;
1220 vinfos[1].indices[0] = _ij1[0];
1221 vinfos[1].indices[1] = _ij1[1];
1222 vinfos[1].maxsolutions = _nj1;
1223 vinfos[2].jointtype = 1;
1224 vinfos[2].foffset = j2;
1225 vinfos[2].indices[0] = _ij2[0];
1226 vinfos[2].indices[1] = _ij2[1];
1227 vinfos[2].maxsolutions = _nj2;
1228 vinfos[3].jointtype = 1;
1229 vinfos[3].foffset = j3;
1230 vinfos[3].indices[0] = _ij3[0];
1231 vinfos[3].indices[1] = _ij3[1];
1232 vinfos[3].maxsolutions = _nj3;
1233 vinfos[4].jointtype = 1;
1234 vinfos[4].foffset = j5;
1235 vinfos[4].indices[0] = _ij5[0];
1236 vinfos[4].indices[1] = _ij5[1];
1237 vinfos[4].maxsolutions = _nj5;
1238 std::vector<int> vfree(0);
1239 solutions.AddSolution(vinfos,vfree);
1240 }
1241 }
1242 }
1243 
1244 }
1245 
1246 }
1247 
1248 }
1249 } while(0);
1250 if( bgotonextstatement )
1251 {
1252 bool bgotonextstatement = true;
1253 do
1254 {
1255 evalcond[0]=((-3.14159265358979)+(IKfmod(((3.14159265358979)+(IKabs(((1.5707963267949)+j5)))), 6.28318530717959)));
1256 if( IKabs(evalcond[0]) < 0.0000050000000000 )
1257 {
1258 bgotonextstatement=false;
1259 {
1260 IkReal j2eval[2];
1261 sj5=-1.0;
1262 cj5=0;
1263 j5=-1.5707963267949;
1264 j2eval[0]=((965097.402597894)+(((-1.0)*sj3))+(((963636.363636364)*cj3)));
1265 j2eval[1]=IKsign(((0.0237800000000121)+(((-2.464e-8)*sj3))+(((0.023744)*cj3))));
1266 if( IKabs(j2eval[0]) < 0.0000010000000000 || IKabs(j2eval[1]) < 0.0000010000000000 )
1267 {
1268 continue; // no branches [j2]
1269 
1270 } else
1271 {
1272 {
1273 IkReal j2array[1], cj2array[1], sj2array[1];
1274 bool j2valid[1]={false};
1275 _nj2 = 1;
1276 IkReal x239=((0.112)*cj1);
1277 IkReal x240=(cj0*py);
1278 IkReal x241=((0.106)*cj1);
1279 IkReal x242=(px*sj0);
1280 IkReal x243=(cj3*pz);
1281 IkReal x244=((1.1e-7)*cj1);
1282 IkReal x245=((0.106)*sj1);
1283 IkReal x246=((1.1e-7)*sj1);
1284 IkReal x247=((0.112)*sj1);
1285 IkReal x248=((0.112)*pz*sj3);
1286 CheckValue<IkReal> x249=IKPowWithIntegerCheck(IKsign(((0.0237800000000121)+(((-2.464e-8)*sj3))+(((0.023744)*cj3)))),-1);
1287 if(!x249.valid){
1288 continue;
1289 }
1290 CheckValue<IkReal> x250 = IKatan2WithCheck(IkReal(((((-1.0)*pz*x245))+((cj3*x239*x242))+(((1.232e-8)*cj3))+(((-1.0)*pz*sj3*x239))+(((-1.0)*x243*x247))+((x241*x242))+(((-1.0)*sj3*x242*x247))+((x242*x246))+((sj3*x240*x247))+(((-1.0)*x240*x241))+(((-1.0)*x240*x246))+(((0.011872)*sj3))+(((-1.0)*cj3*x239*x240))+((pz*x244)))),IkReal(((-0.0112360000000121)+(((-1.0)*cj3*x240*x247))+(((-1.0)*sj3*x239*x240))+(((-1.0)*x242*x244))+((x240*x244))+(((1.232e-8)*sj3))+((cj3*x242*x247))+((x239*x243))+((sj3*x239*x242))+((x242*x245))+(((-1.0)*x240*x245))+(((-0.011872)*cj3))+((pz*x246))+((pz*x241))+(((-1.0)*pz*sj3*x247)))),IKFAST_ATAN2_MAGTHRESH);
1291 if(!x250.valid){
1292 continue;
1293 }
1294 j2array[0]=((-1.5707963267949)+(((1.5707963267949)*(x249.value)))+(x250.value));
1295 sj2array[0]=IKsin(j2array[0]);
1296 cj2array[0]=IKcos(j2array[0]);
1297 if( j2array[0] > IKPI )
1298 {
1299  j2array[0]-=IK2PI;
1300 }
1301 else if( j2array[0] < -IKPI )
1302 { j2array[0]+=IK2PI;
1303 }
1304 j2valid[0] = true;
1305 for(int ij2 = 0; ij2 < 1; ++ij2)
1306 {
1307 if( !j2valid[ij2] )
1308 {
1309  continue;
1310 }
1311 _ij2[0] = ij2; _ij2[1] = -1;
1312 for(int iij2 = ij2+1; iij2 < 1; ++iij2)
1313 {
1314 if( j2valid[iij2] && IKabs(cj2array[ij2]-cj2array[iij2]) < IKFAST_SOLUTION_THRESH && IKabs(sj2array[ij2]-sj2array[iij2]) < IKFAST_SOLUTION_THRESH )
1315 {
1316  j2valid[iij2]=false; _ij2[1] = iij2; break;
1317 }
1318 }
1319 j2 = j2array[ij2]; cj2 = cj2array[ij2]; sj2 = sj2array[ij2];
1320 {
1321 IkReal evalcond[4];
1322 IkReal x251=IKsin(j2);
1323 IkReal x252=IKcos(j2);
1324 IkReal x253=((1.0)*r01);
1325 IkReal x254=(cj1*pz);
1326 IkReal x255=(r00*sj1);
1327 IkReal x256=(cj0*r00);
1328 IkReal x257=(px*sj1);
1329 IkReal x258=(cj0*r02);
1330 IkReal x259=(cj1*py);
1331 IkReal x260=(r02*sj0);
1332 IkReal x261=(r01*sj0);
1333 IkReal x262=(cj1*px);
1334 IkReal x263=(pz*sj1);
1335 IkReal x264=((1.1e-7)*x251);
1336 IkReal x265=((0.106)*x252);
1337 IkReal x266=((0.106)*x251);
1338 IkReal x267=((1.1e-7)*x252);
1339 IkReal x268=((0.112)*x252);
1340 IkReal x269=((0.112)*x251);
1341 IkReal x270=((1.0)*py*sj1);
1342 IkReal x271=(cj3*x268);
1343 IkReal x272=(sj3*x269);
1344 IkReal x273=(cj3*x269);
1345 IkReal x274=(sj3*x268);
1346 IkReal x275=(x265+x264+x271);
1347 IkReal x276=(x266+x274+x273);
1348 evalcond[0]=((-1.1e-7)+(((-1.0)*sj0*x262))+x263+x276+((cj0*x259))+(((-1.0)*x267)));
1349 evalcond[1]=((-0.106)+((sj0*x257))+x254+x272+(((-1.0)*cj0*x270))+(((-1.0)*x275)));
1350 evalcond[2]=((((0.106)*x256))+((x258*x262))+(((-1.0)*sj0*x253*x254))+((x259*x260))+((py*x255))+(((0.106)*x261))+x275+(((-1.0)*x254*x256))+(((-1.0)*x272))+(((-1.0)*x253*x257)));
1351 evalcond[3]=((((-1.1e-7)*x256))+((r00*x259))+(((-1.1e-7)*x261))+(((-1.0)*x253*x262))+(((-1.0)*x257*x258))+x276+((cj0*pz*x255))+((x261*x263))+(((-1.0)*x267))+(((-1.0)*x260*x270)));
1352 if( IKabs(evalcond[0]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[1]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[2]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[3]) > IKFAST_EVALCOND_THRESH )
1353 {
1354 continue;
1355 }
1356 }
1357 
1358 {
1359 std::vector<IkSingleDOFSolutionBase<IkReal> > vinfos(5);
1360 vinfos[0].jointtype = 1;
1361 vinfos[0].foffset = j0;
1362 vinfos[0].indices[0] = _ij0[0];
1363 vinfos[0].indices[1] = _ij0[1];
1364 vinfos[0].maxsolutions = _nj0;
1365 vinfos[1].jointtype = 1;
1366 vinfos[1].foffset = j1;
1367 vinfos[1].indices[0] = _ij1[0];
1368 vinfos[1].indices[1] = _ij1[1];
1369 vinfos[1].maxsolutions = _nj1;
1370 vinfos[2].jointtype = 1;
1371 vinfos[2].foffset = j2;
1372 vinfos[2].indices[0] = _ij2[0];
1373 vinfos[2].indices[1] = _ij2[1];
1374 vinfos[2].maxsolutions = _nj2;
1375 vinfos[3].jointtype = 1;
1376 vinfos[3].foffset = j3;
1377 vinfos[3].indices[0] = _ij3[0];
1378 vinfos[3].indices[1] = _ij3[1];
1379 vinfos[3].maxsolutions = _nj3;
1380 vinfos[4].jointtype = 1;
1381 vinfos[4].foffset = j5;
1382 vinfos[4].indices[0] = _ij5[0];
1383 vinfos[4].indices[1] = _ij5[1];
1384 vinfos[4].maxsolutions = _nj5;
1385 std::vector<int> vfree(0);
1386 solutions.AddSolution(vinfos,vfree);
1387 }
1388 }
1389 }
1390 
1391 }
1392 
1393 }
1394 
1395 }
1396 } while(0);
1397 if( bgotonextstatement )
1398 {
1399 bool bgotonextstatement = true;
1400 do
1401 {
1402 if( 1 )
1403 {
1404 bgotonextstatement=false;
1405 continue; // branch miss [j2]
1406 
1407 }
1408 } while(0);
1409 if( bgotonextstatement )
1410 {
1411 }
1412 }
1413 }
1414 }
1415 
1416 } else
1417 {
1418 {
1419 IkReal j2array[1], cj2array[1], sj2array[1];
1420 bool j2valid[1]={false};
1421 _nj2 = 1;
1422 IkReal x277=((1.1e-7)*cj1);
1423 IkReal x278=(cj0*r01);
1424 IkReal x279=(cj5*sj3);
1425 IkReal x280=(cj3*cj5);
1426 IkReal x281=(cj1*sj0);
1427 IkReal x282=((0.112)*cj3);
1428 IkReal x283=(r02*sj1);
1429 IkReal x284=((0.112)*sj3);
1430 IkReal x285=((1.1e-7)*x279);
1431 IkReal x286=((1.0)*pz*sj1);
1432 IkReal x287=((1.0)*cj0*cj1*py);
1433 CheckValue<IkReal> x288 = IKatan2WithCheck(IkReal(((((-1.0)*r00*sj0*x277))+(((1.1e-7)*x283))+(((1.1e-7)*x280))+((r00*x281*x284))+(((-1.0)*x280*x286))+(((-1.0)*x280*x287))+((px*x280*x281))+((x277*x278))+(((-1.0)*cj1*x278*x284))+(((-1.0)*x283*x284)))),IkReal((((cj1*x278*x282))+(((0.106)*x283))+(((0.106)*cj1*x278))+((px*x279*x281))+(((-0.106)*r00*x281))+(((-1.0)*r00*x281*x282))+x285+(((-1.0)*x279*x287))+(((-1.0)*x279*x286))+((x282*x283)))),IKFAST_ATAN2_MAGTHRESH);
1434 if(!x288.valid){
1435 continue;
1436 }
1437 CheckValue<IkReal> x289=IKPowWithIntegerCheck(IKsign(((((0.112)*cj5))+(((0.106)*x280))+(((-1.0)*x285)))),-1);
1438 if(!x289.valid){
1439 continue;
1440 }
1441 j2array[0]=((-1.5707963267949)+(x288.value)+(((1.5707963267949)*(x289.value))));
1442 sj2array[0]=IKsin(j2array[0]);
1443 cj2array[0]=IKcos(j2array[0]);
1444 if( j2array[0] > IKPI )
1445 {
1446  j2array[0]-=IK2PI;
1447 }
1448 else if( j2array[0] < -IKPI )
1449 { j2array[0]+=IK2PI;
1450 }
1451 j2valid[0] = true;
1452 for(int ij2 = 0; ij2 < 1; ++ij2)
1453 {
1454 if( !j2valid[ij2] )
1455 {
1456  continue;
1457 }
1458 _ij2[0] = ij2; _ij2[1] = -1;
1459 for(int iij2 = ij2+1; iij2 < 1; ++iij2)
1460 {
1461 if( j2valid[iij2] && IKabs(cj2array[ij2]-cj2array[iij2]) < IKFAST_SOLUTION_THRESH && IKabs(sj2array[ij2]-sj2array[iij2]) < IKFAST_SOLUTION_THRESH )
1462 {
1463  j2valid[iij2]=false; _ij2[1] = iij2; break;
1464 }
1465 }
1466 j2 = j2array[ij2]; cj2 = cj2array[ij2]; sj2 = sj2array[ij2];
1467 {
1468 IkReal evalcond[8];
1469 IkReal x290=IKcos(j2);
1470 IkReal x291=IKsin(j2);
1471 IkReal x292=px*px;
1472 IkReal x293=pz*pz;
1473 IkReal x294=py*py;
1474 IkReal x295=(py*sj1);
1475 IkReal x296=((2.0)*r01);
1476 IkReal x297=(px*sj0);
1477 IkReal x298=(pz*r00);
1478 IkReal x299=(cj0*sj1);
1479 IkReal x300=((0.0237799999999879)*cj3);
1480 IkReal x301=(cj0*r01);
1481 IkReal x302=(px*r00);
1482 IkReal x303=((0.212)*pz);
1483 IkReal x304=((1.0)*px);
1484 IkReal x305=((2.332e-8)*cj5);
1485 IkReal x306=(cj1*r01);
1486 IkReal x307=(cj1*r02);
1487 IkReal x308=((2.2e-7)*r02);
1488 IkReal x309=(r01*sj0);
1489 IkReal x310=(r00*sj0);
1490 IkReal x311=((1.0)*cj1);
1491 IkReal x312=((2.0)*pz);
1492 IkReal x313=(cj0*r00);
1493 IkReal x314=((0.112)*cj3);
1494 IkReal x315=(cj1*py);
1495 IkReal x316=((1.0)*cj3);
1496 IkReal x317=((2.0)*cj0);
1497 IkReal x318=(cj0*py);
1498 IkReal x319=(r02*sj1);
1499 IkReal x320=((2.332e-8)*cj1);
1500 IkReal x321=((1.0)*r01);
1501 IkReal x322=(pz*sj1);
1502 IkReal x323=((1.0)*sj0);
1503 IkReal x324=(py*r01);
1504 IkReal x325=((0.212)*r02);
1505 IkReal x326=((0.0112359999999879)*cj1);
1506 IkReal x327=((2.0)*px);
1507 IkReal x328=(sj3*x290);
1508 IkReal x329=(cj5*x290);
1509 IkReal x330=(cj1*x292);
1510 IkReal x331=((1.0)*x292);
1511 IkReal x332=(cj5*x291);
1512 IkReal x333=(sj1*x294);
1513 IkReal x334=(sj5*x291);
1514 IkReal x335=(sj3*x291);
1515 IkReal x336=((0.106)*x290);
1516 IkReal x337=((1.1e-7)*x290);
1517 IkReal x338=((1.0)*x293);
1518 evalcond[0]=(((cj1*x301))+(((-1.0)*x310*x311))+((sj3*x332))+x319+(((-1.0)*x316*x329)));
1519 evalcond[1]=((((-1.0)*x299*x321))+(((-1.0)*x316*x332))+((sj1*x310))+x307+(((-1.0)*cj5*x328)));
1520 evalcond[2]=((-1.1e-7)+(((-1.0)*x297*x311))+x322+(((0.112)*x328))+(((0.106)*x291))+((x291*x314))+(((-1.0)*x337))+((cj0*x315)));
1521 evalcond[3]=((-0.106)+(((-1.0)*cj0*x295))+(((-1.0)*x290*x314))+((sj1*x297))+((cj1*pz))+(((0.112)*x335))+(((-1.1e-7)*x291))+(((-1.0)*x336)));
1522 evalcond[4]=((((-1.0)*sj5*x290*x314))+(((-1.0)*sj5*x336))+(((-1.1e-7)*x334))+(((0.106)*x309))+((cj0*px*x307))+(((0.112)*sj3*x334))+(((-1.0)*cj0*x298*x311))+(((0.106)*x313))+((r00*x295))+(((-1.0)*pz*x306*x323))+(((-1.0)*r01*sj1*x304))+((py*sj0*x307)));
1523 evalcond[5]=((((-1.0)*r02*x295*x323))+(((-1.1e-7)*x309))+((sj5*x337))+(((-0.106)*x334))+(((-1.1e-7)*x313))+((x298*x299))+((r00*x315))+((x309*x322))+(((-1.0)*r02*x299*x304))+(((-1.0)*x304*x306))+(((-1.0)*x314*x334))+(((-0.112)*sj5*x328)));
1524 evalcond[6]=(((x294*x319))+((x318*x325))+((x301*x326))+(((-1.0)*x301*x303))+(((0.0112359999999879)*x319))+(((-2.464e-8)*x332))+(((-1.0)*x302*x315*x317))+(((-1.0)*x294*x310*x311))+(((-2.332e-8)*sj1*x310))+(((2.2e-7)*x324))+(((-1.0)*x294*x301*x311))+(((-1.0)*x319*x338))+(((-1.0)*cj3*x291*x305))+((x296*x297*x315))+(((-1.0)*pz*x295*x296))+((x305*x328))+(((-0.023744)*x329))+(((-1.0)*x307*x312*x318))+(((-1.0)*x300*x329))+((x297*x307*x312))+(((0.212)*sj0*x298))+(((0.0013080000000121)*sj3*x332))+((cj1*x293*x301))+(((-1.0)*x293*x310*x311))+(((2.2e-7)*x302))+(((2.332e-8)*r01*x299))+(((-1.0)*sj1*x298*x327))+(((-1.0)*x310*x326))+(((-1.0)*x297*x325))+((x292*x319))+(((-2.332e-8)*x307))+((x301*x330))+((x310*x330))+((pz*x308)));
1525 evalcond[7]=((((-1.0)*x300*x332))+(((-1.0)*x295*x296*x297))+(((2.2e-7)*pz*x301))+((x310*x320))+((x292*x307))+(((-1.0)*sj1*x310*x331))+(((0.212)*x302))+(((-0.023744)*x332))+(((-2.332e-8)*x319))+((r02*x303))+((cj0*r02*x295*x312))+(((-1.0)*x293*x299*x321))+(((-1.0)*x308*x318))+((x294*x307))+((x305*x335))+((x295*x302*x317))+(((-1.0)*x301*x320))+((x297*x308))+(((-1.0)*x307*x338))+(((-0.0112359999999879)*sj1*x310))+(((0.0112359999999879)*r01*x299))+((sj1*x293*x310))+(((-0.0112359999999879)*x307))+((cj3*x290*x305))+(((-1.0)*pz*x296*x315))+(((0.212)*x324))+((r01*x294*x299))+(((-2.2e-7)*sj0*x298))+(((-1.0)*x292*x299*x321))+(((-1.0)*x297*x312*x319))+((x310*x333))+(((2.464e-8)*x329))+(((-0.0013080000000121)*cj5*x328))+(((-1.0)*cj1*x298*x327)));
1526 if( IKabs(evalcond[0]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[1]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[2]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[3]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[4]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[5]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[6]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[7]) > IKFAST_EVALCOND_THRESH )
1527 {
1528 continue;
1529 }
1530 }
1531 
1532 {
1533 std::vector<IkSingleDOFSolutionBase<IkReal> > vinfos(5);
1534 vinfos[0].jointtype = 1;
1535 vinfos[0].foffset = j0;
1536 vinfos[0].indices[0] = _ij0[0];
1537 vinfos[0].indices[1] = _ij0[1];
1538 vinfos[0].maxsolutions = _nj0;
1539 vinfos[1].jointtype = 1;
1540 vinfos[1].foffset = j1;
1541 vinfos[1].indices[0] = _ij1[0];
1542 vinfos[1].indices[1] = _ij1[1];
1543 vinfos[1].maxsolutions = _nj1;
1544 vinfos[2].jointtype = 1;
1545 vinfos[2].foffset = j2;
1546 vinfos[2].indices[0] = _ij2[0];
1547 vinfos[2].indices[1] = _ij2[1];
1548 vinfos[2].maxsolutions = _nj2;
1549 vinfos[3].jointtype = 1;
1550 vinfos[3].foffset = j3;
1551 vinfos[3].indices[0] = _ij3[0];
1552 vinfos[3].indices[1] = _ij3[1];
1553 vinfos[3].maxsolutions = _nj3;
1554 vinfos[4].jointtype = 1;
1555 vinfos[4].foffset = j5;
1556 vinfos[4].indices[0] = _ij5[0];
1557 vinfos[4].indices[1] = _ij5[1];
1558 vinfos[4].maxsolutions = _nj5;
1559 std::vector<int> vfree(0);
1560 solutions.AddSolution(vinfos,vfree);
1561 }
1562 }
1563 }
1564 
1565 }
1566 
1567 }
1568 
1569 } else
1570 {
1571 {
1572 IkReal j2array[1], cj2array[1], sj2array[1];
1573 bool j2valid[1]={false};
1574 _nj2 = 1;
1575 IkReal x339=(cj5*sj3);
1576 IkReal x340=(pz*sj1);
1577 IkReal x341=(cj3*cj5);
1578 IkReal x342=((1.1e-7)*sj1);
1579 IkReal x343=(cj0*r01);
1580 IkReal x344=(cj1*r02);
1581 IkReal x345=((0.112)*sj3);
1582 IkReal x346=((0.112)*cj3);
1583 IkReal x347=(r00*sj0);
1584 IkReal x348=((0.106)*sj1);
1585 IkReal x349=((1.1e-7)*x341);
1586 IkReal x350=(cj1*px*sj0);
1587 IkReal x351=(cj0*cj1*py);
1588 IkReal x352=((0.112)*sj1*x347);
1589 CheckValue<IkReal> x353=IKPowWithIntegerCheck(IKsign(((((-0.106)*x339))+(((-1.0)*x349)))),-1);
1590 if(!x353.valid){
1591 continue;
1592 }
1593 CheckValue<IkReal> x354 = IKatan2WithCheck(IkReal(((((-1.1e-7)*x344))+(((-1.1e-7)*x339))+(((-1.0)*sj1*x343*x345))+((sj1*x345*x347))+((x344*x345))+(((-1.0)*x339*x350))+((x339*x340))+(((-1.0)*x342*x347))+((x339*x351))+((x342*x343)))),IkReal(((((-1.0)*x341*x351))+(((-0.106)*x344))+((x341*x350))+x349+(((-1.0)*x344*x346))+((sj1*x343*x346))+(((-1.0)*x340*x341))+(((-1.0)*x347*x348))+(((-1.0)*sj1*x346*x347))+((x343*x348)))),IKFAST_ATAN2_MAGTHRESH);
1594 if(!x354.valid){
1595 continue;
1596 }
1597 j2array[0]=((-1.5707963267949)+(((1.5707963267949)*(x353.value)))+(x354.value));
1598 sj2array[0]=IKsin(j2array[0]);
1599 cj2array[0]=IKcos(j2array[0]);
1600 if( j2array[0] > IKPI )
1601 {
1602  j2array[0]-=IK2PI;
1603 }
1604 else if( j2array[0] < -IKPI )
1605 { j2array[0]+=IK2PI;
1606 }
1607 j2valid[0] = true;
1608 for(int ij2 = 0; ij2 < 1; ++ij2)
1609 {
1610 if( !j2valid[ij2] )
1611 {
1612  continue;
1613 }
1614 _ij2[0] = ij2; _ij2[1] = -1;
1615 for(int iij2 = ij2+1; iij2 < 1; ++iij2)
1616 {
1617 if( j2valid[iij2] && IKabs(cj2array[ij2]-cj2array[iij2]) < IKFAST_SOLUTION_THRESH && IKabs(sj2array[ij2]-sj2array[iij2]) < IKFAST_SOLUTION_THRESH )
1618 {
1619  j2valid[iij2]=false; _ij2[1] = iij2; break;
1620 }
1621 }
1622 j2 = j2array[ij2]; cj2 = cj2array[ij2]; sj2 = sj2array[ij2];
1623 {
1624 IkReal evalcond[8];
1625 IkReal x355=IKcos(j2);
1626 IkReal x356=IKsin(j2);
1627 IkReal x357=px*px;
1628 IkReal x358=pz*pz;
1629 IkReal x359=py*py;
1630 IkReal x360=(py*sj1);
1631 IkReal x361=((2.0)*r01);
1632 IkReal x362=(px*sj0);
1633 IkReal x363=(pz*r00);
1634 IkReal x364=(cj0*sj1);
1635 IkReal x365=((0.0237799999999879)*cj3);
1636 IkReal x366=(cj0*r01);
1637 IkReal x367=(px*r00);
1638 IkReal x368=((0.212)*pz);
1639 IkReal x369=((1.0)*px);
1640 IkReal x370=((2.332e-8)*cj5);
1641 IkReal x371=(cj1*r01);
1642 IkReal x372=(cj1*r02);
1643 IkReal x373=((2.2e-7)*r02);
1644 IkReal x374=(r01*sj0);
1645 IkReal x375=(r00*sj0);
1646 IkReal x376=((1.0)*cj1);
1647 IkReal x377=((2.0)*pz);
1648 IkReal x378=(cj0*r00);
1649 IkReal x379=((0.112)*cj3);
1650 IkReal x380=(cj1*py);
1651 IkReal x381=((1.0)*cj3);
1652 IkReal x382=((2.0)*cj0);
1653 IkReal x383=(cj0*py);
1654 IkReal x384=(r02*sj1);
1655 IkReal x385=((2.332e-8)*cj1);
1656 IkReal x386=((1.0)*r01);
1657 IkReal x387=(pz*sj1);
1658 IkReal x388=((1.0)*sj0);
1659 IkReal x389=(py*r01);
1660 IkReal x390=((0.212)*r02);
1661 IkReal x391=((0.0112359999999879)*cj1);
1662 IkReal x392=((2.0)*px);
1663 IkReal x393=(sj3*x355);
1664 IkReal x394=(cj5*x355);
1665 IkReal x395=(cj1*x357);
1666 IkReal x396=((1.0)*x357);
1667 IkReal x397=(cj5*x356);
1668 IkReal x398=(sj1*x359);
1669 IkReal x399=(sj5*x356);
1670 IkReal x400=(sj3*x356);
1671 IkReal x401=((0.106)*x355);
1672 IkReal x402=((1.1e-7)*x355);
1673 IkReal x403=((1.0)*x358);
1674 evalcond[0]=(x384+((sj3*x397))+((cj1*x366))+(((-1.0)*x381*x394))+(((-1.0)*x375*x376)));
1675 evalcond[1]=(((sj1*x375))+(((-1.0)*x364*x386))+(((-1.0)*cj5*x393))+x372+(((-1.0)*x381*x397)));
1676 evalcond[2]=((-1.1e-7)+(((-1.0)*x362*x376))+((x356*x379))+x387+((cj0*x380))+(((0.112)*x393))+(((-1.0)*x402))+(((0.106)*x356)));
1677 evalcond[3]=((-0.106)+(((-1.0)*x355*x379))+((sj1*x362))+((cj1*pz))+(((-1.0)*cj0*x360))+(((0.112)*x400))+(((-1.1e-7)*x356))+(((-1.0)*x401)));
1678 evalcond[4]=((((-1.1e-7)*x399))+(((-1.0)*r01*sj1*x369))+(((-1.0)*sj5*x401))+((cj0*px*x372))+((r00*x360))+(((-1.0)*sj5*x355*x379))+((py*sj0*x372))+(((-1.0)*pz*x371*x388))+(((0.106)*x378))+(((0.106)*x374))+(((0.112)*sj3*x399))+(((-1.0)*cj0*x363*x376)));
1679 evalcond[5]=((((-0.106)*x399))+(((-1.0)*r02*x360*x388))+((x374*x387))+(((-1.0)*r02*x364*x369))+((sj5*x402))+(((-1.0)*x369*x371))+((r00*x380))+(((-1.0)*x379*x399))+((x363*x364))+(((-0.112)*sj5*x393))+(((-1.1e-7)*x374))+(((-1.1e-7)*x378)));
1680 evalcond[6]=((((-0.023744)*x394))+((cj1*x358*x366))+(((2.2e-7)*x367))+((x359*x384))+(((-1.0)*x362*x390))+(((-2.332e-8)*x372))+(((-1.0)*x359*x366*x376))+((x375*x395))+((x366*x395))+((x366*x391))+((x357*x384))+(((0.0013080000000121)*sj3*x397))+(((-1.0)*x384*x403))+(((-1.0)*sj1*x363*x392))+(((-1.0)*x366*x368))+(((-2.464e-8)*x397))+(((-1.0)*x367*x380*x382))+(((-2.332e-8)*sj1*x375))+(((-1.0)*cj3*x356*x370))+(((2.332e-8)*r01*x364))+((pz*x373))+(((-1.0)*x372*x377*x383))+(((-1.0)*x358*x375*x376))+(((0.212)*sj0*x363))+(((-1.0)*x359*x375*x376))+(((0.0112359999999879)*x384))+(((-1.0)*pz*x360*x361))+(((-1.0)*x365*x394))+((x362*x372*x377))+(((2.2e-7)*x389))+((x370*x393))+(((-1.0)*x375*x391))+((x383*x390))+((x361*x362*x380)));
1681 evalcond[7]=((((-0.023744)*x397))+(((-1.0)*x373*x383))+(((-1.0)*x372*x403))+(((-2.2e-7)*sj0*x363))+((r01*x359*x364))+(((-1.0)*sj1*x375*x396))+((sj1*x358*x375))+((x360*x367*x382))+(((-0.0112359999999879)*x372))+(((-1.0)*x358*x364*x386))+(((-0.0112359999999879)*sj1*x375))+((x370*x400))+((cj3*x355*x370))+((x375*x398))+(((0.212)*x389))+((x359*x372))+(((-2.332e-8)*x384))+(((-1.0)*x360*x361*x362))+(((2.464e-8)*x394))+(((-1.0)*pz*x361*x380))+(((0.212)*x367))+(((-1.0)*cj1*x363*x392))+(((-1.0)*x365*x397))+(((-0.0013080000000121)*cj5*x393))+(((-1.0)*x357*x364*x386))+((x357*x372))+((x375*x385))+(((0.0112359999999879)*r01*x364))+((cj0*r02*x360*x377))+(((-1.0)*x366*x385))+((x362*x373))+((r02*x368))+(((2.2e-7)*pz*x366))+(((-1.0)*x362*x377*x384)));
1682 if( IKabs(evalcond[0]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[1]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[2]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[3]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[4]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[5]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[6]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[7]) > IKFAST_EVALCOND_THRESH )
1683 {
1684 continue;
1685 }
1686 }
1687 
1688 {
1689 std::vector<IkSingleDOFSolutionBase<IkReal> > vinfos(5);
1690 vinfos[0].jointtype = 1;
1691 vinfos[0].foffset = j0;
1692 vinfos[0].indices[0] = _ij0[0];
1693 vinfos[0].indices[1] = _ij0[1];
1694 vinfos[0].maxsolutions = _nj0;
1695 vinfos[1].jointtype = 1;
1696 vinfos[1].foffset = j1;
1697 vinfos[1].indices[0] = _ij1[0];
1698 vinfos[1].indices[1] = _ij1[1];
1699 vinfos[1].maxsolutions = _nj1;
1700 vinfos[2].jointtype = 1;
1701 vinfos[2].foffset = j2;
1702 vinfos[2].indices[0] = _ij2[0];
1703 vinfos[2].indices[1] = _ij2[1];
1704 vinfos[2].maxsolutions = _nj2;
1705 vinfos[3].jointtype = 1;
1706 vinfos[3].foffset = j3;
1707 vinfos[3].indices[0] = _ij3[0];
1708 vinfos[3].indices[1] = _ij3[1];
1709 vinfos[3].maxsolutions = _nj3;
1710 vinfos[4].jointtype = 1;
1711 vinfos[4].foffset = j5;
1712 vinfos[4].indices[0] = _ij5[0];
1713 vinfos[4].indices[1] = _ij5[1];
1714 vinfos[4].maxsolutions = _nj5;
1715 std::vector<int> vfree(0);
1716 solutions.AddSolution(vinfos,vfree);
1717 }
1718 }
1719 }
1720 
1721 }
1722 
1723 }
1724 
1725 } else
1726 {
1727 {
1728 IkReal j2array[1], cj2array[1], sj2array[1];
1729 bool j2valid[1]={false};
1730 _nj2 = 1;
1731 IkReal x404=(cj3*r02);
1732 IkReal x405=((1.0)*sj1);
1733 IkReal x406=(r02*sj3);
1734 IkReal x407=(r00*sj0*sj3);
1735 IkReal x408=(cj3*r00*sj0);
1736 IkReal x409=(cj0*cj3*r01);
1737 IkReal x410=((1.0)*cj0*r01*sj3);
1738 CheckValue<IkReal> x411 = IKatan2WithCheck(IkReal((((sj1*x408))+(((-1.0)*cj1*x410))+(((-1.0)*x405*x406))+(((-1.0)*x405*x409))+((cj1*x404))+((cj1*x407)))),IkReal((((sj1*x407))+((sj1*x404))+(((-1.0)*cj1*x408))+(((-1.0)*cj0*r01*sj3*x405))+((cj1*x406))+((cj1*x409)))),IKFAST_ATAN2_MAGTHRESH);
1739 if(!x411.valid){
1740 continue;
1741 }
1743 if(!x412.valid){
1744 continue;
1745 }
1746 j2array[0]=((-1.5707963267949)+(x411.value)+(((1.5707963267949)*(x412.value))));
1747 sj2array[0]=IKsin(j2array[0]);
1748 cj2array[0]=IKcos(j2array[0]);
1749 if( j2array[0] > IKPI )
1750 {
1751  j2array[0]-=IK2PI;
1752 }
1753 else if( j2array[0] < -IKPI )
1754 { j2array[0]+=IK2PI;
1755 }
1756 j2valid[0] = true;
1757 for(int ij2 = 0; ij2 < 1; ++ij2)
1758 {
1759 if( !j2valid[ij2] )
1760 {
1761  continue;
1762 }
1763 _ij2[0] = ij2; _ij2[1] = -1;
1764 for(int iij2 = ij2+1; iij2 < 1; ++iij2)
1765 {
1766 if( j2valid[iij2] && IKabs(cj2array[ij2]-cj2array[iij2]) < IKFAST_SOLUTION_THRESH && IKabs(sj2array[ij2]-sj2array[iij2]) < IKFAST_SOLUTION_THRESH )
1767 {
1768  j2valid[iij2]=false; _ij2[1] = iij2; break;
1769 }
1770 }
1771 j2 = j2array[ij2]; cj2 = cj2array[ij2]; sj2 = sj2array[ij2];
1772 {
1773 IkReal evalcond[8];
1774 IkReal x413=IKcos(j2);
1775 IkReal x414=IKsin(j2);
1776 IkReal x415=px*px;
1777 IkReal x416=pz*pz;
1778 IkReal x417=py*py;
1779 IkReal x418=(py*sj1);
1780 IkReal x419=((2.0)*r01);
1781 IkReal x420=(px*sj0);
1782 IkReal x421=(pz*r00);
1783 IkReal x422=(cj0*sj1);
1784 IkReal x423=((0.0237799999999879)*cj3);
1785 IkReal x424=(cj0*r01);
1786 IkReal x425=(px*r00);
1787 IkReal x426=((0.212)*pz);
1788 IkReal x427=((1.0)*px);
1789 IkReal x428=((2.332e-8)*cj5);
1790 IkReal x429=(cj1*r01);
1791 IkReal x430=(cj1*r02);
1792 IkReal x431=((2.2e-7)*r02);
1793 IkReal x432=(r01*sj0);
1794 IkReal x433=(r00*sj0);
1795 IkReal x434=((1.0)*cj1);
1796 IkReal x435=((2.0)*pz);
1797 IkReal x436=(cj0*r00);
1798 IkReal x437=((0.112)*cj3);
1799 IkReal x438=(cj1*py);
1800 IkReal x439=((1.0)*cj3);
1801 IkReal x440=((2.0)*cj0);
1802 IkReal x441=(cj0*py);
1803 IkReal x442=(r02*sj1);
1804 IkReal x443=((2.332e-8)*cj1);
1805 IkReal x444=((1.0)*r01);
1806 IkReal x445=(pz*sj1);
1807 IkReal x446=((1.0)*sj0);
1808 IkReal x447=(py*r01);
1809 IkReal x448=((0.212)*r02);
1810 IkReal x449=((0.0112359999999879)*cj1);
1811 IkReal x450=((2.0)*px);
1812 IkReal x451=(sj3*x413);
1813 IkReal x452=(cj5*x413);
1814 IkReal x453=(cj1*x415);
1815 IkReal x454=((1.0)*x415);
1816 IkReal x455=(cj5*x414);
1817 IkReal x456=(sj1*x417);
1818 IkReal x457=(sj5*x414);
1819 IkReal x458=(sj3*x414);
1820 IkReal x459=((0.106)*x413);
1821 IkReal x460=((1.1e-7)*x413);
1822 IkReal x461=((1.0)*x416);
1823 evalcond[0]=(((sj3*x455))+(((-1.0)*x433*x434))+(((-1.0)*x439*x452))+x442+((cj1*x424)));
1824 evalcond[1]=((((-1.0)*x439*x455))+(((-1.0)*cj5*x451))+x430+(((-1.0)*x422*x444))+((sj1*x433)));
1825 evalcond[2]=((-1.1e-7)+((x414*x437))+(((-1.0)*x420*x434))+(((0.112)*x451))+(((-1.0)*x460))+((cj0*x438))+x445+(((0.106)*x414)));
1826 evalcond[3]=((-0.106)+(((-1.0)*x413*x437))+(((-1.1e-7)*x414))+(((-1.0)*cj0*x418))+(((0.112)*x458))+((cj1*pz))+(((-1.0)*x459))+((sj1*x420)));
1827 evalcond[4]=(((py*sj0*x430))+(((-1.0)*pz*x429*x446))+(((0.112)*sj3*x457))+(((-1.0)*r01*sj1*x427))+(((-1.0)*sj5*x459))+(((0.106)*x436))+(((0.106)*x432))+(((-1.0)*cj0*x421*x434))+((cj0*px*x430))+((r00*x418))+(((-1.1e-7)*x457))+(((-1.0)*sj5*x413*x437)));
1828 evalcond[5]=((((-1.1e-7)*x436))+(((-1.1e-7)*x432))+(((-1.0)*x437*x457))+(((-1.0)*x427*x429))+(((-0.112)*sj5*x451))+((r00*x438))+(((-1.0)*r02*x418*x446))+((sj5*x460))+(((-0.106)*x457))+((x421*x422))+((x432*x445))+(((-1.0)*r02*x422*x427)));
1829 evalcond[6]=((((-1.0)*x416*x433*x434))+((x419*x420*x438))+(((0.0112359999999879)*x442))+((x428*x451))+(((-1.0)*x430*x435*x441))+((x424*x449))+((x415*x442))+(((-1.0)*x423*x452))+(((-1.0)*sj1*x421*x450))+(((-1.0)*x433*x449))+(((2.332e-8)*r01*x422))+((x433*x453))+(((-1.0)*x420*x448))+(((-1.0)*cj3*x414*x428))+(((-1.0)*pz*x418*x419))+((pz*x431))+(((-2.332e-8)*sj1*x433))+((cj1*x416*x424))+((x424*x453))+(((-1.0)*x417*x424*x434))+((x441*x448))+(((-1.0)*x442*x461))+(((2.2e-7)*x425))+((x420*x430*x435))+(((-1.0)*x424*x426))+(((0.212)*sj0*x421))+(((-0.023744)*x452))+((x417*x442))+(((2.2e-7)*x447))+(((-1.0)*x417*x433*x434))+(((-1.0)*x425*x438*x440))+(((0.0013080000000121)*sj3*x455))+(((-2.464e-8)*x455))+(((-2.332e-8)*x430)));
1830 evalcond[7]=(((x428*x458))+(((-2.332e-8)*x442))+(((-1.0)*x423*x455))+((x415*x430))+(((2.2e-7)*pz*x424))+((x433*x456))+(((2.464e-8)*x452))+((r01*x417*x422))+(((-1.0)*x418*x419*x420))+(((-1.0)*x431*x441))+(((-1.0)*x420*x435*x442))+((r02*x426))+(((-1.0)*pz*x419*x438))+(((0.212)*x425))+(((-1.0)*cj1*x421*x450))+(((0.212)*x447))+(((-1.0)*x424*x443))+((sj1*x416*x433))+((cj0*r02*x418*x435))+(((-2.2e-7)*sj0*x421))+((cj3*x413*x428))+(((-0.0112359999999879)*sj1*x433))+(((-0.023744)*x455))+(((-1.0)*sj1*x433*x454))+(((-1.0)*x415*x422*x444))+((x418*x425*x440))+(((-1.0)*x416*x422*x444))+((x420*x431))+((x433*x443))+((x417*x430))+(((-0.0112359999999879)*x430))+(((-1.0)*x430*x461))+(((-0.0013080000000121)*cj5*x451))+(((0.0112359999999879)*r01*x422)));
1831 if( IKabs(evalcond[0]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[1]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[2]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[3]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[4]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[5]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[6]) > IKFAST_EVALCOND_THRESH || IKabs(evalcond[7]) > IKFAST_EVALCOND_THRESH )
1832 {
1833 continue;
1834 }
1835 }
1836 
1837 {
1838 std::vector<IkSingleDOFSolutionBase<IkReal> > vinfos(5);
1839 vinfos[0].jointtype = 1;
1840 vinfos[0].foffset = j0;
1841 vinfos[0].indices[0] = _ij0[0];
1842 vinfos[0].indices[1] = _ij0[1];
1843 vinfos[0].maxsolutions = _nj0;
1844 vinfos[1].jointtype = 1;
1845 vinfos[1].foffset = j1;
1846 vinfos[1].indices[0] = _ij1[0];
1847 vinfos[1].indices[1] = _ij1[1];
1848 vinfos[1].maxsolutions = _nj1;
1849 vinfos[2].jointtype = 1;
1850 vinfos[2].foffset = j2;
1851 vinfos[2].indices[0] = _ij2[0];
1852 vinfos[2].indices[1] = _ij2[1];
1853 vinfos[2].maxsolutions = _nj2;
1854 vinfos[3].jointtype = 1;
1855 vinfos[3].foffset = j3;
1856 vinfos[3].indices[0] = _ij3[0];
1857 vinfos[3].indices[1] = _ij3[1];
1858 vinfos[3].maxsolutions = _nj3;
1859 vinfos[4].jointtype = 1;
1860 vinfos[4].foffset = j5;
1861 vinfos[4].indices[0] = _ij5[0];
1862 vinfos[4].indices[1] = _ij5[1];
1863 vinfos[4].maxsolutions = _nj5;
1864 std::vector<int> vfree(0);
1865 solutions.AddSolution(vinfos,vfree);
1866 }
1867 }
1868 }
1869 
1870 }
1871 
1872 }
1873 }
1874 }
1875 
1876 }
1877 
1878 }
1879 }
1880 }
1881  }
1882 }
1883 }
1884 
1885 }
1886 
1887 }
1888 }
1889 return solutions.GetNumSolutions()>0;
1890 }
1891 static inline void polyroots3(IkReal rawcoeffs[3+1], IkReal rawroots[3], int& numroots)
1892 {
1893  using std::complex;
1894  if( rawcoeffs[0] == 0 ) {
1895  // solve with one reduced degree
1896  polyroots2(&rawcoeffs[1], &rawroots[0], numroots);
1897  return;
1898  }
1899  IKFAST_ASSERT(rawcoeffs[0] != 0);
1900  const IkReal tol = 128.0*std::numeric_limits<IkReal>::epsilon();
1901  const IkReal tolsqrt = sqrt(std::numeric_limits<IkReal>::epsilon());
1902  complex<IkReal> coeffs[3];
1903  const int maxsteps = 110;
1904  for(int i = 0; i < 3; ++i) {
1905  coeffs[i] = complex<IkReal>(rawcoeffs[i+1]/rawcoeffs[0]);
1906  }
1907  complex<IkReal> roots[3];
1908  IkReal err[3];
1909  roots[0] = complex<IkReal>(1,0);
1910  roots[1] = complex<IkReal>(0.4,0.9); // any complex number not a root of unity works
1911  err[0] = 1.0;
1912  err[1] = 1.0;
1913  for(int i = 2; i < 3; ++i) {
1914  roots[i] = roots[i-1]*roots[1];
1915  err[i] = 1.0;
1916  }
1917  for(int step = 0; step < maxsteps; ++step) {
1918  bool changed = false;
1919  for(int i = 0; i < 3; ++i) {
1920  if ( err[i] >= tol ) {
1921  changed = true;
1922  // evaluate
1923  complex<IkReal> x = roots[i] + coeffs[0];
1924  for(int j = 1; j < 3; ++j) {
1925  x = roots[i] * x + coeffs[j];
1926  }
1927  for(int j = 0; j < 3; ++j) {
1928  if( i != j ) {
1929  if( roots[i] != roots[j] ) {
1930  x /= (roots[i] - roots[j]);
1931  }
1932  }
1933  }
1934  roots[i] -= x;
1935  err[i] = abs(x);
1936  }
1937  }
1938  if( !changed ) {
1939  break;
1940  }
1941  }
1942 
1943  numroots = 0;
1944  bool visited[3] = {false};
1945  for(int i = 0; i < 3; ++i) {
1946  if( !visited[i] ) {
1947  // might be a multiple root, in which case it will have more error than the other roots
1948  // find any neighboring roots, and take the average
1949  complex<IkReal> newroot=roots[i];
1950  int n = 1;
1951  for(int j = i+1; j < 3; ++j) {
1952  // care about error in real much more than imaginary
1953  if( abs(real(roots[i])-real(roots[j])) < tolsqrt && abs(imag(roots[i])-imag(roots[j])) < 0.002 ) {
1954  newroot += roots[j];
1955  n += 1;
1956  visited[j] = true;
1957  }
1958  }
1959  if( n > 1 ) {
1960  newroot /= n;
1961  }
1962  // there are still cases where even the mean is not accurate enough, until a better multi-root algorithm is used, need to use the sqrt
1963  if( IKabs(imag(newroot)) < tolsqrt ) {
1964  rawroots[numroots++] = real(newroot);
1965  }
1966  }
1967  }
1968 }
1969 static inline void polyroots2(IkReal rawcoeffs[2+1], IkReal rawroots[2], int& numroots) {
1970  IkReal det = rawcoeffs[1]*rawcoeffs[1]-4*rawcoeffs[0]*rawcoeffs[2];
1971  if( det < 0 ) {
1972  numroots=0;
1973  }
1974  else if( det == 0 ) {
1975  rawroots[0] = -0.5*rawcoeffs[1]/rawcoeffs[0];
1976  numroots = 1;
1977  }
1978  else {
1979  det = IKsqrt(det);
1980  rawroots[0] = (-rawcoeffs[1]+det)/(2*rawcoeffs[0]);
1981  rawroots[1] = (-rawcoeffs[1]-det)/(2*rawcoeffs[0]);//rawcoeffs[2]/(rawcoeffs[0]*rawroots[0]);
1982  numroots = 2;
1983  }
1984 }
1985 static inline void polyroots4(IkReal rawcoeffs[4+1], IkReal rawroots[4], int& numroots)
1986 {
1987  using std::complex;
1988  if( rawcoeffs[0] == 0 ) {
1989  // solve with one reduced degree
1990  polyroots3(&rawcoeffs[1], &rawroots[0], numroots);
1991  return;
1992  }
1993  IKFAST_ASSERT(rawcoeffs[0] != 0);
1994  const IkReal tol = 128.0*std::numeric_limits<IkReal>::epsilon();
1995  const IkReal tolsqrt = sqrt(std::numeric_limits<IkReal>::epsilon());
1996  complex<IkReal> coeffs[4];
1997  const int maxsteps = 110;
1998  for(int i = 0; i < 4; ++i) {
1999  coeffs[i] = complex<IkReal>(rawcoeffs[i+1]/rawcoeffs[0]);
2000  }
2001  complex<IkReal> roots[4];
2002  IkReal err[4];
2003  roots[0] = complex<IkReal>(1,0);
2004  roots[1] = complex<IkReal>(0.4,0.9); // any complex number not a root of unity works
2005  err[0] = 1.0;
2006  err[1] = 1.0;
2007  for(int i = 2; i < 4; ++i) {
2008  roots[i] = roots[i-1]*roots[1];
2009  err[i] = 1.0;
2010  }
2011  for(int step = 0; step < maxsteps; ++step) {
2012  bool changed = false;
2013  for(int i = 0; i < 4; ++i) {
2014  if ( err[i] >= tol ) {
2015  changed = true;
2016  // evaluate
2017  complex<IkReal> x = roots[i] + coeffs[0];
2018  for(int j = 1; j < 4; ++j) {
2019  x = roots[i] * x + coeffs[j];
2020  }
2021  for(int j = 0; j < 4; ++j) {
2022  if( i != j ) {
2023  if( roots[i] != roots[j] ) {
2024  x /= (roots[i] - roots[j]);
2025  }
2026  }
2027  }
2028  roots[i] -= x;
2029  err[i] = abs(x);
2030  }
2031  }
2032  if( !changed ) {
2033  break;
2034  }
2035  }
2036 
2037  numroots = 0;
2038  bool visited[4] = {false};
2039  for(int i = 0; i < 4; ++i) {
2040  if( !visited[i] ) {
2041  // might be a multiple root, in which case it will have more error than the other roots
2042  // find any neighboring roots, and take the average
2043  complex<IkReal> newroot=roots[i];
2044  int n = 1;
2045  for(int j = i+1; j < 4; ++j) {
2046  // care about error in real much more than imaginary
2047  if( abs(real(roots[i])-real(roots[j])) < tolsqrt && abs(imag(roots[i])-imag(roots[j])) < 0.002 ) {
2048  newroot += roots[j];
2049  n += 1;
2050  visited[j] = true;
2051  }
2052  }
2053  if( n > 1 ) {
2054  newroot /= n;
2055  }
2056  // there are still cases where even the mean is not accurate enough, until a better multi-root algorithm is used, need to use the sqrt
2057  if( IKabs(imag(newroot)) < tolsqrt ) {
2058  rawroots[numroots++] = real(newroot);
2059  }
2060  }
2061  }
2062 }
2063 };
2064 
2065 
2068 IKFAST_API bool ComputeIk(const IkReal* eetrans, const IkReal* eerot, const IkReal* pfree, IkSolutionListBase<IkReal>& solutions) {
2069 IKSolver solver;
2070 return solver.ComputeIk(eetrans,eerot,pfree,solutions);
2071 }
2072 
2073 IKFAST_API bool ComputeIk2(const IkReal* eetrans, const IkReal* eerot, const IkReal* pfree, IkSolutionListBase<IkReal>& solutions, void* pOpenRAVEManip) {
2074 IKSolver solver;
2075 return solver.ComputeIk(eetrans,eerot,pfree,solutions);
2076 }
2077 
2078 IKFAST_API const char* GetKinematicsHash() { return "<robot:GenericRobot - turtlebot_arm (3560475dd424b0fa84bb2c480a84c0dc)>"; }
2079 
2080 IKFAST_API const char* GetIkFastVersion() { return "0x1000004a"; }
2081 
2082 #ifdef IKFAST_NAMESPACE
2083 } // end namespace
2084 #endif
2085 
2086 #ifndef IKFAST_NO_MAIN
2087 #include <stdio.h>
2088 #include <stdlib.h>
2089 #ifdef IKFAST_NAMESPACE
2090 using namespace IKFAST_NAMESPACE;
2091 #endif
2092 int main(int argc, char** argv)
2093 {
2094  if( argc != 12+GetNumFreeParameters()+1 ) {
2095  printf("\nUsage: ./ik r00 r01 r02 t0 r10 r11 r12 t1 r20 r21 r22 t2 free0 ...\n\n"
2096  "Returns the ik solutions given the transformation of the end effector specified by\n"
2097  "a 3x3 rotation R (rXX), and a 3x1 translation (tX).\n"
2098  "There are %d free parameters that have to be specified.\n\n",GetNumFreeParameters());
2099  return 1;
2100  }
2101 
2102  IkSolutionList<IkReal> solutions;
2103  std::vector<IkReal> vfree(GetNumFreeParameters());
2104  IkReal eerot[9],eetrans[3];
2105  eerot[0] = atof(argv[1]); eerot[1] = atof(argv[2]); eerot[2] = atof(argv[3]); eetrans[0] = atof(argv[4]);
2106  eerot[3] = atof(argv[5]); eerot[4] = atof(argv[6]); eerot[5] = atof(argv[7]); eetrans[1] = atof(argv[8]);
2107  eerot[6] = atof(argv[9]); eerot[7] = atof(argv[10]); eerot[8] = atof(argv[11]); eetrans[2] = atof(argv[12]);
2108  for(std::size_t i = 0; i < vfree.size(); ++i)
2109  vfree[i] = atof(argv[13+i]);
2110  bool bSuccess = ComputeIk(eetrans, eerot, vfree.size() > 0 ? &vfree[0] : NULL, solutions);
2111 
2112  if( !bSuccess ) {
2113  fprintf(stderr,"Failed to get ik solution\n");
2114  return -1;
2115  }
2116 
2117  printf("Found %d ik solutions:\n", (int)solutions.GetNumSolutions());
2118  std::vector<IkReal> solvalues(GetNumJoints());
2119  for(std::size_t i = 0; i < solutions.GetNumSolutions(); ++i) {
2120  const IkSolutionBase<IkReal>& sol = solutions.GetSolution(i);
2121  printf("sol%d (free=%d): ", (int)i, (int)sol.GetFree().size());
2122  std::vector<IkReal> vsolfree(sol.GetFree().size());
2123  sol.GetSolution(&solvalues[0],vsolfree.size()>0?&vsolfree[0]:NULL);
2124  for( std::size_t j = 0; j < solvalues.size(); ++j)
2125  printf("%.15f, ", solvalues[j]);
2126  printf("\n");
2127  }
2128  return 0;
2129 }
2130 
2131 #endif
#define IKFAST_ASSERT(b)
Definition: ikfast.h:45
virtual const IkSolutionBase< T > & GetSolution(size_t index) const
returns the solution pointer
Definition: ikfast.h:283
IKFAST_API bool ComputeIk2(const IkReal *eetrans, const IkReal *eerot, const IkReal *pfree, IkSolutionListBase< IkReal > &solutions, void *pOpenRAVEManip)
float IKfmod(float x, float y)
#define IKFAST_ATAN2_MAGTHRESH
IKFAST_API void ComputeFk(const IkReal *j, IkReal *eetrans, IkReal *eerot)
CheckValue< T > IKPowWithIntegerCheck(T f, int n)
float IKsqr(float f)
IKFAST_API bool ComputeIk(const IkReal *eetrans, const IkReal *eerot, const IkReal *pfree, IkSolutionListBase< IkReal > &solutions)
float IKcos(float f)
#define IKFAST_SINCOS_THRESH
float IKsign(float f)
INLINE Rall1d< T, V, S > log(const Rall1d< T, V, S > &arg)
virtual size_t GetNumSolutions() const
returns the number of solutions stored
Definition: ikfast.h:294
void dgetrf_(const int *m, const int *n, double *a, const int *lda, int *ipiv, int *info)
#define IKFAST_EVALCOND_THRESH
float IKabs(float f)
The discrete solutions are returned in this structure.
Definition: ikfast.h:70
IKFAST_API int * GetFreeParameters()
float IKasin(float f)
virtual const std::vector< int > & GetFree() const =0
Gets the indices of the configuration space that have to be preset before a full solution can be retu...
IKFAST_API int GetNumJoints()
virtual size_t AddSolution(const std::vector< IkSingleDOFSolutionBase< T > > &vinfos, const std::vector< int > &vfree)=0
add one solution and return its index for later retrieval
void dgetri_(const int *n, const double *a, const int *lda, int *ipiv, double *work, const int *lwork, int *info)
CheckValue< T > IKatan2WithCheck(T fy, T fx, T epsilon)
INLINE Rall1d< T, V, S > atan(const Rall1d< T, V, S > &x)
static void polyroots3(IkReal rawcoeffs[3+1], IkReal rawroots[3], int &numroots)
float IKacos(float f)
INLINE Rall1d< T, V, S > asin(const Rall1d< T, V, S > &x)
IKFAST_API const char * GetKinematicsHash()
#define IKFAST_COMPILE_ASSERT(x)
virtual void Clear()=0
clears all current solutions, note that any memory addresses returned from GetSolution will be invali...
IKFAST_API int GetIkType()
void dgeev_(const char *jobvl, const char *jobvr, const int *n, double *a, const int *lda, double *wr, double *wi, double *vl, const int *ldvl, double *vr, const int *ldvr, double *work, const int *lwork, int *info)
#define IKFAST_SOLUTION_THRESH
INLINE Rall1d< T, V, S > sqrt(const Rall1d< T, V, S > &arg)
virtual void GetSolution(T *solution, const T *freevalues) const =0
gets a concrete solution
bool ComputeIk(const IkReal *eetrans, const IkReal *eerot, const IkReal *pfree, IkSolutionListBase< IkReal > &solutions)
static void polyroots4(IkReal rawcoeffs[4+1], IkReal rawroots[4], int &numroots)
IKFAST_API int GetNumFreeParameters()
unsigned int step
IKFAST_API int GetIkRealSize()
INLINE Rall1d< T, V, S > acos(const Rall1d< T, V, S > &x)
INLINE Rall1d< T, V, S > abs(const Rall1d< T, V, S > &x)
Default implementation of IkSolutionListBase.
Definition: ikfast.h:273
INLINE Rall1d< T, V, S > atan2(const Rall1d< T, V, S > &y, const Rall1d< T, V, S > &x)
void zgetrf_(const int *m, const int *n, std::complex< double > *a, const int *lda, int *ipiv, int *info)
#define IKFAST_VERSION
Header file for all ikfast c++ files/shared objects.
Definition: ikfast.h:43
INLINE Rall1d< T, V, S > cos(const Rall1d< T, V, S > &arg)
float IKsqrt(float f)
INLINE Rall1d< T, V, S > tan(const Rall1d< T, V, S > &arg)
static void polyroots2(IkReal rawcoeffs[2+1], IkReal rawroots[2], int &numroots)
float IKtan(float f)
double x
IKFAST_API const char * GetIkFastVersion()
float IKatan2(float fy, float fx)
manages all the solutions
Definition: ikfast.h:100
float IKsin(float f)
INLINE Rall1d< T, V, S > sin(const Rall1d< T, V, S > &arg)
void dgetrs_(const char *trans, const int *n, const int *nrhs, double *a, const int *lda, int *ipiv, double *b, const int *ldb, int *info)
virtual size_t GetNumSolutions() const =0
returns the number of solutions stored
int main(int argc, char **argv)
float IKatan2Simple(float fy, float fx)
void dgesv_(const int *n, const int *nrhs, double *a, const int *lda, int *ipiv, double *b, const int *ldb, int *info)
float IKlog(float f)


turtlebot_arm_ikfast_plugin
Author(s):
autogenerated on Fri Feb 7 2020 03:56:27