65 #include <basic/Tracer.hh>
67 #include <utility/vector1.hh>
70 #include <numeric/random/random.hh>
71 #include <numeric/random/random_permutation.hh>
74 #include <basic/options/option.hh>
75 #include <basic/options/keys/optimization.OptionKeys.gen.hh>
81 #include <utility/vector0.hh>
84 namespace ObjexxFCL {
namespace fmt { } }
using namespace ObjexxFCL::fmt;
91 using namespace ObjexxFCL::fmt;
93 static numeric::random::RandomGenerator
rtmin_RG(206025);
95 static basic::Tracer
TR(
"core.pack.rtmin" );
103 scoring::ScoreFunction
const & scorefxn,
105 pack::scmin::SCMinMinimizerMap
const & scminmap,
106 conformation::Residue
const & rsd,
107 scoring::MinimizationGraph & mingraph
112 : minimize_ligand_chis_(true),
113 minimize_ligand_jumps_(false),
119 bool minimize_ligand_chis,
120 bool minimize_ligand_jumps
122 minimize_ligand_chis_(minimize_ligand_chis),
123 minimize_ligand_jumps_(minimize_ligand_jumps)
136 using namespace conformation;
137 using namespace chemical;
138 using namespace pack::rotamer_set;
139 using namespace pack::scmin;
140 using namespace pose;
141 using namespace scoring;
142 using namespace scoring::methods;
143 using namespace optimization;
144 using namespace graph;
145 using namespace basic::options;
154 iter_end = scfxn.
all_methods().end(); iter != iter_end; ++iter ) {
157 if ( (*iter)->method_type() !=
ws && (*iter)->minimize_in_whole_structure_context( pose ) ) {
158 std::cerr <<
"Scoring term responsible for score types:";
159 for (
Size ii = 1; ii <= (*iter)->score_types().size(); ++ii ) {
160 std::cerr <<
" " << (*iter)->score_types()[ ii ];
162 std::cerr <<
" states that it requires whole-structure context to perform minimization, and thus" <<
163 " cannot be used in RTMin." << std::endl;
168 utility_exit_with_message(
"Incompatible scoring terms requested in invocation of RTMin" );
177 numeric::random::random_permutation( active_residues,
rtmin_RG );
185 scminmap =
new CartSCMinMinimizerMap();
187 scminmap =
new AtomTreeSCMinMinimizerMap();
199 minimizer =
"lbfgs_armijo";
208 for (
Size ii = 1; ii <= input_task->num_to_be_packed(); ++ii ) {
209 Size iires = active_residues[ ii ];
213 eiter != eiter_end; ++eiter ) {
214 Size jjres = (*eiter)->get_other_ind( iires );
215 if ( ! bgres[ jjres ] && ! input_task->being_packed( jjres )) {
216 inactive_neighbors.push_back( jjres );
217 residue_is_inactive_neighbor[ jjres ] =
true;
219 scminmap->set_natoms_for_residue( jjres, bgres[ jjres ]->natoms() );
223 * mingraph.get_minimization_node( jjres ), pose.
residue( jjres ),
224 *scminmap, pose,
false, emap_dummy );
226 if ( ! input_task->being_packed( jjres ) || iires < jjres ) {
227 mingraph.add_edge( iires, jjres );
238 iter != iter_end; ++iter ) {
240 if ( (*iter)->minimize_in_whole_structure_context( pose ) )
continue;
243 if ( !lrec || lrec->empty() )
continue;
249 rni = lrec->const_neighbor_iterator_begin( iires ),
250 rniend = lrec->const_neighbor_iterator_end( iires );
251 (*rni) != (*rniend); ++(*rni) ) {
252 Size const r1 = rni->lower_neighbor_id();
253 Size const r2 = rni->upper_neighbor_id();
254 Size const jjres = ( r1 == iires ? r2 : r1 );
255 bool const res_moving_wrt_eachother(
true );
257 if ( ! bgres[ jjres ] && ! input_task->being_packed( jjres )) {
258 inactive_neighbors.push_back( jjres );
259 residue_is_inactive_neighbor[ jjres ] =
true;
261 scminmap->set_natoms_for_residue( jjres, bgres[ jjres ]->natoms() );
265 * mingraph.get_minimization_node( jjres ), pose.
residue( jjres ),
266 *scminmap, pose,
false, emap_dummy );
268 if ( ! input_task->being_packed( jjres ) || iires < jjres ) {
269 if(!mingraph.get_edge_exists(iires, jjres)){
270 mingraph.add_edge( iires, jjres );
279 input_task->set_bump_check(
false );
280 input_task->or_include_current(
true );
281 input_task->temporarily_fix_everything();
292 for (
Size ii = 1; ii <= active_residues.size(); ++ii ) {
295 Size iiresid = active_residues[ ii ];
297 scminmap->activate_residue_dofs( iiresid );
301 input_task->temporarily_set_pack_residue( iiresid,
true );
303 RotamerSetFactory rsf;
305 iirotset->set_resid( iiresid );
306 iirotset->build_rotamers( pose, scfxn, *input_task, packer_neighbor_graph );
307 assert( iirotset->id_for_current_rotamer() != 0 );
310 ii_atc->residue_atomtree_collection( iiresid ).set_active_restype_index( 1 );
311 ii_atc->residue_atomtree_collection( iiresid ).set_rescoords( * iirotset->rotamer( 1 ) );
312 ii_atc->residue_atomtree_collection( iiresid ).update_atom_tree();
313 scminmap->setup( ii_atc );
316 Residue const & iirsd( ii_atc->residue_atomtree_collection( iiresid ).active_residue() );
317 if ( ! bgres[ iiresid ] ) {
320 * mingraph.get_minimization_node( iiresid ), iirsd,
321 *scminmap, pose,
false, emap_dummy );
324 * mingraph.get_minimization_node( iiresid ), iirsd,
328 eiter = mingraph.get_node( iiresid )->edge_list_begin(),
330 eiter != eiter_end; ++eiter ) {
332 Size jjresid = (*eiter)->get_other_ind( iiresid );
333 if ( ! bgres[ jjresid ] ) {
337 * mingraph.get_minimization_node( jjresid ),
339 *scminmap, pose,
false, emap_dummy );
340 scminmap->set_natoms_for_residue( jjresid, bgres[ jjresid ]->natoms() );
342 Residue const & jjrsd( * bgres[ jjresid ] );
343 MinimizationEdge & min_edge( static_cast< MinimizationEdge & > ( **eiter ));
345 if ( jjresid < iiresid ) {
346 if ( residue_is_inactive_neighbor[ jjresid ] || ! active_residue_has_been_visited[ jjresid ] ) {
348 jjrsd, iirsd, min_edge, *scminmap, pose,
true,
false, (
EnergyEdge * ) 0, emap_dummy );
356 if ( residue_is_inactive_neighbor[ jjresid ] || ! active_residue_has_been_visited[ jjresid ] ) {
358 iirsd, jjrsd, min_edge, *scminmap, pose,
true,
false, (
EnergyEdge * ) 0, emap_dummy );
370 iter != iter_end; ++iter ) {
372 if ( (*iter)->minimize_in_whole_structure_context( pose ) )
continue;
375 if ( !lrec || lrec->empty() )
continue;
381 rni = lrec->const_neighbor_iterator_begin( iiresid ),
382 rniend = lrec->const_neighbor_iterator_end( iiresid );
383 (*rni) != (*rniend); ++(*rni) ) {
384 Size const r1 = rni->lower_neighbor_id();
385 Size const r2 = rni->upper_neighbor_id();
386 Size const jjresid = ( r1 == iiresid ? r2 : r1 );
387 bool const res_moving_wrt_eachother(
true );
391 if ( active_residue_has_been_visited[ jjresid ] )
continue;
395 lower_res, upper_res, *iter, mingraph, *scminmap, pose,
396 res_moving_wrt_eachother,
false, rni, dummy_emap );
404 Size next_restype_index( 2 );
406 Real best_score( 0.0 );
bool first_pass(
true );
407 #ifdef APL_FULL_DEBUG
408 Real best_real_score( 0.0 );
410 ResidueAtomTreeCollectionMomento momento;
411 scminmap->set_natoms_for_residue( iiresid, ii_atc->residue_atomtree_collection( iiresid ).active_residue().natoms() );
412 for (
Size jj = 1, jj_end = iirotset->num_rotamers(); jj <= jj_end; ++jj ) {
413 if (next_restype_index <= iirotset->get_n_residue_types() &&
414 iirotset->get_residue_type_begin( next_restype_index ) == jj ) {
415 ii_atc->residue_atomtree_collection( iiresid ).set_active_restype_index( next_restype_index );
416 ++next_restype_index;
418 ii_atc->residue_atomtree_collection( iiresid ).set_rescoords( * iirotset->rotamer( jj ));
419 ii_atc->residue_atomtree_collection( iiresid ).update_atom_tree();
420 scminmap->set_natoms_for_residue( iiresid, iirotset->rotamer( jj )->natoms() );
422 scminmap->setup( ii_atc );
425 ii_atc->residue_atomtree_collection( iiresid ).set_rescoords( * iirotset->rotamer( jj ));
426 ii_atc->residue_atomtree_collection( iiresid ).update_atom_tree();
428 scminmap->starting_dofs( chi );
432 #ifdef APL_FULL_DEBUG
433 pose.
replace_residue( iiresid, ii_atc->residue_atomtree_collection( iiresid ).active_residue(), false );
434 Real const real_start_score( scfxn( pose ) );
439 MultifuncOP scmin_multifunc = scminmap->make_multifunc( pose, bgres, scfxn, mingraph );
443 #ifdef APL_FULL_DEBUG
444 deriv_check_for_residue( iiresid, jj, *scmin_multifunc, chi );
448 Minimizer minimizer( *scmin_multifunc, min_options );
451 minimizer.run( chi );
454 Real const end_score = (*scmin_multifunc)( chi );
462 #ifdef APL_FULL_DEBUG
463 pose.
replace_residue( iiresid, ii_atc->residue_atomtree_collection( iiresid ).active_residue(), false );
464 Real const real_end_score( scfxn( pose ) );
466 deriv_check_for_residue( iiresid, jj, *scmin_multifunc, chi );
473 if ( first_pass || end_score <= best_score ) {
474 best_score = end_score;
475 #ifdef APL_FULL_DEBUG
476 best_real_score = real_end_score;
479 ii_atc->residue_atomtree_collection( iiresid ).save_momento( momento );
491 ii_atc->residue_atomtree_collection( iiresid ).update_from_momento( momento );
492 bgres[ iiresid ] =
new Residue( ii_atc->residue_atomtree_collection( iiresid ).active_residue() );
520 active_residue_has_been_visited[ iiresid ] =
true;
521 scminmap->clear_active_dofs();
524 #ifdef APL_FULL_DEBUG
525 for (
Size jj = 1; jj <= bgres[ iiresid ]->natoms(); ++jj ) {
528 Real const ii_final_score( scfxn( pose ) );
529 assert( std::abs( best_real_score - ii_final_score ) < 1e-13 );
690 rsd, scminmap, pose );
695 eiter != eiter_end; ++eiter ) {
696 Size iiresid = (*eiter)->get_other_ind( resid );
698 if ( resid <= iiresid ) {
720 to_be_packed[ count ] = ii;