code: public boolean refine(List<AssociatedTriple> listObs , DMatrixRMaj P2 , DMatrixRMaj P3 )
  	{
  		CommonOps_DDRM.setIdentity(P1);
  		initializeStructure(listObs, P2, P3);
  
  		if( scale ) {
  			scaler.applyScale(structure,observations);
  		}
  
  //		sba.setVerbose(System.out,0);
  		sba.setParameters(structure,observations);
  		sba.configure(converge.ftol,converge.gtol,converge.maxIterations);
  
  		if( !sba.optimize(structure) ) {
  			return false;
  		}
  
  		// save the results
  		P2.set(structure.views[1].worldToView);
  		P3.set(structure.views[2].worldToView);
  
  		if( scale ) {
  			// don't use built in unscaling function because it undoes scaling on points. Those are disposable
  			scaler.pixelScaling.get(1).remove(P2,P2);
  			scaler.pixelScaling.get(2).remove(P3,P3);
  		}
  
  		return true;
  	}
docs: Refines P2 and P3 using SBA. View 1 is assumed to be P1 = [I|0]
  
  @param listObs Observations from the three views
  @param P2 camera matrix for view 2. modified
  @param P3 camera matrix for view 3. modified
  @return true if successful