29 #include <numeric/numeric.functions.hh>
30 #include <numeric/xyzMatrix.hh>
31 #include <numeric/xyzVector.hh>
32 #include <numeric/xyz.functions.hh>
36 #include <utility/exit.hh>
42 #include <ObjexxFCL/Fmath.hh>
48 #include <platform/types.hh>
50 #include <utility/vector1.hh>
51 #include <ObjexxFCL/Dimension.hh>
52 #include <ObjexxFCL/FArray1D.hh>
53 #include <ObjexxFCL/FArray2D.hh>
69 #include <boost/bind.hpp>
70 #include <boost/function.hpp>
73 namespace std { }
using namespace std;
74 namespace ObjexxFCL { }
using namespace ObjexxFCL;
75 namespace ObjexxFCL {
namespace fmt { } }
using namespace ObjexxFCL::fmt;
82 using namespace ObjexxFCL;
87 ResidualDipolarCouplingEnergy_RohlCreator::create_energy_method(
94 ResidualDipolarCouplingEnergy_RohlCreator::score_types_for_method()
const {
104 ResidualDipolarCouplingEnergy_Rohl::ResidualDipolarCouplingEnergy_Rohl() :
168 Size const nrow( All_RDC_lines.size() );
169 Size const ORDERSIZE = { 5 };
171 ObjexxFCL::FArray2D< Real >
A( nrow, ORDERSIZE );
172 ObjexxFCL::FArray1D< Real >
b( nrow );
173 ObjexxFCL::FArray1D< Real > x( ORDERSIZE );
174 ObjexxFCL::FArray1D< Real > weights( nrow );
175 ObjexxFCL::FArray2D< Real > vec( 3, 3 );
186 if( reject ) std::cout <<
"SET SCORE VALUE, FIX THIS LATER " << std::endl;
200 ObjexxFCL::FArray2D< Real > &
A,
201 ObjexxFCL::FArray1D< Real > &
b,
202 ObjexxFCL::FArray1D< Real > & weights
211 for( it = All_RDC_lines.begin(); it != All_RDC_lines.end(); ++it) {
216 Real umn_x = umn.x()/it->fixed_dist();
217 Real umn_y = umn.y()/it->fixed_dist();
218 Real umn_z = umn.z()/it->fixed_dist();
221 A( nrow, 1 ) = umn_y*umn_y - umn_x*umn_x;
222 A( nrow, 2 ) = umn_z*umn_z - umn_x*umn_x;
223 A( nrow, 3 ) = 2.0*umn_x*umn_y;
224 A( nrow, 4 ) = 2.0*umn_x*umn_z;
225 A( nrow, 5 ) = 2.0*umn_z*umn_y;
228 b( nrow ) = it->Reduced_Jdipolar();
229 weights( nrow ) = it->weight();
242 Size const & ORDERSIZE,
243 ObjexxFCL::FArray2D< Real > &
A,
244 ObjexxFCL::FArray1D< Real > &
b,
245 ObjexxFCL::FArray1D< Real > & x,
246 ObjexxFCL::FArray1D< Real > & weights,
254 ObjexxFCL::FArray2D< Real > U( nrow, ORDERSIZE );
255 ObjexxFCL::FArray1D< Real > w( ORDERSIZE );
256 ObjexxFCL::FArray2D< Real > v( ORDERSIZE, ORDERSIZE );
257 ObjexxFCL::FArray1D< Real > bweighted( nrow );
265 if ( weights( i ) > 0.000001 ) {
267 U( ct_align, 1 ) =
A(i,1) * weights( i );
268 U( ct_align, 2 ) =
A(i,2) * weights( i );
269 U( ct_align, 3 ) =
A(i,3) * weights( i );
270 U( ct_align, 4 ) =
A(i,4) * weights( i );
271 U( ct_align, 5 ) =
A(i,5) * weights( i );
272 bweighted( ct_align ) =
b( i ) * weights( i );
276 svdcmp( U, ct_align, ORDERSIZE, w, v );
279 for (
core::Size j = 1; j <= ORDERSIZE; ++j ) {
280 if ( w(j) > wmax ) wmax = w(j);
282 wmin = wmax * factor;
284 for (
core::Size j = 1; j <= ORDERSIZE; ++j ) {
290 if ( (
int)sing > std::abs(
int( ct_align ) -
int( ORDERSIZE ) ) )
291 std::cout <<
"SVD yielded a matrix singular above expectation " <<
292 "in get_ordermatrix" << std::endl;
296 svbksb( U, w, v, ct_align, ORDERSIZE, bweighted, x );
303 if ( Sxx < -0.5 || Sxx > 1.0 ) reject =
true;
304 if ( x(1) < -0.5 || x(1) > 1.0 ) reject =
true;
305 if ( x(2) < -0.5 || x(2) > 1.0 ) reject =
true;
306 if ( x(3) < -0.75 || x(3) > 0.75 ) reject =
true;
307 if ( x(4) < -0.75 || x(4) > 0.75 ) reject =
true;
308 if ( x(5) < -0.75 || x(5) > 0.75 ) reject =
true;
311 std::cout <<
"order matrix not physically meaningful" << std::endl;
326 ObjexxFCL::FArray2D< Real > & a,
329 ObjexxFCL::FArray1D< Real > & w,
330 ObjexxFCL::FArray2D< Real > & v
335 Size i,its,j,jj,k,l,nm;
336 ObjexxFCL::FArray1D< core::Real > rv1( n );
337 Real anorm,
c, f, g, h, s, scale, x, y, z;
343 for ( i = 1; i <= n; ++i ) {
350 for ( k = i; k <= m; ++k ) {
351 scale += std::abs(a(k,i));
353 if ( scale != 0.0 ) {
354 for ( k = i; k <= m; ++k ) {
359 g = -sign(std::sqrt(s),f);
362 for ( j = l; j <= n; ++j ) {
364 for ( k = i; k <= m; ++k ) {
368 for ( k = i; k <= m; ++k ) {
372 for ( k = i; k <= m; ++k ) {
381 if ( (i <= m) && (i != n) ) {
382 for ( k = l; k <= n; ++k ) {
383 scale += std::abs(a(i,k));
385 if ( scale != 0.0 ) {
386 for ( k = l; k <= n; ++k ) {
391 g = -sign(std::sqrt(s),f);
394 for ( k = l; k <= n; ++k ) {
397 for ( j = l; j <= m; ++j ) {
399 for ( k = l; k <= n; ++k ) {
402 for ( k = l; k <= n; ++k ) {
406 for ( k = l; k <= n; ++k ) {
411 anorm = std::max(anorm,(std::abs(w(i))+std::abs(rv1(i))));
413 for ( i = n; i >= 1; --i ) {
416 for ( j = l; j <= n; ++j ) {
417 v(j,i) = (a(i,j)/a(i,l))/g;
419 for ( j = l; j <= n; ++j ) {
421 for ( k = l; k <= n; ++k ) {
424 for ( k = l; k <= n; ++k ) {
429 for ( j = l; j <= n; ++j ) {
438 for ( i = std::min(m,n); i >= 1; --i ) {
441 for ( j = l; j <= n; ++j ) {
446 for ( j = l; j <= n; ++j ) {
448 for ( k = l; k <= m; ++k ) {
452 for ( k = i; k <= m; ++k ) {
456 for ( j = i; j <= m; ++j ) {
460 for ( j = i; j <= m; ++j ) {
466 for ( k = n; k >= 1; --k ) {
467 for ( its = 1; its <= 30; ++its ) {
468 for ( l = k; l >= 1; --l ) {
470 if ( (std::abs(rv1(l))+anorm) == anorm )
goto L2;
471 if ( (std::abs(w(nm))+anorm) == anorm )
goto L1;
476 for ( i = l; i <= k; ++i ) {
479 if ( (std::abs(f)+anorm) == anorm )
goto L2;
486 for ( j = 1; j <= m; ++j ) {
489 a(j,nm) = (y*
c)+(z*s);
490 a(j,i) = -(y*s)+(z*c);
498 for ( j = 1; j <= n; ++j ) {
504 if ( its == 30) utility_exit_with_message(
"no convergence in svdcmp \n" );
510 f = ((y-z)*(y+z)+(g-h)*(g+h))/(2.0*h*y);
512 f = ((x-z)*(x+z)+h*((y/(f+sign(g,f)))-h))/x;
515 for ( j = l; j <= nm; ++j ) {
529 for ( jj = 1; jj <= n; ++jj ) {
532 v(jj,j) = (x*
c)+(z*s);
533 v(jj,i) = -(x*s)+(z*c);
544 for ( jj = 1; jj <= m; ++jj ) {
547 a(jj,j) = (y*
c)+(z*s);
548 a(jj,i) = -(y*s)+(z*c);
571 Real absa = std::abs(a);
572 Real absb = std::abs(b);
574 Real const ratio = absb/absa;
575 pythag = absa * std::sqrt( 1.0 + ( ratio * ratio ) );
580 Real const ratio = absa/absb;
581 pythag = absb * std::sqrt( 1.0 + ( ratio * ratio ) );
592 ObjexxFCL::FArray2D< Real >
const & u,
593 ObjexxFCL::FArray1D< Real >
const & w,
594 ObjexxFCL::FArray2D< Real >
const & v,
597 ObjexxFCL::FArray1D< Real >
const &
b,
598 ObjexxFCL::FArray1D< Real > & x
603 ObjexxFCL::FArray1D< core::Real > tmp( n );
606 for (
Size j = 1; j <= n; ++j ) {
609 for (
Size i = 1; i <= m; ++i ) {
616 for (
Size j = 1; j <= n; ++j ) {
618 for (
Size jj = 1; jj <= n; ++jj ) {
619 s += v(j,jj) * tmp(jj);
630 ObjexxFCL::FArray1D< Real > x,
631 ObjexxFCL::FArray2D< Real > vec,
639 ObjexxFCL::FArray1D< Size > sort( 3 );
650 val = eigenvector_jacobi( S, 1
E-9, xyz_vec );
657 if ( std::abs(val(1)) < std::abs(val(2)) ) {
661 if ( std::abs(val(sort(2))) < std::abs(val(3)) ) {
664 if ( std::abs(val(sort(1))) < std::abs(val(3)) ) {
672 eta = (2.0/3.0) * std::abs(val(sort(2))-val(sort(3))/Azz);
675 temp1 = val(sort(1));
676 temp2 = val(sort(2));
677 val(3) = val(sort(3));
682 for (
Size i = 1; i <= 3; ++i ) {
683 temp1 = xyz_vec(i,sort(3));
684 temp2 = xyz_vec(i,sort(2));
685 vec(i,3) = xyz_vec(i,sort(1));
691 eta = (2.0/3.0) * (val(3)-val(2))/val(1);
700 ObjexxFCL::FArray2D< Real >
const &
A,
701 ObjexxFCL::FArray1D< Real >
const & x,
702 ObjexxFCL::FArray1D< Real >
const &
b,
704 Size const & ORDERSIZE,
715 for( it = All_RDC_lines.begin(); it != All_RDC_lines.end(); ++it) {
718 for(
Size j = 1; j <= ORDERSIZE; ++j ) {
719 Jcalc +=
A( nrow, j )*x(j);
721 score += (
b( nrow ) -Jcalc )*(
b( nrow ) - Jcalc );
728 score /= ( nrow*( Azz*Azz ) );