RsBundle  Diff

Differences From Artifact [f8cb59bbe4]:

  • File src/solver/sync.rs — part of check-in [cbf2625b3e] at 2019-08-09 07:32:44 on branch trunk — MasterProcess returns always a `masterprocess::Error` error (user: fifr size: 30021)

To Artifact [a87cba77d7]:

  • File src/solver/sync.rs — part of check-in [423a236c32] at 2019-11-18 07:39:17 on branch trunk — sync: automatic error conversion for `RecvError` (user: fifr size: 30048)

13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see  <http://www.gnu.org/licenses/>
 */

//! An asynchronous parallel bundle solver.

use crossbeam::channel::{select, unbounded as channel, Receiver, Sender};
use log::{debug, info};
use num_cpus;
use num_traits::Float;
use std::sync::Arc;
use std::time::Instant;
use threadpool::ThreadPool;








|







13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see  <http://www.gnu.org/licenses/>
 */

//! An asynchronous parallel bundle solver.

use crossbeam::channel::{select, unbounded as channel, Receiver, RecvError, Sender};
use log::{debug, info};
use num_cpus;
use num_traits::Float;
use std::sync::Arc;
use std::time::Instant;
use threadpool::ThreadPool;

120
121
122
123
124
125
126






127
128
129
130
131
132
133
where
    MErr: std::error::Error + 'static,
{
    fn from(err: masterprocess::Error<MErr>) -> Error<E> {
        Error::Master(err.into())
    }
}







type ClientSender<P> =
    Sender<std::result::Result<EvalResult<usize, <P as FirstOrderProblem>::Primal>, <P as FirstOrderProblem>::Err>>;

type ClientReceiver<P> =
    Receiver<std::result::Result<EvalResult<usize, <P as FirstOrderProblem>::Primal>, <P as FirstOrderProblem>::Err>>;








>
>
>
>
>
>







120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
where
    MErr: std::error::Error + 'static,
{
    fn from(err: masterprocess::Error<MErr>) -> Error<E> {
        Error::Master(err.into())
    }
}

impl<E> From<RecvError> for Error<E> {
    fn from(err: RecvError) -> Error<E> {
        Error::Process(err.into())
    }
}

type ClientSender<P> =
    Sender<std::result::Result<EvalResult<usize, <P as FirstOrderProblem>::Primal>, <P as FirstOrderProblem>::Err>>;

type ClientReceiver<P> =
    Receiver<std::result::Result<EvalResult<usize, <P as FirstOrderProblem>::Primal>, <P as FirstOrderProblem>::Err>>;

583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602

603
604
605
606
607
608
609
        debug!("Start solving up to {} iterations", niter);

        let mut itdata = IterData::new(self.problem.num_subproblems(), self.problem.num_variables(), niter);

        loop {
            select! {
                recv(self.client_rx.as_ref().ok_or(Error::NotInitialized)?) -> msg => {
                    let msg = msg
                        .map_err(|err| Error::Process(err.into()))?
                        .map_err(Error::Evaluation)?;

                    if self.handle_client_response(msg, &mut itdata)? {
                        return Ok(false);
                    }
                },
                recv(self.master_proc.as_ref().ok_or(Error::NotInitialized)?.rx) -> msg => {
                    debug!("Receive master response");
                    // Receive result (new candidate) from the master
                    let master_res = msg
                        .map_err(|err| Error::Process(err.into()))?

                        .map_err(|err| Error::Master(err.into()))?;

                    if self.handle_master_response(master_res, &mut itdata)? {
                        return Ok(true);
                    }
                },
            }







|
<










<
>







589
590
591
592
593
594
595
596

597
598
599
600
601
602
603
604
605
606

607
608
609
610
611
612
613
614
        debug!("Start solving up to {} iterations", niter);

        let mut itdata = IterData::new(self.problem.num_subproblems(), self.problem.num_variables(), niter);

        loop {
            select! {
                recv(self.client_rx.as_ref().ok_or(Error::NotInitialized)?) -> msg => {
                    let msg = msg?

                        .map_err(Error::Evaluation)?;

                    if self.handle_client_response(msg, &mut itdata)? {
                        return Ok(false);
                    }
                },
                recv(self.master_proc.as_ref().ok_or(Error::NotInitialized)?.rx) -> msg => {
                    debug!("Receive master response");
                    // Receive result (new candidate) from the master
                    let master_res = msg

                        ?
                        .map_err(|err| Error::Master(err.into()))?;

                    if self.handle_master_response(master_res, &mut itdata)? {
                        return Ok(true);
                    }
                },
            }