13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
-
+
+
|
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*/
use super::msg::{ResultMsg, WorkerMsg};
use crate::problem::{
FirstOrderProblem, ResultSender, SubgradientExtender, UpdateSendError, UpdateSender, UpdateState,
FirstOrderProblem, ResultSender, SubgradientExtender, UpdateSendError, UpdateSender,
UpdateState,
};
use crate::{DVector, Minorant, Real};
use log::{error, info};
use mpi::environment::Universe;
use mpi::topology::{Communicator, SystemCommunicator};
use mpi::Rank;
|
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
|
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
|
-
-
+
+
+
+
+
+
|
let result_tx = result_tx.unwrap();
// wait for response
loop {
let msg = recv_msg(&client);
match msg {
ResultMsg::ObjectiveValue { value, .. } => result_tx.objective(value).unwrap(),
ResultMsg::Minorant { minorant, .. } => result_tx.minorant(minorant).unwrap(),
ResultMsg::ObjectiveValue { value, .. } => {
result_tx.objective(value).unwrap()
}
ResultMsg::Minorant { minorant, .. } => {
result_tx.minorant(minorant).unwrap()
}
ResultMsg::Done { .. } => break,
ResultMsg::Error { error, .. } => {
result_tx.error(Error::OracleError(error)).unwrap()
}
}
}
}
|
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
|
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
|
+
-
+
+
|
&self,
bounds: Vec<(Real, Real)>,
sgext: Box<dyn SubgradientExtender<P::Minorant, P::Err>>,
) -> Result<(), UpdateSendError> {
self.0.add_variables(
bounds,
Box::new(move |fidx: usize, m: &mut P::Minorant| {
sgext
sgext.extend_subgradient(fidx, m).map_err(Error::OracleError)
.extend_subgradient(fidx, m)
.map_err(Error::OracleError)
}),
)
}
fn error(&self, err: P::Err) -> Result<(), UpdateSendError> {
self.0.error(Error::OracleError(err))
}
}
|