14 #ifndef INCLUDED_core_pack_interaction_graph_AminoAcidNeighborSparseMatrix_hh
15 #define INCLUDED_core_pack_interaction_graph_AminoAcidNeighborSparseMatrix_hh
18 #include <utility/vector1.hh>
22 #include <ObjexxFCL/FArray1.hh>
23 #include <ObjexxFCL/FArray1D.hh>
25 #include <ObjexxFCL/FArray2.hh>
26 #include <ObjexxFCL/FArray2D.hh>
32 namespace ObjexxFCL { }
using namespace ObjexxFCL;
38 namespace interaction_graph {
51 template <
typename T >
52 class AminoAcidNeighborSparseMatrix
81 num_aa_( first_node_num_states_per_aa.size() ),
82 first_node_num_states_per_aatype_( first_node_num_states_per_aa ),
83 second_node_num_states_per_aatype_( second_node_num_states_per_aa ),
98 FArray2_bool
const & sparse_conn_info
101 aa_offsets_.dimension( num_aa_, num_aa_ );
105 for (
int ii = 1; ii <= num_aa_; ++ii) {
106 int node1_num_states_for_aatype =
107 first_node_num_states_per_aatype_[ ii ];
108 for (
int jj = 1; jj <= num_aa_; ++jj) {
109 int node2_num_states_for_aatype =
110 second_node_num_states_per_aatype_[ jj ];
111 if ( ! sparse_conn_info( jj, ii) ||
112 node1_num_states_for_aatype == 0 ||
113 node2_num_states_for_aatype == 0) {
114 aa_offsets_(jj, ii) = -1;
116 aa_offsets_(jj, ii) = next_offset;
118 node1_num_states_for_aatype * node2_num_states_for_aatype;
123 table_size_ = next_offset;
124 sparse_matrix_.dimension(table_size_);
125 if (next_offset != 0) {
126 sparse_matrix_ = 0.0f;
138 return (aa_offsets_(node2aa, node1aa) != -1);
154 return aa_offsets_.size() *
sizeof(
int );
168 int offset = get_offset( ind1, ind2);
171 return sparse_matrix_( offset + get_submatrix_index(ind1, ind2) );
197 int ind2num_states_per_aatype,
199 FArray1< value_type >
const & sparse_matrix
205 int index = aa_offset +
206 (ind2num_states_per_aatype *
207 (ind1.get_state_ind_for_this_aa_type() - 1) ) +
208 ind2.get_state_ind_for_this_aa_type();
210 return sparse_matrix( index );
235 int ind1_node_state_offset_minus_1,
236 int ind2_num_states_per_aatype,
238 FArray1< value_type >
const & sparse_matrix
245 int index = aa_offset +
246 (ind2_num_states_per_aatype * ind1_node_state_offset_minus_1 ) +
247 ind2.get_state_ind_for_this_aa_type();
248 return sparse_matrix( index );
255 return sparse_matrix_.size();
261 operator [] (
int index )
const {
262 return sparse_matrix_( index );
268 operator [] (
int index ) {
269 return sparse_matrix_( index );
289 int offset = get_offset( ind1, ind2);
290 if (offset == -1)
return;
292 sparse_matrix_( offset + get_submatrix_index( ind1, ind2) ) = val;
321 int ind2num_states_per_aatype,
323 FArray1< value_type > & sparse_matrix,
330 int index = aa_offset +
331 (ind2num_states_per_aatype *
335 sparse_matrix( index ) = val;
360 int ind1_node_state_offset_minus_1,
361 int ind2_num_states_per_aatype,
363 FArray1< value_type > & sparse_matrix,
371 int index = aa_offset +
372 (ind2_num_states_per_aatype * ind1_node_state_offset_minus_1 ) +
374 sparse_matrix( index ) = val;
386 sparse_matrix_ = val;
405 int offset = get_offset( ind1, ind2);
406 if (offset == -1)
return;
408 sparse_matrix_( offset + get_submatrix_index( ind1, ind2) ) += val;
422 int offset = get_offset( ind1, ind2 );
423 if ( offset == -1 )
return;
425 sparse_matrix_( offset + get_submatrix_index( ind1, ind2 ) ) *= scaler;
436 sparse_matrix_ *= scaler;
448 return sparse_matrix_(1);
464 ObjexxFCL::FArray2D< value_type >
470 ObjexxFCL::FArray2D< value_type > submatrix(
471 second_node_num_states_per_aatype_[ node2aa ],
472 first_node_num_states_per_aatype_[ node1aa ] );
474 int offset = aa_offsets_( node2aa, node1aa );
475 if ( offset == -1 ) {
478 int const nvals = submatrix.size();
479 for (
int li_src = offset, li_dest = 0; li_dest < nvals ; ++li_dest, ++li_src ) {
480 submatrix[ li_dest ] = sparse_matrix_[ li_src ];
515 if (table_size_ != 0 ) {
516 FArray2D_int old_aa_offsets( aa_offsets_ );
517 FArray1D< value_type > old_sparse_matrix;
518 old_sparse_matrix.swap( sparse_matrix_ );
520 FArray2D_bool new_aa_neighbors( num_aa_, num_aa_,
true);
522 set_sparse_aa_info(new_aa_neighbors);
523 copy_old_data_into_new_table( old_aa_offsets, old_sparse_matrix );
525 FArray2D_bool new_aa_neighbors( num_aa_, num_aa_,
true);
526 set_sparse_aa_info(new_aa_neighbors);
535 if ( aa_offsets_( node2aa, node1aa ) != -1 )
return;
537 FArray2D_int old_aa_offsets( aa_offsets_ );
538 FArray1D< value_type > old_sparse_matrix;
539 old_sparse_matrix.swap( sparse_matrix_ );
541 FArray2D_bool new_aa_neighbors( num_aa_, num_aa_,
false );
542 for (
int ii = 1; ii <= num_aa_; ++ii ) {
543 for (
int jj = 1; jj <= num_aa_; ++jj ) {
544 if ( old_aa_offsets(jj, ii) != -1 ) {
545 new_aa_neighbors(jj, ii) =
true;
549 new_aa_neighbors( node2aa, node1aa ) =
true;
551 set_sparse_aa_info( new_aa_neighbors );
552 copy_old_data_into_new_table( old_aa_offsets, old_sparse_matrix );
559 drop_small_submatrices_where_possible( (
value_type) 0 );
569 FArray2D_bool submatrix_worth_keeping( num_aa_, num_aa_,
false);
570 bool found_submatrix_not_worth_keeping =
false;
572 for (
int ii = 1; ii <= num_aa_; ++ii ) {
573 int first_node_num_states_for_aa =
574 first_node_num_states_per_aatype_[ ii ];
575 if (first_node_num_states_for_aa == 0)
continue;
577 for (
int jj = 1; jj <= num_aa_; ++jj ) {
578 int second_node_num_states_for_aa =
579 second_node_num_states_per_aatype_[ jj ];
580 if (second_node_num_states_for_aa == 0)
continue;
582 int aa_neighbor_offset = aa_offsets_( jj, ii );
583 bool this_submatrix_worth_keeping =
false;
584 if ( aa_neighbor_offset != -1) {
585 int submatrix_index = 1;
586 for (
int kk = 1; kk <= first_node_num_states_for_aa; ++kk) {
587 for (
int ll = 1; ll <= second_node_num_states_for_aa; ++ll) {
588 int index = aa_neighbor_offset + submatrix_index;
591 std::abs( sparse_matrix_( index ) );
592 if (energy_mag > epsilon) {
593 this_submatrix_worth_keeping =
true;
598 if ( this_submatrix_worth_keeping )
break;
600 submatrix_worth_keeping( jj, ii ) = this_submatrix_worth_keeping;
601 if (! this_submatrix_worth_keeping ) {
602 found_submatrix_not_worth_keeping =
true;
608 if (! found_submatrix_not_worth_keeping )
return;
610 FArray1D_float old_sparse_matrix;
611 old_sparse_matrix.swap( sparse_matrix_ );
613 FArray2D_int old_aa_offsets( aa_offsets_ );
614 set_sparse_aa_info( submatrix_worth_keeping );
615 copy_old_data_into_new_table( old_aa_offsets, old_sparse_matrix );
652 second_node_num_states_per_aatype_[ ind2.
get_aa_type() ] +
662 void copy_old_data_into_new_table
664 FArray2D_int
const & old_aa_offsets,
665 FArray1D< value_type >
const & old_sparse_matrix
668 for (
int ii = 1; ii <= num_aa_; ++ii ) {
669 int first_node_num_states_for_aa =
670 first_node_num_states_per_aatype_[ ii ];
671 if (first_node_num_states_for_aa == 0)
continue;
673 for (
int jj = 1; jj <= num_aa_; ++jj ) {
674 int second_node_num_states_for_aa =
675 second_node_num_states_per_aatype_[ jj ];
676 if (second_node_num_states_for_aa == 0)
continue;
678 int source_aa_offset = old_aa_offsets( jj, ii );
679 int destination_aa_offset = aa_offsets_( jj, ii );
681 if ( source_aa_offset != -1 && destination_aa_offset != -1 ) {
682 int submatrix_index = 1;
683 for (
int kk = 1; kk <= first_node_num_states_for_aa; ++kk) {
684 for (
int ll = 1; ll <= second_node_num_states_for_aa; ++ll) {
685 int index_destination = destination_aa_offset + submatrix_index;
686 int index_source = source_aa_offset + submatrix_index;
688 sparse_matrix_( index_destination ) =
689 old_sparse_matrix( index_source );