25 #include <ObjexxFCL/format.hh>
29 #include <utility/vector1.functions.hh>
37 #include <basic/Tracer.hh>
39 #include <utility/vector1.hh>
44 static basic::Tracer
TR(
"protocols.optimize_weights.OptEData");
47 using namespace scoring;
48 using namespace ObjexxFCL::fmt;
51 namespace optimize_weights {
54 PNatLigPoseOptEData::PNatLigPoseOptEData():
73 Size const num_energy_dofs,
82 using namespace core::optimization;
83 using namespace utility;
93 for (
Size ii = 1; ii <= num_energy_dofs; ++ii ) {
95 native_energies[ jj ] += vars[ ii ] *
natives_[ jj ]->free_data()[ ii ];
98 decoy_energies[ jj ] += vars[ ii ] *
decoys_[ jj ]->free_data()[ ii ];
101 for (
Size ii = 1; ii <= fixed_score_list.size(); ++ii ) {
103 native_energies[ jj ] += fixed_terms[ fixed_score_list[ ii ] ] *
natives_[ jj ]->fixed_data()[ ii ];
106 decoy_energies[ jj ] += fixed_terms[ fixed_score_list[ ii ] ] *
decoys_[ jj ]->fixed_data()[ ii ];
110 Real const best_native_energy = min( native_energies );
111 Real const best_decoy_energy = min( decoy_energies );
113 Real const best_energy = best_native_energy < best_decoy_energy ? best_native_energy : best_decoy_energy;
115 native_energies[ ii ] -= best_energy;
118 decoy_energies[ ii ] -= best_energy;
121 Real numerator(0.0), partition(0.0);
122 Multivec dpartition( vars.size(), 0.0 ), dnumerator( vars.size(), 0.0 );
124 Real const neginv_kT = (-1.0 /
kT_);
130 Real const exp_term = std::max( 1e-6, std::exp( neginv_kT * native_energies[ ii ] ) );
132 numerator += exp_term;
133 partition += exp_term;
135 for(
Size e_dof(1); e_dof <= num_energy_dofs; ++e_dof ) {
137 Real e_dof_deriv( neginv_kT *
natives_[ ii ]->free_data()[ e_dof ] * exp_term );
139 dnumerator[ e_dof ] += e_dof_deriv;
140 dpartition[ e_dof ] += e_dof_deriv;
146 Real const exp_term( std::exp( neginv_kT * decoy_energies[ ii ] ) );
148 partition += exp_term;
151 for(
Size e_dof(1); e_dof <= num_energy_dofs; ++e_dof ) {
153 Real e_dof_deriv( neginv_kT *
decoys_[ ii ]->free_data()[ e_dof ] * exp_term );
155 dpartition[ e_dof ] += e_dof_deriv;
169 for (
Size dof(1); dof <= num_energy_dofs; ++dof ) {
170 Real const dP_P = dpartition[ dof ] / partition;
171 Real const dN_N = dnumerator[ dof ] / numerator;
176 if( std::isinf(dE_dvar) || std::isnan(dE_dvar) ) std::cout <<
"[" <<
tag() <<
"," << dof <<
"] final deriv = " << dE_dvar <<
"; " << dpartition[ dof ] <<
"/" << partition <<
" - " << dnumerator[ dof ] <<
"/" << numerator << std::endl;
177 else dE_dvars[ dof ] += component_weights[
type() ] * dE_dvar;
184 ostr <<
"PNatLigPose " <<
tag() <<
X(1)
185 <<
" num: " << F(7,3,numerator) <<
" part: " << F(7,3,partition)
186 <<
" p: " << F(7,5,numerator / partition)
187 <<
" -lnp: " << F(6,4,-1.0 * std::log( numerator / partition ))
188 <<
" -compwt_lnp: " << F(6, 4, component_weights[
type() ] * (-1.0 * std::log( numerator / partition )) ) << std::endl;