docs: public void decompose( DMatrixRMaj homography ) {
  		if( !svd.decompose(homography) )
  			throw new RuntimeException("SVD failed somehow");
  
  		DMatrixRMaj V = svd.getV(null,false);
  		DMatrixRMaj S = svd.getW(null);
  
  		SingularOps_DDRM.descendingOrder(null,false,S, V,false);
  
  		double s0 = S.get(0,0);
  		double s1 = S.get(1,1); // This is the scale. If normalize it will be one
  		double s2 = S.get(2,2);
  
  		// force s1 to be 1
  		s0 /= s1;
  		s2 /= s1;
  		CommonOps_DDRM.scale(1.0/s1,homography,this.H);
  
  		// square s0 and s1 for other parts of the calculations
  		s0 *= s0;
  		s2 *= s2;
  
  		v2.set(V.get(0,1),V.get(1,1),V.get(2,1));
  
  		double a = Math.sqrt(1-s2);
  		double b = Math.sqrt(s0-1);
  		double div = Math.sqrt(s0-s2);
  
  		for( int i = 0; i < 3; i++ ) {
  			double e1 = (a*V.get(i,0) + b*V.get(i,2))/div;
  			double e2 = (a*V.get(i,0) - b*V.get(i,2))/div;
  
  			u1.setIdx(i,e1);
  			u2.setIdx(i,e2);
  		}
  
  		setU(U1, v2, u1);
  		setU(U2, v2, u2);
  		setW(W1, H , v2, u1);
  		setW(W2, H , v2, u2);
  
  		// create the four solutions
  		createSolution(W1, U1, u1,H,solutionsSE.get(0), solutionsN.get(0));
  		createSolution(W2, U2, u2,H,solutionsSE.get(1), solutionsN.get(1));
  		createMirrorSolution(0,2);
  		createMirrorSolution(1,3);
  	}