dls() no compiles
authoredgarriba <edgar.riba@gmail.com>
Tue, 15 Jul 2014 22:06:29 +0000 (00:06 +0200)
committeredgarriba <edgar.riba@gmail.com>
Tue, 15 Jul 2014 22:06:29 +0000 (00:06 +0200)
modules/calib3d/src/dls.cpp
modules/calib3d/src/dls.h
modules/calib3d/src/solvepnp.cpp

index 8fbeb3e..e50ae1a 100644 (file)
@@ -1,10 +1,21 @@
-#include <iostream>
+#include "precomp.hpp"
 #include "dls.h"
 
+#include <iostream>
 
-dls::dls()
+dls::dls(const cv::Mat& opoints, const cv::Mat& ipoints) : f1coeff(21), f2coeff(21), f3coeff(21)
 {
-  // TODO Auto-generated constructor stub
+  N = opoints.type() == CV_64F ? opoints.checkVector(3, CV_64F) : opoints.checkVector(3, CV_32F) ;
+
+  H = cv::Mat::zeros(3, 3, opoints.type());
+  A = cv::Mat::zeros(3, 9, opoints.type());
+  D_mat = cv::Mat::zeros(9, 9, opoints.type());
+
+
+
+  init_vectors(opoints, ipoints);
+  build_coeff_mattrix();
+
 }
 
 
@@ -12,3 +23,300 @@ dls::~dls()
 {
   // TODO Auto-generated destructor stub
 }
+
+void dls::init_vectors(const cv::Mat& opoints, const cv::Mat& ipoints)
+{
+       if(opoints.cols == 3) opoints.reshape(N, 3);
+       if(ipoints.cols == 2) ipoints.reshape(N, 2);
+
+       p = opoints;
+       z = ipoints;
+
+       // make z into unit vectors from normalized pixel coords
+
+       z.push_back(cv::Mat::ones(1, N, opoints.type()));
+
+       for (int i = 0; i < N; ++i)
+       {
+               cv::Mat & col_i = z.col(i);
+               double sr = std::pow(col_i.at<double>(0), 2) +
+                                   std::pow(col_i.at<double>(1), 2) +
+                                   std::pow(col_i.at<double>(2), 2);
+               sr = std::sqrt(sr);
+
+               col_i.at<double>(0, i) /= sr;
+               col_i.at<double>(1, i) /= sr;
+               col_i.at<double>(2, i) /= sr;
+
+       }
+}
+
+void dls::build_coeff_mattrix()
+{
+       cv::Mat eye = cv::Mat::eye(3, 3, p.type());
+
+       // build coeff matrix
+       // An intermediate matrix, the inverse of what is called "H" in the paper
+       // (see eq. 25)
+       for (int i = 0; i < N; ++i)
+       {
+               cv::Mat z_dot = z.col(i)*z.col(i).t();
+
+               H += eye - z_dot ;
+               A += ( z_dot - eye ) * LeftMultVec(p.col(i));
+       }
+
+       cv::solve(H, A, A);
+
+       for (int i = 0; i < N; ++i)
+       {
+               cv::Mat z_dot = z.col(i)*z.col(i).t();
+               D_mat += cv::Mat(LeftMultVec(p.col(i))+A).t() * (eye-z_dot) * (LeftMultVec(p.col(i))+A);
+       }
+
+       // put D into array
+       double D[10][10];
+       for (int i = 0; i < 10; ++i)
+       {
+               for (int j = 0; j < 10; ++j)
+               {
+                       D[i+1][j+1] = D_mat.at<double>(i,j);
+               }
+       }
+
+       // F1 COEFFICIENT
+
+       f1coeff[1] = 2*D[1][6] - 2*D[1][8] + 2*D[5][6] - 2*D[5][8] + 2*D[6][1] + 2*D[6][5] + 2*D[6][9] - 2*D[8][1] - 2*D[8][5] - 2*D[8][9] + 2*D[9][6] - 2*D[9][8]; // constant term
+       f1coeff[2] = 6*D[1][2] + 6*D[1][4] + 6*D[2][1] - 6*D[2][5] - 6*D[2][9] + 6*D[4][1] - 6*D[4][5] - 6*D[4][9] - 6*D[5][2] - 6*D[5][4] - 6*D[9][2] - 6*D[9][4]; // s1^2  * s2
+       f1coeff[3] = 4*D[1][7] - 4*D[1][3] + 8*D[2][6] - 8*D[2][8] - 4*D[3][1] + 4*D[3][5] + 4*D[3][9] + 8*D[4][6] - 8*D[4][8] + 4*D[5][3] - 4*D[5][7] + 8*D[6][2] + 8*D[6][4] + 4*D[7][1] - 4*D[7][5] - 4*D[7][9] - 8*D[8][2] - 8*D[8][4] + 4*D[9][3] - 4*D[9][7]; // s1 * s2
+       f1coeff[4] = 4*D[1][2] - 4*D[1][4] + 4*D[2][1] - 4*D[2][5] - 4*D[2][9] + 8*D[3][6] - 8*D[3][8] - 4*D[4][1] + 4*D[4][5] + 4*D[4][9] - 4*D[5][2] + 4*D[5][4] + 8*D[6][3] + 8*D[6][7] + 8*D[7][6] - 8*D[7][8] - 8*D[8][3] - 8*D[8][7] - 4*D[9][2] + 4*D[9][4]; //s1 * s3
+       f1coeff[5] = 8*D[2][2] - 8*D[3][3] - 8*D[4][4] + 8*D[6][6] + 8*D[7][7] - 8*D[8][8]; // s2 * s3
+       f1coeff[6] = 4*D[2][6] - 2*D[1][7] - 2*D[1][3] + 4*D[2][8] - 2*D[3][1] + 2*D[3][5] - 2*D[3][9] + 4*D[4][6] + 4*D[4][8] + 2*D[5][3] + 2*D[5][7] + 4*D[6][2] + 4*D[6][4] - 2*D[7][1] + 2*D[7][5] - 2*D[7][9] + 4*D[8][2] + 4*D[8][4] - 2*D[9][3] - 2*D[9][7]; // s2^2 * s3
+       f1coeff[7] = 2*D[2][5] - 2*D[1][4] - 2*D[2][1] - 2*D[1][2] - 2*D[2][9] - 2*D[4][1] + 2*D[4][5] - 2*D[4][9] + 2*D[5][2] + 2*D[5][4] - 2*D[9][2] - 2*D[9][4]; //s2^3
+       f1coeff[8] = 4*D[1][9] - 4*D[1][1] + 8*D[3][3] + 8*D[3][7] + 4*D[5][5] + 8*D[7][3] + 8*D[7][7] + 4*D[9][1] - 4*D[9][9]; // s1 * s3^2
+       f1coeff[9] = 4*D[1][1] - 4*D[5][5] - 4*D[5][9] + 8*D[6][6] - 8*D[6][8] - 8*D[8][6] + 8*D[8][8] - 4*D[9][5] - 4*D[9][9]; // s1
+       f1coeff[10] = 2*D[1][3] + 2*D[1][7] + 4*D[2][6] - 4*D[2][8] + 2*D[3][1] + 2*D[3][5] + 2*D[3][9] - 4*D[4][6] + 4*D[4][8] + 2*D[5][3] + 2*D[5][7] + 4*D[6][2] - 4*D[6][4] + 2*D[7][1] + 2*D[7][5] + 2*D[7][9] - 4*D[8][2] + 4*D[8][4] + 2*D[9][3] + 2*D[9][7]; // s3
+       f1coeff[11] = 2*D[1][2] + 2*D[1][4] + 2*D[2][1] + 2*D[2][5] + 2*D[2][9] - 4*D[3][6] + 4*D[3][8] + 2*D[4][1] + 2*D[4][5] + 2*D[4][9] + 2*D[5][2] + 2*D[5][4] - 4*D[6][3] + 4*D[6][7] + 4*D[7][6] - 4*D[7][8] + 4*D[8][3] - 4*D[8][7] + 2*D[9][2] + 2*D[9][4]; // s2
+       f1coeff[12] = 2*D[2][9] - 2*D[1][4] - 2*D[2][1] - 2*D[2][5] - 2*D[1][2] + 4*D[3][6] + 4*D[3][8] - 2*D[4][1] - 2*D[4][5] + 2*D[4][9] - 2*D[5][2] - 2*D[5][4] + 4*D[6][3] + 4*D[6][7] + 4*D[7][6] + 4*D[7][8] + 4*D[8][3] + 4*D[8][7] + 2*D[9][2] + 2*D[9][4]; // s2 * s3^2
+       f1coeff[13] = 6*D[1][6] - 6*D[1][8] - 6*D[5][6] + 6*D[5][8] + 6*D[6][1] - 6*D[6][5] - 6*D[6][9] - 6*D[8][1] + 6*D[8][5] + 6*D[8][9] - 6*D[9][6] + 6*D[9][8]; // s1^2
+       f1coeff[14] = 2*D[1][8] - 2*D[1][6] + 4*D[2][3] + 4*D[2][7] + 4*D[3][2] - 4*D[3][4] - 4*D[4][3] - 4*D[4][7] - 2*D[5][6] + 2*D[5][8] - 2*D[6][1] - 2*D[6][5] + 2*D[6][9] + 4*D[7][2] - 4*D[7][4] + 2*D[8][1] + 2*D[8][5] - 2*D[8][9] + 2*D[9][6] - 2*D[9][8]; // s3^2
+       f1coeff[15] = 2*D[1][8] - 2*D[1][6] - 4*D[2][3] + 4*D[2][7] - 4*D[3][2] - 4*D[3][4] - 4*D[4][3] + 4*D[4][7] + 2*D[5][6] - 2*D[5][8] - 2*D[6][1] + 2*D[6][5] - 2*D[6][9] + 4*D[7][2] + 4*D[7][4] + 2*D[8][1] - 2*D[8][5] + 2*D[8][9] - 2*D[9][6] + 2*D[9][8]; // s2^2
+       f1coeff[16] = 2*D[3][9] - 2*D[1][7] - 2*D[3][1] - 2*D[3][5] - 2*D[1][3] - 2*D[5][3] - 2*D[5][7] - 2*D[7][1] - 2*D[7][5] + 2*D[7][9] + 2*D[9][3] + 2*D[9][7]; // s3^3
+       f1coeff[17] = 4*D[1][6] + 4*D[1][8] + 8*D[2][3] + 8*D[2][7] + 8*D[3][2] + 8*D[3][4] + 8*D[4][3] + 8*D[4][7] - 4*D[5][6] - 4*D[5][8] + 4*D[6][1] - 4*D[6][5] - 4*D[6][9] + 8*D[7][2] + 8*D[7][4] + 4*D[8][1] - 4*D[8][5] - 4*D[8][9] - 4*D[9][6] - 4*D[9][8]; // s1 * s2 * s3
+       f1coeff[18] = 4*D[1][5] - 4*D[1][1] + 8*D[2][2] + 8*D[2][4] + 8*D[4][2] + 8*D[4][4] + 4*D[5][1] - 4*D[5][5] + 4*D[9][9]; // s1 * s2^2
+       f1coeff[19] = 6*D[1][3] + 6*D[1][7] + 6*D[3][1] - 6*D[3][5] - 6*D[3][9] - 6*D[5][3] - 6*D[5][7] + 6*D[7][1] - 6*D[7][5] - 6*D[7][9] - 6*D[9][3] - 6*D[9][7]; // s1^2 * s3
+       f1coeff[20] = 4*D[1][1] - 4*D[1][5] - 4*D[1][9] - 4*D[5][1] + 4*D[5][5] + 4*D[5][9] - 4*D[9][1] + 4*D[9][5] + 4*D[9][9]; // s1^3
+
+
+       // F2 COEFFICIENT
+
+       f2coeff[1] = - 2*D[1][3] + 2*D[1][7] - 2*D[3][1] - 2*D[3][5] - 2*D[3][9] - 2*D[5][3] + 2*D[5][7] + 2*D[7][1] + 2*D[7][5] + 2*D[7][9] - 2*D[9][3] + 2*D[9][7]; // constant term
+       f2coeff[2] = 4*D[1][5] - 4*D[1][1] + 8*D[2][2] + 8*D[2][4] + 8*D[4][2] + 8*D[4][4] + 4*D[5][1] - 4*D[5][5] + 4*D[9][9]; // s1^2  * s2
+       f2coeff[3] = 4*D[1][8] - 4*D[1][6] - 8*D[2][3] + 8*D[2][7] - 8*D[3][2] - 8*D[3][4] - 8*D[4][3] + 8*D[4][7] + 4*D[5][6] - 4*D[5][8] - 4*D[6][1] + 4*D[6][5] - 4*D[6][9] + 8*D[7][2] + 8*D[7][4] + 4*D[8][1] - 4*D[8][5] + 4*D[8][9] - 4*D[9][6] + 4*D[9][8]; // s1 * s2
+       f2coeff[4] = 8*D[2][2] - 8*D[3][3] - 8*D[4][4] + 8*D[6][6] + 8*D[7][7] - 8*D[8][8]; // s1 * s3
+       f2coeff[5] = 4*D[1][4] - 4*D[1][2] - 4*D[2][1] + 4*D[2][5] - 4*D[2][9] - 8*D[3][6] - 8*D[3][8] + 4*D[4][1] - 4*D[4][5] + 4*D[4][9] + 4*D[5][2] - 4*D[5][4] - 8*D[6][3] + 8*D[6][7] + 8*D[7][6] + 8*D[7][8] - 8*D[8][3] + 8*D[8][7] - 4*D[9][2] + 4*D[9][4]; // s2 * s3
+       f2coeff[6] = 6*D[5][6] - 6*D[1][8] - 6*D[1][6] + 6*D[5][8] - 6*D[6][1] + 6*D[6][5] - 6*D[6][9] - 6*D[8][1] + 6*D[8][5] - 6*D[8][9] - 6*D[9][6] - 6*D[9][8]; // s2^2 * s3
+       f2coeff[7] = 4*D[1][1] - 4*D[1][5] + 4*D[1][9] - 4*D[5][1] + 4*D[5][5] - 4*D[5][9] + 4*D[9][1] - 4*D[9][5] + 4*D[9][9]; // s2^3
+       f2coeff[8] = 2*D[2][9] - 2*D[1][4] - 2*D[2][1] - 2*D[2][5] - 2*D[1][2] + 4*D[3][6] + 4*D[3][8] - 2*D[4][1] - 2*D[4][5] + 2*D[4][9] - 2*D[5][2] - 2*D[5][4] + 4*D[6][3] + 4*D[6][7] + 4*D[7][6] + 4*D[7][8] + 4*D[8][3] + 4*D[8][7] + 2*D[9][2] + 2*D[9][4]; // s1 * s3^2
+       f2coeff[9] = 2*D[1][2] + 2*D[1][4] + 2*D[2][1] + 2*D[2][5] + 2*D[2][9] - 4*D[3][6] + 4*D[3][8] + 2*D[4][1] + 2*D[4][5] + 2*D[4][9] + 2*D[5][2] + 2*D[5][4] - 4*D[6][3] + 4*D[6][7] + 4*D[7][6] - 4*D[7][8] + 4*D[8][3] - 4*D[8][7] + 2*D[9][2] + 2*D[9][4]; // s1
+       f2coeff[10] = 2*D[1][6] + 2*D[1][8] - 4*D[2][3] + 4*D[2][7] - 4*D[3][2] + 4*D[3][4] + 4*D[4][3] - 4*D[4][7] + 2*D[5][6] + 2*D[5][8] + 2*D[6][1] + 2*D[6][5] + 2*D[6][9] + 4*D[7][2] - 4*D[7][4] + 2*D[8][1] + 2*D[8][5] + 2*D[8][9] + 2*D[9][6] + 2*D[9][8]; // s3
+       f2coeff[11] = 8*D[3][3] - 4*D[1][9] - 4*D[1][1] - 8*D[3][7] + 4*D[5][5] - 8*D[7][3] + 8*D[7][7] - 4*D[9][1] - 4*D[9][9]; // s2
+       f2coeff[12] = 4*D[1][1] - 4*D[5][5] + 4*D[5][9] + 8*D[6][6] + 8*D[6][8] + 8*D[8][6] + 8*D[8][8] + 4*D[9][5] - 4*D[9][9]; // s2 * s3^2
+       f2coeff[13] = 2*D[1][7] - 2*D[1][3] + 4*D[2][6] - 4*D[2][8] - 2*D[3][1] + 2*D[3][5] + 2*D[3][9] + 4*D[4][6] - 4*D[4][8] + 2*D[5][3] - 2*D[5][7] + 4*D[6][2] + 4*D[6][4] + 2*D[7][1] - 2*D[7][5] - 2*D[7][9] - 4*D[8][2] - 4*D[8][4] + 2*D[9][3] - 2*D[9][7]; // s1^2
+       f2coeff[14] = 2*D[1][3] - 2*D[1][7] + 4*D[2][6] + 4*D[2][8] + 2*D[3][1] + 2*D[3][5] - 2*D[3][9] - 4*D[4][6] - 4*D[4][8] + 2*D[5][3] - 2*D[5][7] + 4*D[6][2] - 4*D[6][4] - 2*D[7][1] - 2*D[7][5] + 2*D[7][9] + 4*D[8][2] - 4*D[8][4] - 2*D[9][3] + 2*D[9][7]; // s3^2
+       f2coeff[15] = 6*D[1][3] - 6*D[1][7] + 6*D[3][1] - 6*D[3][5] + 6*D[3][9] - 6*D[5][3] + 6*D[5][7] - 6*D[7][1] + 6*D[7][5] - 6*D[7][9] + 6*D[9][3] - 6*D[9][7]; // s2^2
+       f2coeff[16] = 2*D[6][9] - 2*D[1][8] - 2*D[5][6] - 2*D[5][8] - 2*D[6][1] - 2*D[6][5] - 2*D[1][6] - 2*D[8][1] - 2*D[8][5] + 2*D[8][9] + 2*D[9][6] + 2*D[9][8]; // s3^3
+       f2coeff[17] = 8*D[2][6] - 4*D[1][7] - 4*D[1][3] + 8*D[2][8] - 4*D[3][1] + 4*D[3][5] - 4*D[3][9] + 8*D[4][6] + 8*D[4][8] + 4*D[5][3] + 4*D[5][7] + 8*D[6][2] + 8*D[6][4] - 4*D[7][1] + 4*D[7][5] - 4*D[7][9] + 8*D[8][2] + 8*D[8][4] - 4*D[9][3] - 4*D[9][7]; // s1 * s2 * s3
+       f2coeff[18] = 6*D[2][5] - 6*D[1][4] - 6*D[2][1] - 6*D[1][2] - 6*D[2][9] - 6*D[4][1] + 6*D[4][5] - 6*D[4][9] + 6*D[5][2] + 6*D[5][4] - 6*D[9][2] - 6*D[9][4]; // s1 * s2^2
+       f2coeff[19] = 2*D[1][6] + 2*D[1][8] + 4*D[2][3] + 4*D[2][7] + 4*D[3][2] + 4*D[3][4] + 4*D[4][3] + 4*D[4][7] - 2*D[5][6] - 2*D[5][8] + 2*D[6][1] - 2*D[6][5] - 2*D[6][9] + 4*D[7][2] + 4*D[7][4] + 2*D[8][1] - 2*D[8][5] - 2*D[8][9] - 2*D[9][6] - 2*D[9][8]; // s1^2 * s3
+       f2coeff[20] = 2*D[1][2] + 2*D[1][4] + 2*D[2][1] - 2*D[2][5] - 2*D[2][9] + 2*D[4][1] - 2*D[4][5] - 2*D[4][9] - 2*D[5][2] - 2*D[5][4] - 2*D[9][2] - 2*D[9][4]; // s1^3
+
+
+       // F3 COEFFICIENT
+
+       f3coeff[1] = 2*D[1][2] - 2*D[1][4] + 2*D[2][1] + 2*D[2][5] + 2*D[2][9] - 2*D[4][1] - 2*D[4][5] - 2*D[4][9] + 2*D[5][2] - 2*D[5][4] + 2*D[9][2] - 2*D[9][4]; // constant term
+       f3coeff[2] = 2*D[1][6] + 2*D[1][8] + 4*D[2][3] + 4*D[2][7] + 4*D[3][2] + 4*D[3][4] + 4*D[4][3] + 4*D[4][7] - 2*D[5][6] - 2*D[5][8] + 2*D[6][1] - 2*D[6][5] - 2*D[6][9] + 4*D[7][2] + 4*D[7][4] + 2*D[8][1] - 2*D[8][5] - 2*D[8][9] - 2*D[9][6] - 2*D[9][8]; // s1^2  * s2
+       f3coeff[3] = 8*D[2][2] - 8*D[3][3] - 8*D[4][4] + 8*D[6][6] + 8*D[7][7] - 8*D[8][8]; // s1 * s2
+       f3coeff[4] = 4*D[1][8] - 4*D[1][6] + 8*D[2][3] + 8*D[2][7] + 8*D[3][2] - 8*D[3][4] - 8*D[4][3] - 8*D[4][7] - 4*D[5][6] + 4*D[5][8] - 4*D[6][1] - 4*D[6][5] + 4*D[6][9] + 8*D[7][2] - 8*D[7][4] + 4*D[8][1] + 4*D[8][5] - 4*D[8][9] + 4*D[9][6] - 4*D[9][8]; // s1 * s3
+       f3coeff[5] = 4*D[1][3] - 4*D[1][7] + 8*D[2][6] + 8*D[2][8] + 4*D[3][1] + 4*D[3][5] - 4*D[3][9] - 8*D[4][6] - 8*D[4][8] + 4*D[5][3] - 4*D[5][7] + 8*D[6][2] - 8*D[6][4] - 4*D[7][1] - 4*D[7][5] + 4*D[7][9] + 8*D[8][2] - 8*D[8][4] - 4*D[9][3] + 4*D[9][7]; // s2 * s3
+       f3coeff[6] = 4*D[1][1] - 4*D[5][5] + 4*D[5][9] + 8*D[6][6] + 8*D[6][8] + 8*D[8][6] + 8*D[8][8] + 4*D[9][5] - 4*D[9][9]; // s2^2 * s3
+       f3coeff[7] = 2*D[5][6] - 2*D[1][8] - 2*D[1][6] + 2*D[5][8] - 2*D[6][1] + 2*D[6][5] - 2*D[6][9] - 2*D[8][1] + 2*D[8][5] - 2*D[8][9] - 2*D[9][6] - 2*D[9][8]; // s2^3
+       f3coeff[8] = 6*D[3][9] - 6*D[1][7] - 6*D[3][1] - 6*D[3][5] - 6*D[1][3] - 6*D[5][3] - 6*D[5][7] - 6*D[7][1] - 6*D[7][5] + 6*D[7][9] + 6*D[9][3] + 6*D[9][7]; // s1 * s3^2
+       f3coeff[9] = 2*D[1][3] + 2*D[1][7] + 4*D[2][6] - 4*D[2][8] + 2*D[3][1] + 2*D[3][5] + 2*D[3][9] - 4*D[4][6] + 4*D[4][8] + 2*D[5][3] + 2*D[5][7] + 4*D[6][2] - 4*D[6][4] + 2*D[7][1] + 2*D[7][5] + 2*D[7][9] - 4*D[8][2] + 4*D[8][4] + 2*D[9][3] + 2*D[9][7]; // s1
+       f3coeff[10] = 8*D[2][2] - 4*D[1][5] - 4*D[1][1] - 8*D[2][4] - 8*D[4][2] + 8*D[4][4] - 4*D[5][1] - 4*D[5][5] + 4*D[9][9]; // s3
+       f3coeff[11] = 2*D[1][6] + 2*D[1][8] - 4*D[2][3] + 4*D[2][7] - 4*D[3][2] + 4*D[3][4] + 4*D[4][3] - 4*D[4][7] + 2*D[5][6] + 2*D[5][8] + 2*D[6][1] + 2*D[6][5] + 2*D[6][9] + 4*D[7][2] - 4*D[7][4] + 2*D[8][1] + 2*D[8][5] + 2*D[8][9] + 2*D[9][6] + 2*D[9][8]; // s2
+       f3coeff[12] = 6*D[6][9] - 6*D[1][8] - 6*D[5][6] - 6*D[5][8] - 6*D[6][1] - 6*D[6][5] - 6*D[1][6] - 6*D[8][1] - 6*D[8][5] + 6*D[8][9] + 6*D[9][6] + 6*D[9][8]; // s2 * s3^2
+       f3coeff[13] = 2*D[1][2] - 2*D[1][4] + 2*D[2][1] - 2*D[2][5] - 2*D[2][9] + 4*D[3][6] - 4*D[3][8] - 2*D[4][1] + 2*D[4][5] + 2*D[4][9] - 2*D[5][2] + 2*D[5][4] + 4*D[6][3] + 4*D[6][7] + 4*D[7][6] - 4*D[7][8] - 4*D[8][3] - 4*D[8][7] - 2*D[9][2] + 2*D[9][4]; // s1^2
+       f3coeff[14] = 6*D[1][4] - 6*D[1][2] - 6*D[2][1] - 6*D[2][5] + 6*D[2][9] + 6*D[4][1] + 6*D[4][5] - 6*D[4][9] - 6*D[5][2] + 6*D[5][4] + 6*D[9][2] - 6*D[9][4]; // s3^2
+       f3coeff[15] = 2*D[1][4] - 2*D[1][2] - 2*D[2][1] + 2*D[2][5] - 2*D[2][9] - 4*D[3][6] - 4*D[3][8] + 2*D[4][1] - 2*D[4][5] + 2*D[4][9] + 2*D[5][2] - 2*D[5][4] - 4*D[6][3] + 4*D[6][7] + 4*D[7][6] + 4*D[7][8] - 4*D[8][3] + 4*D[8][7] - 2*D[9][2] + 2*D[9][4]; // s2^2
+       f3coeff[16] = 4*D[1][1] + 4*D[1][5] - 4*D[1][9] + 4*D[5][1] + 4*D[5][5] - 4*D[5][9] - 4*D[9][1] - 4*D[9][5] + 4*D[9][9]; // s3^3
+       f3coeff[17] = 4*D[2][9] - 4*D[1][4] - 4*D[2][1] - 4*D[2][5] - 4*D[1][2] + 8*D[3][6] + 8*D[3][8] - 4*D[4][1] - 4*D[4][5] + 4*D[4][9] - 4*D[5][2] - 4*D[5][4] + 8*D[6][3] + 8*D[6][7] + 8*D[7][6] + 8*D[7][8] + 8*D[8][3] + 8*D[8][7] + 4*D[9][2] + 4*D[9][4]; // s1 * s2 * s3
+       f3coeff[18] = 4*D[2][6] - 2*D[1][7] - 2*D[1][3] + 4*D[2][8] - 2*D[3][1] + 2*D[3][5] - 2*D[3][9] + 4*D[4][6] + 4*D[4][8] + 2*D[5][3] + 2*D[5][7] + 4*D[6][2] + 4*D[6][4] - 2*D[7][1] + 2*D[7][5] - 2*D[7][9] + 4*D[8][2] + 4*D[8][4] - 2*D[9][3] - 2*D[9][7]; // s1 * s2^2
+       f3coeff[19] = 4*D[1][9] - 4*D[1][1] + 8*D[3][3] + 8*D[3][7] + 4*D[5][5] + 8*D[7][3] + 8*D[7][7] + 4*D[9][1] - 4*D[9][9]; // s1^2 * s3
+       f3coeff[20] = 2*D[1][3] + 2*D[1][7] + 2*D[3][1] - 2*D[3][5] - 2*D[3][9] - 2*D[5][3] - 2*D[5][7] + 2*D[7][1] - 2*D[7][5] - 2*D[7][9] - 2*D[9][3] - 2*D[9][7]; // s1^3
+
+       // genereate random samples
+       std::vector<double> u;
+       cv::randn(u, 100, 0.1);
+
+       cv::Mat M2 = cayley_LS_M(f1coeff, f2coeff, f3coeff, u);
+
+
+}
+
+cv::Mat dls::LeftMultVec(const cv::Mat& v)
+{
+       cv::Mat mat, row1, row2, row3;
+
+       cv::hconcat(v.clone().t(), cv::Mat::zeros(1, 6, v.type()), row1);
+       cv::hconcat(cv::Mat::zeros(1, 3, v.type()), v.clone().t(), row2);
+       cv::hconcat(row2, cv::Mat::zeros(1, 3, v.type()), row2);
+       cv::hconcat(cv::Mat::zeros(1, 6, v.type()), v.clone().t(), row3);
+
+       mat.push_back(row1);
+       mat.push_back(row2);
+       mat.push_back(row3);
+
+       return mat;
+}
+
+cv::Mat cayley_LS_M(const std::vector<double>& a, const std::vector<double>& b, const std::vector<double>& c, const std::vector<double>& u)
+{
+
+       std::vector<std::vector<double[120]> > M(120);
+
+       M[0] = {u[1],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[1],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[1],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[1],0};
+       M[1] = {u[4],u[1],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[1],a[10],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[1],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[10],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[1],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[10],0};
+       M[2] = {0,u[4],u[1],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[10],a[14],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[1],0,0,b[10],0,0,0,0,0,0,0,0,0,0,b[1],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[14],0,0,0,0,0,c[1],0,0,0,0,0,0,0,0,0,c[10],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[14],0};
+       M[3] = {u[3],0,0,u[1],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[11],0,0,0,0,0,0,0,0,0,0,0,0,0,a[1],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[1],0,0,0,0,0,0,b[11],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[11],c[1]};
+       M[4] = {0,u[3],0,u[4],u[1],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[11],a[5],0,0,0,0,0,0,0,a[1],0,0,0,0,0,a[10],0,0,0,0,b[11],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[1],0,0,0,0,b[10],0,0,0,0,0,0,b[5],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[11],c[1],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[5],c[10]};
+       M[5] = {0,0,u[3],0,u[4],u[1],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[5],a[12],0,0,0,0,0,a[1],0,a[10],0,0,0,0,0,a[14],0,a[11],0,0,b[5],0,0,0,0,0,0,0,b[1],0,0,b[11],0,0,0,0,0,b[10],0,0,0,0,b[14],0,0,0,0,0,0,b[12],0,0,0,0,0,c[11],0,0,0,0,0,0,0,0,0,c[5],c[10],0,0,0,0,0,0,0,0,0,0,c[1],0,0,0,0,0,0,c[12],c[14]};
+       M[6] = {0,0,0,u[3],0,0,u[1],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[1],0,0,0,0,a[15],0,0,0,0,0,0,0,0,0,0,0,0,0,a[11],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[1],b[11],0,0,0,0,0,0,b[15],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[1],0,0,0,0,0,0,0,0,0,0,c[15],c[11]};
+       M[7] = {0,0,0,0,u[3],0,u[4],u[1],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[10],0,0,0,a[15],a[6],0,0,0,0,0,0,0,a[11],0,a[1],0,0,0,a[5],0,0,0,0,b[15],0,0,0,0,0,0,0,0,b[1],0,0,0,0,0,0,0,b[11],0,0,0,b[10],b[5],0,0,0,0,0,0,b[6],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[15],c[11],0,0,0,0,0,0,c[10],0,0,0,0,c[1],0,0,0,0,0,c[6],c[5]};
+       M[8] = {0,0,0,0,0,u[3],0,u[4],u[1],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[14],0,0,0,a[6],0,0,0,0,0,0,a[11],0,a[5],0,a[10],a[1],0,0,a[12],0,a[15],0,0,b[6],0,0,0,0,0,0,0,b[11],b[10],0,b[15],b[1],0,0,0,0,b[5],0,0,0,b[14],b[12],0,0,0,0,0,0,0,0,0,0,0,0,c[15],0,0,0,0,0,0,0,0,0,c[6],c[5],0,c[1],0,0,0,0,c[14],0,0,0,c[11],c[10],0,0,0,0,0,0,c[12]};
+       M[9] = {u[2],0,0,0,0,0,0,0,0,u[1],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[9],a[1],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[9],b[1],0,0,0,c[1],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[9],0};
+
+       M[10] = {0,u[2],0,0,0,0,0,0,0,u[4],u[1],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[1],a[9],a[4],a[10],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[9],0,0,0,0,b[1],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[4],b[10],0,0,0,c[10],0,0,0,0,0,0,0,0,0,0,c[9],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[1],c[4],0};
+       M[11] = {0,0,u[2],0,0,0,0,0,0,0,u[4],u[1],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[1],0,0,0,0,a[10],a[4],a[8],a[14],0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[9],0,0,b[4],0,0,b[1],0,b[10],0,0,0,0,0,b[9],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[8],b[14],0,0,0,c[14],c[9],0,0,0,0,0,0,0,0,0,c[4],0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[1],0,0,c[10],c[8],0};
+       M[12] = {0,0,0,u[2],0,0,0,0,0,u[3],0,0,u[1],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[3],a[11],0,0,a[1],0,0,0,0,0,0,0,0,0,a[9],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[9],0,0,b[1],0,0,0,b[3],b[11],0,0,0,c[11],0,0,0,0,0,0,0,c[1],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[3],c[9]};
+       M[13] = {0,0,0,0,u[2],0,0,0,0,0,u[3],0,u[4],u[1],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[11],a[3],a[17],a[5],0,0,a[10],0,0,0,a[9],0,0,0,a[1],0,a[4],0,0,0,0,b[3],0,0,0,0,b[11],b[1],0,0,0,0,0,0,0,0,0,0,b[9],0,0,0,0,b[4],0,0,b[10],0,0,0,b[17],b[5],0,0,0,c[5],0,c[1],0,0,0,0,0,c[10],0,0,c[3],c[9],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[11],c[17],c[4]};
+       M[14] = {0,0,0,0,0,u[2],0,0,0,0,0,u[3],0,u[4],u[1],0,0,0,0,0,0,0,0,0,0,0,0,0,a[11],0,0,0,0,a[5],a[17],0,a[12],0,0,a[14],0,a[9],a[1],a[4],0,0,0,a[10],0,a[8],0,a[3],0,0,b[17],0,b[1],b[11],0,b[5],b[10],0,b[9],0,0,b[3],0,0,0,0,0,b[4],0,0,0,0,b[8],0,0,b[14],0,0,0,0,b[12],0,0,0,c[12],c[3],c[10],0,0,0,0,0,c[14],0,0,c[17],c[4],0,0,0,0,0,c[1],0,0,0,0,c[9],0,0,c[11],0,0,c[5],0,c[8]};
+       M[15] = {0,0,0,0,0,0,u[2],0,0,0,0,0,u[3],0,0,u[1],0,0,0,0,0,0,0,0,0,0,0,0,0,a[1],a[9],0,0,0,0,a[18],a[15],0,0,a[11],0,0,0,0,0,0,0,0,0,a[3],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[1],b[9],b[3],0,0,b[11],0,0,0,b[18],b[15],0,0,0,c[15],0,0,0,0,0,c[1],0,c[11],0,0,0,0,0,0,0,0,0,0,c[9],0,0,0,0,0,0,0,0,0,0,c[18],c[3]};
+       M[16] = {0,0,0,0,0,0,0,u[2],0,0,0,0,0,u[3],0,u[4],u[1],0,0,0,0,0,0,0,0,0,0,0,0,a[10],a[4],0,0,a[15],a[18],0,a[6],0,0,a[5],0,0,0,a[3],a[1],a[9],0,a[11],0,a[17],0,0,0,0,b[18],0,0,0,0,b[15],b[11],0,0,b[9],0,0,0,0,b[1],0,0,b[3],0,0,b[10],b[4],b[17],0,0,b[5],0,0,0,0,b[6],0,0,0,c[6],0,c[11],0,0,0,c[10],0,c[5],c[1],0,c[18],c[3],0,0,0,0,0,0,c[4],0,0,0,0,c[9],0,0,0,0,c[15],0,c[17]};
+       M[17] = {0,0,0,0,0,0,0,0,u[2],0,0,0,0,0,u[3],0,u[4],u[1],0,0,0,0,0,0,0,0,0,0,a[15],a[14],a[8],0,0,a[6],0,0,0,0,0,a[12],0,a[3],a[11],a[17],a[10],a[4],a[9],a[5],0,0,0,a[18],0,0,0,0,b[11],b[15],0,b[6],b[5],0,b[3],b[4],0,b[18],b[9],0,b[10],0,0,b[17],0,0,b[14],b[8],0,0,0,b[12],0,0,0,0,0,0,0,0,0,c[18],c[5],0,0,0,c[14],0,c[12],c[10],0,0,c[17],0,c[9],0,0,0,c[11],c[8],0,0,0,c[3],c[4],0,c[15],0,0,c[6],0,0};
+       M[18] = {0,0,0,0,0,0,0,0,0,u[2],0,0,0,0,0,0,0,0,u[1],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[13],a[9],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[1],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[1],b[13],b[9],0,0,c[1],c[9],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[13],0};
+       M[19] = {0,0,0,0,0,0,0,0,0,0,u[2],0,0,0,0,0,0,0,u[4],u[1],0,0,0,0,0,0,0,0,0,0,0,0,a[1],a[9],a[13],a[19],a[4],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[10],b[13],0,0,0,0,b[9],0,b[1],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[10],b[19],b[4],0,0,c[10],c[4],0,0,0,0,0,0,0,0,0,0,c[13],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[1],c[9],c[19],0};
+
+       M[20] = {0,0,0,0,0,0,0,0,0,0,0,u[2],0,0,0,0,0,0,0,u[4],u[1],0,0,0,0,0,0,a[1],a[9],0,0,0,a[10],a[4],a[19],0,a[8],0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[13],0,a[14],b[19],b[1],0,b[9],0,b[4],0,b[10],0,0,0,b[13],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[14],0,b[8],0,0,c[14],c[8],c[13],0,0,0,0,0,0,0,0,0,c[19],0,0,0,0,0,0,0,0,0,0,0,0,0,c[1],c[9],0,c[10],c[4],0,0};
+       M[21] = {0,0,0,0,0,0,0,0,0,0,0,0,u[2],0,0,0,0,0,u[3],0,0,u[1],0,0,0,0,0,0,0,0,0,0,0,0,0,a[2],a[3],0,a[1],a[9],0,0,0,0,0,0,0,0,0,a[13],0,0,0,a[11],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[13],0,b[1],b[9],0,0,b[11],b[2],b[3],0,0,c[11],c[3],0,0,0,c[1],0,0,0,c[9],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[2],c[13]};
+       M[22] = {0,0,0,0,0,0,0,0,0,0,0,0,0,u[2],0,0,0,0,0,u[3],0,u[4],u[1],0,0,0,0,0,0,0,0,0,a[11],a[3],a[2],0,a[17],0,a[10],a[4],a[1],0,0,a[13],0,0,0,a[9],0,a[19],0,0,0,a[5],b[2],0,0,0,0,b[3],b[9],b[11],0,0,0,0,0,0,0,0,0,b[13],b[1],0,0,0,b[19],0,b[10],b[4],0,0,b[5],0,b[17],0,0,c[5],c[17],0,c[9],0,c[10],0,0,c[1],c[4],0,0,c[2],c[13],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[11],c[3],0,c[19]};
+       M[23] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,u[2],0,0,0,0,0,u[3],0,u[4],u[1],0,0,0,a[11],a[3],0,0,0,a[5],a[17],0,0,0,0,a[14],a[8],a[10],a[13],a[9],a[19],0,0,0,a[4],0,0,0,a[2],0,a[12],0,b[11],b[9],b[3],0,b[17],b[4],b[5],b[13],0,0,b[2],0,0,0,0,0,b[19],b[10],0,0,0,0,0,b[14],b[8],0,0,b[12],0,0,0,0,c[12],0,c[2],c[4],0,c[14],0,0,c[10],c[8],0,0,0,c[19],0,0,0,0,0,c[9],0,0,0,0,c[13],0,c[11],c[3],0,c[5],c[17],0,0};
+       M[24] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,u[2],0,0,0,0,0,u[3],0,0,u[1],0,0,0,0,a[9],a[13],0,0,0,0,0,a[18],0,a[11],a[3],0,0,0,0,0,0,0,0,0,a[2],0,0,a[1],a[15],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[1],b[9],b[13],b[2],0,b[11],b[3],0,0,b[15],0,b[18],0,0,c[15],c[18],0,0,0,c[11],c[1],c[9],0,c[3],0,0,0,0,0,0,0,0,0,0,c[13],0,0,0,0,0,0,0,0,0,0,0,c[2]};
+       M[25] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,u[2],0,0,0,0,0,u[3],0,u[4],u[1],0,0,0,a[4],a[19],0,a[15],a[18],0,0,0,0,a[5],a[17],a[11],0,0,a[2],a[9],a[13],0,a[3],0,0,0,0,a[10],a[6],0,0,0,0,0,b[18],b[3],b[15],0,b[13],0,0,0,0,b[9],0,0,b[2],b[11],b[10],b[4],b[19],0,0,b[5],b[17],0,0,b[6],0,0,0,0,c[6],0,0,c[3],0,c[5],c[10],c[4],c[11],c[17],c[9],0,0,c[2],0,0,0,0,0,0,c[19],0,0,0,0,c[13],0,0,0,c[15],c[18],0,0};
+       M[26] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,u[2],0,0,0,0,0,u[3],0,u[4],u[1],a[15],a[18],a[8],0,0,a[6],0,0,0,0,0,a[12],0,a[5],a[2],a[3],0,a[4],a[19],a[13],a[17],0,0,0,0,a[14],0,0,b[15],b[3],b[18],0,0,b[17],b[6],b[2],b[19],0,0,b[13],0,b[4],0,0,0,b[5],b[14],b[8],0,0,0,b[12],0,0,0,0,0,0,0,0,0,0,0,c[17],0,c[12],c[14],c[8],c[5],0,c[4],0,0,0,0,c[13],0,0,0,c[3],0,0,0,0,c[2],c[19],c[15],c[18],0,c[6],0,0,0};
+       M[27] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,u[3],0,0,0,0,0,0,0,0,0,0,0,0,0,a[11],a[3],0,0,0,0,0,a[7],0,0,a[15],0,0,0,0,0,0,0,0,0,a[18],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[9],b[1],0,0,0,b[11],b[3],b[18],0,0,b[15],0,0,0,0,b[7],0,0,0,c[7],0,0,c[1],0,0,c[11],0,c[15],0,0,0,0,0,0,0,0,0,0,c[3],0,0,c[9],0,0,0,0,0,0,0,0,c[18]};
+       M[28] = {0,0,0,0,0,0,u[3],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[11],0,0,0,0,a[7],0,0,0,0,0,0,0,0,0,0,0,0,0,a[15],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[1],0,0,0,0,0,b[11],b[15],0,0,0,0,0,0,b[7],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[11],0,0,c[1],0,0,0,0,0,0,0,c[7],c[15]};
+
+       M[29] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,u[3],0,0,0,0,a[3],a[2],0,0,0,0,0,0,0,a[15],a[18],0,0,0,0,0,0,0,0,0,0,0,0,a[11],a[7],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[13],b[9],0,0,b[11],b[3],b[2],0,0,b[15],b[18],0,0,b[7],0,0,0,0,c[7],0,0,0,c[9],c[15],c[11],c[3],0,c[18],0,0,0,0,0,0,0,0,0,0,c[2],0,0,c[13],0,0,0,0,0,0,0,0,0};
+       M[30] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[18],0,0,0,0,0,0,0,0,0,0,a[7],0,0,0,a[2],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[20],0,0,b[2],0,0,0,b[18],0,0,0,b[7],0,0,0,c[7],0,0,0,0,0,c[20],0,c[2],0,0,0,0,c[18],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+       M[31] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[2],0,0,0,0,0,0,0,a[15],a[18],0,0,0,0,0,0,0,0,0,0,0,a[7],0,a[3],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[20],b[13],0,0,b[3],b[2],0,0,b[15],b[18],0,b[7],0,0,0,0,0,c[7],0,0,0,0,c[13],c[18],c[3],c[2],0,0,0,c[15],0,0,0,0,0,0,0,0,0,0,0,c[20],0,0,0,0,0,0,0,0,0};
+       M[32] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[9],0,a[13],0,0,a[20],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[13],b[9],b[20],0,0,c[9],c[13],c[20],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+       M[33] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[15],a[18],0,0,0,0,0,0,0,0,a[7],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[9],0,0,0,0,b[3],b[11],0,0,0,b[15],b[18],0,0,0,b[7],0,0,0,0,0,0,0,0,0,0,0,c[11],0,0,c[15],0,c[7],0,0,0,0,0,0,c[9],0,0,0,c[18],0,0,c[3],0,0,0,0,0,0,0,0,0};
+       M[34] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[18],0,0,0,0,0,0,0,0,a[7],0,0,0,0,0,0,0,0,0,0,0,0,0,a[15],0,0,0,0,0,0,0,0,0,0,0,b[13],0,0,0,0,b[2],b[3],0,0,b[15],b[18],0,0,0,b[7],0,0,0,0,0,0,0,0,0,0,0,0,c[3],c[7],c[15],c[18],0,0,0,0,0,0,0,0,c[13],0,0,0,0,0,0,c[2],0,0,0,0,0,0,0,0,0};
+       M[35] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[7],0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[18],0,0,0,0,0,0,0,0,0,0,0,b[20],0,0,0,0,0,b[2],0,0,b[18],0,0,0,b[7],0,0,0,0,0,0,0,0,0,0,0,0,0,c[2],0,c[18],0,0,0,0,c[7],0,0,0,0,c[20],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+       M[36] = {0,0,0,0,0,u[4],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[12],0,0,0,0,0,0,a[10],0,a[14],0,0,0,0,0,a[16],0,a[5],0,0,b[12],0,0,0,0,0,0,0,b[10],0,0,b[5],0,0,0,0,0,b[14],0,0,0,0,b[16],0,0,0,0,0,0,0,0,0,0,0,0,c[5],0,0,0,0,0,0,0,0,0,c[12],c[14],c[1],0,0,0,0,0,0,0,c[11],0,c[10],0,0,0,0,0,0,0,c[16]};
+       M[37] = {0,0,u[4],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[14],a[16],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[10],0,0,b[14],0,0,0,0,0,0,0,0,0,0,b[10],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[16],0,0,0,0,0,c[10],0,0,0,0,0,0,0,0,0,c[14],0,0,0,0,0,0,0,0,0,c[1],0,0,0,0,0,0,0,0,c[16],0};
+       M[38] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[15],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[7],0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[1],0,0,0,0,b[11],0,0,0,0,0,b[15],b[7],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[1],0,0,0,c[15],0,0,c[11],0,0,0,0,0,0,0,0,c[7]};
+       M[39] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[14],0,0,0,0,a[16],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[8],0,0,0,0,0,b[14],0,b[16],0,0,0,0,0,b[8],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[8],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[9],0,0,c[10],c[4],0,0,0,0,c[14],0,0,c[16],0,0};
+
+       M[40] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[14],a[8],0,0,0,a[16],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[14],0,b[8],0,0,0,b[16],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[13],0,0,c[4],c[19],0,0,0,c[14],c[8],0,c[16],0,0,0};
+       M[41] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[7],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[11],0,0,0,0,b[15],0,0,0,0,0,b[7],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[11],0,0,0,c[7],0,0,c[15],0,0,0,0,0,0,0,0,0};
+       M[42] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[8],0,0,0,a[16],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[8],0,0,b[16],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[20],0,0,c[19],0,0,0,0,c[8],0,c[16],0,0,0,0};
+       M[43] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[7],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[3],0,0,0,0,b[18],b[15],0,0,0,b[7],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[15],0,0,c[7],0,0,0,0,0,0,0,0,c[3],0,0,0,0,0,0,c[18],0,0,0,0,0,0,0,0,0};
+       M[44] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[16],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[16],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[4],0,0,c[14],c[8],0,0,0,0,c[16],0,0,0,0,0};
+       M[45] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[16],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[16],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[19],0,0,c[8],0,0,0,0,c[16],0,0,0,0,0,0};
+       M[46] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[7],0,0,0,0,0,0,0,0,0,0,0,b[2],0,0,0,0,0,b[18],0,0,b[7],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[18],0,c[7],0,0,0,0,0,0,0,0,0,c[2],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+       M[47] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[7],0,0,0,a[18],0,0,0,0,0,0,0,a[6],0,0,0,0,0,0,0,0,0,0,0,b[19],0,0,b[2],b[18],0,b[17],0,b[7],b[6],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[17],0,c[6],0,c[7],0,c[18],0,0,0,0,0,c[19],c[2],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+       M[48] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[6],0,0,0,0,0,0,0,0,0,0,0,0,a[7],0,a[15],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[15],b[10],0,0,b[11],0,b[5],0,b[7],0,0,0,b[6],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[7],0,0,c[10],c[11],0,0,c[6],0,0,c[5],0,c[15],0,0,0,0,0,0,0};
+       M[49] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[12],0,0,0,a[16],a[14],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[12],b[16],0,0,b[14],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[5],c[14],0,0,c[15],0,0,0,c[6],0,c[12],c[16],0,0,0,0,0,0,0};
+
+       M[50] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[16],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[16],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[14],0,0,0,c[5],0,0,0,c[12],0,c[16],0,0,0,0,0,0,0,0};
+       M[51] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[18],0,0,0,0,0,b[7],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[7],0,0,0,0,0,0,0,0,0,0,0,c[18],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+       M[52] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[6],0,0,0,a[12],a[5],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[6],b[12],0,0,b[5],b[14],0,b[16],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[15],c[5],0,c[14],0,0,0,0,c[7],c[16],c[6],c[12],0,0,0,0,0,0,0};
+       M[53] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[15],0,0,0,0,b[7],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[15],0,0,0,0,0,0,c[7],0,0,0,0,0,0,0,0,0};
+       M[54] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[14],0,0,0,c[16],0,0,0,0,0,0,0,0,0,0};
+       M[55] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[7],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[17],0,0,b[18],b[7],0,b[6],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[6],0,0,0,0,0,c[7],0,0,0,0,0,c[17],c[18],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+       M[56] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[8],0,0,c[16],0,0,0,0,0,0,0,0,0,0,0};
+       M[57] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[6],0,0,b[7],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[6],c[7],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+       M[58] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[7],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[12],0,b[7],b[6],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[7],c[12],c[6],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+       M[59] = {0,0,0,0,0,0,0,0,u[4],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[16],0,0,0,0,0,0,0,0,0,0,a[5],0,a[12],0,a[14],a[10],0,0,0,0,a[6],0,0,0,0,0,0,0,0,0,0,b[5],b[14],0,b[6],b[10],0,0,0,0,b[12],0,0,0,b[16],0,0,0,0,0,0,0,0,0,0,0,0,0,c[6],0,0,0,0,0,0,0,0,0,0,c[12],c[11],c[10],0,0,0,0,c[16],0,c[15],0,c[5],c[14],0,0,0,0,0,0,0};
+
+       M[60] = {0,0,0,0,0,0,0,0,u[3],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[12],0,0,0,0,0,0,0,0,0,0,a[15],0,a[6],0,a[5],a[11],0,0,0,0,a[7],0,0,0,0,0,0,0,0,0,0,b[15],b[5],0,b[7],b[11],b[10],0,b[14],0,b[6],0,0,0,b[12],0,0,0,0,0,0,0,0,0,0,0,0,0,c[7],0,0,0,0,0,0,0,0,0,0,c[6],0,c[11],0,c[10],0,0,c[12],0,0,c[14],c[15],c[5],0,0,0,0,0,0,0};
+       M[61] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[16],0,0,0,0,0,0,0,0,0,0,0,0,0,b[16],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[8],0,0,0,c[17],c[16],0,c[12],0,0,0,0,0,0,0,0,0,0,0};
+       M[62] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[7],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[7],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+       M[63] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[16],0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+       M[64] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[12],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[12],b[16],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[6],c[12],0,c[16],c[7],0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+       M[65] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[6],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[16],0,b[6],b[12],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[7],c[6],c[16],c[12],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+       M[66] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[16],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[16],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[12],c[16],0,0,c[6],0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+       M[67] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[16],0,0,0,c[12],0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+       M[68] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[14],0,a[16],0,0,0,0,0,0,0,a[12],0,0,0,0,0,0,0,0,0,0,b[14],0,0,b[12],0,0,0,0,0,b[16],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[12],0,0,0,0,0,0,0,0,0,0,c[16],c[10],0,0,0,c[11],0,0,0,c[5],0,c[14],0,0,0,0,0,0,0,0};
+       M[69] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[2],0,0,0,0,0,0,0,0,0,0,a[18],0,0,0,a[20],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[20],0,0,0,b[2],0,0,0,b[18],0,0,0,c[18],0,0,0,0,0,0,0,c[20],0,0,0,0,c[2],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+
+       M[70] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,u[2],0,0,0,0,0,0,a[9],a[13],0,0,a[10],a[4],a[19],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[14],a[20],0,a[8],0,b[9],0,b[13],b[10],b[19],0,b[4],0,0,0,b[20],0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[14],0,b[8],0,0,0,c[14],c[8],0,c[20],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[9],c[13],c[10],c[4],c[19],0,0};
+       M[71] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[7],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[7],b[5],0,0,b[15],0,b[6],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[5],c[15],0,0,0,0,0,c[6],0,c[7],0,0,0,0,0,0,0};
+       M[72] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[7],0,0,0,a[6],a[15],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[7],b[6],b[14],0,b[15],b[5],0,b[12],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[15],c[14],c[5],0,0,0,0,0,c[12],c[7],c[6],0,0,0,0,0,0,0};
+       M[73] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[13],0,a[20],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[20],b[13],0,0,0,c[13],c[20],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+       M[74] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,u[3],0,0,0,a[17],0,0,a[7],0,0,0,0,0,a[6],0,a[15],0,0,0,a[3],a[2],0,a[18],0,0,0,0,a[5],0,0,0,0,0,0,0,b[18],b[7],0,b[2],0,0,0,b[13],b[3],b[19],b[4],0,b[15],b[5],b[17],0,0,0,b[6],0,0,0,0,0,0,0,0,0,0,0,c[18],c[4],c[6],c[5],c[17],c[15],0,c[3],0,0,0,0,0,0,c[13],0,0,0,0,0,c[19],0,c[2],0,0,0,c[7],0,0,0};
+       M[75] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,u[2],0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[2],a[1],a[9],a[13],0,0,0,0,0,0,0,0,0,a[20],a[11],0,0,a[3],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[20],b[1],b[9],b[13],b[11],0,b[3],0,b[2],0,c[11],c[3],c[2],0,0,0,c[9],0,0,0,c[13],0,c[1],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[20]};
+       M[76] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[20],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[20],0,0,0,c[20],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+       M[77] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[16],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[14],0,0,b[16],0,0,0,0,0,0,0,0,0,0,b[14],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[14],0,0,0,0,0,0,0,0,0,c[16],0,0,0,0,0,c[1],0,0,0,c[10],0,0,0,0,0,0,0,0,0,0};
+       M[78] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[17],0,0,0,a[12],0,0,0,0,0,a[16],0,0,a[8],0,a[19],0,0,0,0,0,0,0,0,0,0,0,0,b[17],b[19],0,b[12],0,0,0,0,0,0,0,0,0,0,0,0,0,b[8],0,0,0,0,b[16],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[8],0,0,c[16],0,0,c[20],0,0,0,0,c[19],0,c[2],0,0,0,0,c[17],0,c[12],0,0,0,0};
+       M[79] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[12],0,a[16],0,a[8],0,0,0,0,0,0,0,0,0,b[12],0,0,0,0,0,0,0,0,0,b[8],0,b[16],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[16],0,0,0,c[17],c[8],0,0,c[18],c[12],0,c[6],0,0,0,0,0,0,0,0,0,0,0};
+
+       M[80] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,u[4],0,0,0,0,0,0,0,0,0,0,0,0,0,a[5],0,0,0,0,a[12],0,0,0,0,0,a[16],0,a[4],a[10],a[8],0,0,0,a[14],0,0,0,a[17],0,0,0,0,b[10],b[5],0,b[12],b[14],0,b[4],0,0,b[17],0,0,0,0,0,b[8],0,0,0,0,0,0,0,b[16],0,0,0,0,0,0,0,0,0,c[17],c[14],0,0,0,0,0,c[16],0,0,0,c[8],c[9],0,0,0,0,c[10],0,c[11],c[3],0,c[4],0,0,c[5],0,0,c[12],0,0};
+       M[81] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[3],a[2],0,0,0,0,a[4],a[19],0,a[13],0,0,0,0,0,0,a[20],a[5],0,a[17],0,0,0,0,0,0,0,b[3],0,b[20],b[2],0,0,0,0,0,0,0,0,0,0,b[13],0,0,0,0,b[4],b[19],0,b[17],b[5],0,0,0,c[5],c[17],0,0,0,c[20],0,c[19],0,0,c[13],0,0,c[4],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[3],c[2],0,0,0};
+       M[82] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[6],0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[15],a[18],0,a[7],0,0,0,0,0,0,0,0,0,0,0,0,b[7],0,0,b[18],b[4],0,0,b[3],b[15],b[17],b[5],0,0,0,b[6],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[7],c[5],0,0,c[6],0,0,c[15],0,0,0,0,0,c[4],c[3],0,0,0,0,0,c[17],0,c[18],0,0,0,0,0,0,0};
+       M[83] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,u[2],a[18],0,0,0,a[6],0,0,0,0,0,a[12],0,0,a[17],0,a[2],0,a[19],0,a[20],0,0,0,0,0,a[8],0,0,b[18],b[2],0,b[6],0,0,0,0,0,0,0,b[20],0,b[19],0,0,0,b[17],b[8],0,0,0,b[12],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[8],0,c[17],0,c[19],c[12],0,0,0,c[20],0,0,0,c[2],0,0,0,0,0,0,c[18],0,c[6],0,0,0,0};
+       M[84] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,u[3],0,0,0,0,0,0,0,0,0,0,0,0,a[5],a[17],0,0,a[7],0,0,0,0,0,a[6],0,0,0,a[18],a[11],a[3],0,a[15],0,0,0,0,0,0,0,0,0,0,0,b[7],b[15],0,0,b[3],0,0,0,b[9],b[11],b[4],b[10],b[18],0,0,b[5],b[17],0,0,0,b[6],0,0,0,0,0,0,0,0,0,0,c[15],c[10],0,0,c[5],0,c[6],c[11],0,0,c[18],0,0,0,c[9],0,0,c[17],0,0,c[4],0,c[3],0,0,0,0,c[7],0,0};
+       M[85] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,u[2],0,0,0,a[19],0,a[15],a[18],0,0,0,0,a[5],a[17],0,a[3],0,0,0,a[13],a[20],0,a[2],0,0,a[6],0,a[4],0,0,0,0,0,b[15],0,b[2],b[18],0,b[20],0,0,0,0,b[13],0,0,0,b[3],b[4],b[19],0,0,b[5],b[17],0,b[6],0,0,0,0,0,c[6],0,0,0,c[2],0,c[17],c[4],c[19],c[3],0,c[13],c[5],0,0,0,0,0,0,0,0,0,0,0,0,0,c[20],0,0,c[15],c[18],0,0,0};
+       M[86] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[18],0,0,0,0,0,a[17],0,0,a[2],0,0,0,a[20],0,0,0,a[6],0,0,0,a[19],0,0,0,0,0,b[18],0,0,0,0,0,0,0,0,0,b[20],0,0,0,b[2],b[19],0,0,0,b[17],0,0,0,b[6],0,0,0,c[6],0,0,0,0,0,0,0,c[19],0,c[2],0,c[20],c[17],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[18],0,0,0,0};
+       M[87] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,u[2],0,0,0,0,0,0,0,0,a[11],a[3],a[2],0,0,0,a[10],a[4],a[19],a[9],0,0,a[20],0,0,0,a[13],0,0,a[5],0,0,a[17],0,0,0,0,b[11],b[2],b[13],b[3],0,0,0,0,0,0,0,0,0,b[20],b[9],0,0,0,0,b[10],b[4],b[19],b[5],0,b[17],0,0,0,c[5],c[17],0,0,c[13],0,c[4],0,0,c[9],c[19],0,c[10],0,c[20],0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[11],c[3],c[2],0,0};
+       M[88] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[2],0,0,0,a[17],0,0,0,0,0,a[8],0,0,a[19],0,a[20],0,0,0,0,0,a[12],0,0,0,0,0,0,b[2],b[20],0,b[17],0,0,0,0,0,0,0,0,0,0,0,0,0,b[19],0,0,0,0,b[8],0,0,0,b[12],0,0,0,c[12],0,0,0,0,0,0,0,0,0,c[19],0,0,c[8],0,0,0,0,0,0,0,c[20],0,0,0,0,0,0,c[2],0,c[17],0,0,0,0};
+       M[89] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[7],0,0,0,0,0,a[6],0,0,a[18],0,0,0,a[2],0,0,0,0,0,0,0,a[17],0,0,0,0,0,b[7],0,0,0,0,0,0,0,0,b[20],b[2],0,b[19],0,b[18],b[17],0,0,0,b[6],0,0,0,0,0,0,0,0,0,0,0,0,0,c[19],0,c[17],0,c[18],0,c[2],c[6],0,0,0,0,0,c[20],0,0,0,0,0,0,0,0,0,0,c[7],0,0,0,0};
+
+       M[90] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[12],0,0,0,0,0,0,0,0,0,0,0,0,a[16],0,a[8],0,0,0,0,0,0,0,0,0,0,0,0,b[12],b[8],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[16],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[16],0,0,0,0,0,c[19],0,0,0,c[2],c[8],0,c[17],0,0,0,0,c[12],0,0,0,0,0,0};
+       M[91] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,u[2],0,0,0,a[3],a[2],0,0,a[5],a[17],0,0,0,0,a[14],a[8],0,a[4],a[20],a[13],0,0,0,0,a[19],0,0,a[12],0,0,0,0,b[3],b[13],b[2],b[5],0,b[19],b[17],b[20],0,0,0,0,0,0,0,0,0,b[4],0,0,0,0,b[14],b[8],0,b[12],0,0,0,0,0,c[12],0,0,0,c[19],0,c[8],0,0,c[4],0,0,c[14],0,0,0,0,0,0,0,c[13],0,0,0,0,c[20],0,c[3],c[2],c[5],c[17],0,0,0};
+       M[92] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,u[4],0,0,0,0,0,0,0,0,0,0,a[6],a[16],0,0,0,0,0,0,0,0,0,0,0,a[17],a[5],0,a[14],a[8],a[4],a[12],0,0,0,0,0,0,0,0,b[5],b[6],0,0,b[12],0,b[17],b[8],0,0,b[4],0,b[14],0,0,0,0,0,b[16],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[12],0,0,0,c[16],0,0,c[14],0,0,0,c[3],c[4],0,0,0,c[5],0,c[15],c[18],0,c[17],c[8],0,c[6],0,0,0,0,0};
+       M[93] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,u[3],0,0,0,0,0,0,0,0,0,0,a[7],a[12],0,0,0,0,0,0,0,0,0,0,0,a[18],a[15],0,a[5],a[17],a[3],a[6],0,0,0,0,0,0,0,0,b[15],b[7],0,0,b[6],0,b[18],b[17],0,0,b[3],b[4],b[5],b[8],b[14],0,0,0,b[12],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[6],c[14],0,0,c[12],0,0,c[5],0,0,0,0,c[3],0,c[4],0,c[15],0,0,0,c[8],c[18],c[17],0,c[7],0,0,0,0,0};
+       M[94] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[2],0,0,0,0,0,a[19],0,0,a[20],0,0,0,0,0,0,0,a[17],0,0,0,0,0,0,0,0,0,b[2],0,0,0,0,0,0,0,0,0,0,0,0,0,b[20],0,0,0,0,b[19],0,0,0,b[17],0,0,0,c[17],0,0,0,0,0,0,0,0,0,c[20],0,0,c[19],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[2],0,0,0,0};
+       M[95] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,u[4],a[6],0,0,0,0,0,0,0,0,0,0,0,0,a[12],0,a[17],0,a[8],0,a[19],0,0,0,0,0,a[16],0,0,b[6],b[17],0,0,0,0,0,0,0,0,0,b[19],0,b[8],0,0,0,b[12],b[16],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[16],0,c[12],0,c[8],0,0,0,c[2],c[19],0,0,0,c[17],0,c[18],0,0,0,0,c[6],0,0,0,0,0,0};
+       M[96] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,u[4],0,0,0,a[5],a[17],0,0,0,a[12],0,0,0,0,0,a[16],0,a[14],a[19],a[4],0,0,0,0,a[8],0,0,0,0,0,0,0,b[5],b[4],b[17],0,0,b[8],b[12],b[19],0,0,0,0,0,0,0,0,0,b[14],0,0,0,0,0,b[16],0,0,0,0,0,0,0,0,0,0,0,c[8],0,c[16],0,0,c[14],0,0,0,0,0,c[13],0,0,0,0,c[4],0,c[3],c[2],0,c[19],0,c[5],c[17],0,c[12],0,0,0};
+       M[97] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[6],0,a[12],0,a[17],0,0,0,0,0,0,0,0,0,b[6],0,0,0,0,0,0,0,0,0,b[17],b[8],b[12],0,b[16],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[16],0,0,0,0,0,c[12],0,0,0,c[18],c[17],0,c[8],0,c[6],0,c[7],0,0,0,0,0,0,0,0,0,0,0};
+       M[98] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[12],0,0,0,0,0,0,0,0,0,0,0,0,a[8],a[14],0,0,0,0,a[16],0,0,0,0,0,0,0,0,b[14],b[12],0,0,b[16],0,b[8],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[16],0,0,0,0,0,0,0,0,0,0,c[4],0,0,0,c[3],c[14],0,c[5],c[17],0,c[8],0,0,c[12],0,0,0,0,0};
+       M[99] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[7],0,a[6],0,a[18],0,0,0,0,0,0,0,0,0,b[7],0,0,0,0,0,0,0,b[8],0,b[18],b[17],b[6],0,b[12],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[12],0,0,0,0,0,c[6],0,0,0,0,c[18],c[8],c[17],0,c[7],0,0,0,0,0,0,0,0,0,0,0,0,0};
+
+       M[100] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[16],0,0,0,0,0,0,0,0,0,0,0,0,0,b[16],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[16],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[10],0,0,0,c[14],0,0,0,0,0,0,0,0,0,0};
+       M[101] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[9],a[13],a[20],0,0,0,0,0,0,0,0,a[11],0,a[3],0,0,a[2],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[9],b[13],b[20],b[3],b[11],b[2],0,0,c[11],c[3],c[2],0,0,0,0,c[13],0,0,0,c[20],0,c[9],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+       M[102] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[13],a[20],0,0,0,0,0,0,0,0,0,a[3],0,a[2],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[13],b[20],0,b[2],b[3],0,0,0,c[3],c[2],0,0,0,0,0,c[20],0,0,0,0,0,c[13],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+       M[103] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[20],0,0,0,0,0,0,0,0,0,0,a[2],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[20],0,0,0,b[2],0,0,0,c[2],0,0,0,0,0,0,0,0,0,0,0,0,c[20],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+       M[104] = {0,0,0,0,0,0,0,0,0,0,0,u[4],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[10],0,0,0,0,a[14],a[8],0,a[16],0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[4],0,0,b[8],0,0,b[10],0,b[14],0,0,0,0,0,b[4],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[16],0,0,0,c[16],c[4],0,0,0,0,0,0,0,0,0,c[8],0,0,0,0,0,0,0,0,c[1],c[9],0,0,0,0,c[10],0,0,c[14],0,0};
+       M[105] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,u[4],0,0,0,0,0,0,a[10],a[4],0,0,0,a[14],a[8],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[19],0,a[16],0,b[10],0,b[4],0,b[8],0,b[14],0,0,0,b[19],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[16],0,0,0,0,c[16],0,c[19],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[9],c[13],0,0,0,c[10],c[4],0,c[14],c[8],0,0};
+       M[106] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[4],a[19],0,0,a[14],a[8],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[16],0,0,0,0,b[4],0,b[19],b[14],0,0,b[8],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[16],0,0,0,0,0,c[16],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[13],c[20],0,0,0,c[4],c[19],c[14],c[8],0,0,0};
+       M[107] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[19],0,0,0,a[8],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[16],0,0,0,0,0,0,b[19],0,0,b[8],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[16],0,0,0,c[16],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[20],0,0,0,0,c[19],0,c[8],0,0,0,0};
+       M[108] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[20],0,0,0,0,0,0,0,0,0,0,0,a[1],0,a[9],0,0,a[13],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[9],b[1],b[13],0,b[20],c[1],c[9],c[13],c[20],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+       M[109] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,u[3],a[7],0,0,0,0,0,0,0,0,0,0,0,0,a[6],0,a[18],0,a[17],0,a[2],0,0,0,0,0,a[12],0,0,b[7],b[18],0,0,0,0,0,0,0,0,0,b[2],b[19],b[17],0,b[8],0,b[6],b[12],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[8],0,c[12],0,c[6],0,c[17],0,0,0,0,c[2],0,c[19],0,c[18],0,0,0,0,0,0,c[7],0,0,0,0,0,0};
+
+       M[110] = {0,0,0,0,0,0,0,u[3],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[5],0,0,0,a[7],0,0,0,0,0,0,0,0,a[15],0,a[11],0,0,0,a[6],0,0,0,0,b[7],0,0,0,0,0,0,0,0,b[11],0,0,0,b[1],0,b[10],0,b[15],0,0,0,b[5],b[6],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[7],c[15],0,0,0,c[1],0,0,c[5],0,0,c[10],0,c[11],0,0,0,0,0,0,c[6]};
+       M[111] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,u[2],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[20],a[13],0,0,0,0,0,0,0,0,0,0,0,0,0,a[1],0,0,a[9],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[1],0,b[9],b[20],b[13],0,c[1],c[9],c[13],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[20],0};
+       M[112] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,u[2],0,0,0,0,0,0,0,0,0,0,0,a[1],a[9],a[13],a[20],0,a[19],0,0,0,0,0,0,0,0,0,0,0,0,0,a[10],0,0,a[4],b[20],0,0,0,b[1],b[13],0,b[9],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[10],0,b[4],0,b[19],0,c[10],c[4],c[19],0,0,0,0,0,0,0,0,0,0,c[20],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[1],c[9],c[13],0,0};
+       M[113] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[9],a[13],a[20],0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[10],0,a[4],0,0,a[19],0,0,0,0,b[9],b[20],0,b[13],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[4],b[10],b[19],0,0,c[10],c[4],c[19],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[9],c[13],c[20],0,0};
+       M[114] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[13],a[20],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[4],0,a[19],0,0,0,0,0,0,0,b[13],0,0,b[20],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[19],b[4],0,0,0,c[4],c[19],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[13],c[20],0,0,0};
+       M[115] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[20],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[19],0,0,0,0,0,0,0,0,0,b[20],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[19],0,0,0,c[19],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[20],0,0,0,0};
+       M[116] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,u[2],0,0,0,0,a[13],a[20],0,0,0,0,0,0,a[11],a[3],a[2],0,0,0,0,0,0,0,0,0,0,a[15],0,a[9],a[18],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[9],b[13],b[20],0,b[11],b[3],b[2],b[15],0,b[18],0,0,0,c[15],c[18],0,0,0,0,c[3],c[9],c[13],0,c[2],0,c[11],0,0,0,0,0,0,0,0,c[20],0,0,0,0,0,0,0,0,0,0,0,0};
+       M[117] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[20],0,0,0,0,0,0,0,a[3],a[2],0,0,0,0,0,0,0,0,0,a[15],0,a[18],0,a[13],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[13],b[20],0,0,b[3],b[2],0,b[18],b[15],0,0,0,c[15],c[18],0,0,0,0,0,c[2],c[13],c[20],0,0,0,c[3],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+       M[118] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[13],a[20],0,0,a[4],a[19],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[14],0,a[8],0,0,0,0,b[13],0,b[20],b[4],0,0,b[19],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[8],b[14],0,0,0,c[14],c[8],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[13],c[20],c[4],c[19],0,0,0};
+       M[119] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[20],0,0,0,a[19],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,a[8],0,0,0,0,0,0,b[20],0,0,b[19],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b[8],0,0,0,c[8],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,c[20],0,c[19],0,0,0,0};
+
+
+       return cv::Mat(M).t();
+}
index 329e804..f5483c8 100644 (file)
@@ -1,17 +1,30 @@
-#ifndef dls_h
-#define dls_h
+#ifndef DLS_H
+#define DLS_H
 
-#include "opencv2/core/core_c.h"
+#include "precomp.hpp"
 
 class dls
 {
 public:
-       dls();
+       dls(const cv::Mat& opoints, const cv::Mat& ipoints);
        ~dls();
 
-private:
+       void init_vectors(const cv::Mat& opoints, const cv::Mat& ipoints);
+       void build_coeff_mattrix();
+       cv::Mat LeftMultVec(const cv::Mat& v);
+       cv::Mat cayley_LS_M(const std::vector<double>& a, const std::vector<double>& b, const std::vector<double>& c, const std::vector<double>& u);
 
+private:
+       cv::Mat H;                      // coeff matrix
+       cv::Mat A;
+       cv::Mat D_mat;
+       std::vector<double> f1coeff;
+       std::vector<double> f2coeff;
+       std::vector<double> f3coeff;
+       cv::Mat p;                      // object points
+       cv::Mat z;                      // image points
+       int N;                          // number of input points
 };
 
 
-#endif
+#endif // DLS_H
index f204463..daa959e 100644 (file)
  //M*/
 
 #include "precomp.hpp"
+#include "dls.h"
 #include "epnp.h"
 #include "p3p.h"
 #include "opencv2/calib3d/calib3d_c.h"
-#include "dls.h"
 
 #include <iostream>
 using namespace cv;
@@ -100,12 +100,13 @@ bool cv::solvePnP( InputArray _opoints, InputArray _ipoints,
        cv::Mat undistortedPoints;
        cv::undistortPoints(ipoints, undistortedPoints, cameraMatrix, distCoeffs);
 
-       //dls PnP;
+
+       dls PnP(opoints, undistortedPoints);
        //  DO SOMETHING
 
        cv::Mat R, rvec = _rvec.getMat(), tvec = _tvec.getMat();
 
-
+       return true;
     }
     else
         CV_Error(CV_StsBadArg, "The flags argument must be one of CV_ITERATIVE, CV_P3P or CV_EPNP");