66#include < pybind11/stl.h>
77
88#include < Eigen/Dense>
9+ #include < QApplication>
910#include < QImage>
1011
1112namespace py = pybind11;
@@ -22,46 +23,22 @@ ShapeScalarJob::ShapeScalarJob(QSharedPointer<Session> session, QString target_f
2223
2324// ---------------------------------------------------------------------------
2425void ShapeScalarJob::run () {
25- SW_DEBUG (" Running shape scalar job" );
26+ // SW_DEBUG("Running shape scalar job");
2627
2728 try {
28- prep_data ();
29-
3029 py::module np = py::module::import (" numpy" );
31- py::object A = np.attr (" array" )(all_particles_);
32- py::object B = np.attr (" array" )(all_scalars_);
3330
3431 py::module sw = py::module::import (" shapeworks" );
3532
3633 if (job_type_ == JobType::MSE_Plot) {
37- // returns a tuple of (png_raw_bytes, y_pred, mse)
38- using ResultType = std::tuple<py::array, Eigen::MatrixXd, double >;
39-
40- py::object run_mbpls = sw.attr (" shape_scalars" ).attr (" run_mbpls" );
41- ResultType result = run_mbpls (A, B, num_components_, num_folds_).cast <ResultType>();
42-
43- py::array png_raw_bytes = std::get<0 >(result);
44- Eigen::MatrixXd y_pred = std::get<1 >(result);
45- double mse = std::get<2 >(result);
46-
47- // interpret png_raw_bytes as a QImage
48- QImage image;
49- image.loadFromData ((const uchar*)png_raw_bytes.data (), png_raw_bytes.size (), " PNG" );
50- plot_ = QPixmap::fromImage (image);
51-
52- SW_LOG (" mse = {}" , mse);
53-
34+ run_fit ();
5435 } else if (job_type_ == JobType::Predict) {
55- py::object new_x = np.attr (" array" )(target_particles_.transpose ());
56- py::object run_prediction = sw.attr (" shape_scalars" ).attr (" pred_from_mbpls" );
57-
58- using ResultType = Eigen::VectorXd;
59- ResultType result = run_prediction (A, B, new_x).cast <ResultType>();
60-
61- auto y_pred = result;
62-
63- prediction_ = y_pred;
36+ run_prediction ();
6437 } else if (job_type_ == JobType::Find_Components) {
38+ prep_data ();
39+ py::object A = np.attr (" array" )(all_particles_);
40+ py::object B = np.attr (" array" )(all_scalars_);
41+
6542 // returns a tuple of (png_raw_bytes, y_pred, mse)
6643 using ResultType = py::array;
6744
@@ -75,7 +52,7 @@ void ShapeScalarJob::run() {
7552 image.loadFromData ((const uchar*)png_raw_bytes.data (), png_raw_bytes.size (), " PNG" );
7653 plot_ = QPixmap::fromImage (image);
7754 }
78- SW_DEBUG (" End shape scalar job" );
55+ // SW_DEBUG("End shape scalar job");
7956
8057 } catch (const std::exception& e) {
8158 SW_ERROR (" Exception in shape scalar job: {}" , e.what ());
@@ -94,6 +71,7 @@ Eigen::VectorXd ShapeScalarJob::predict_scalars(QSharedPointer<Session> session,
9471 // blocking call to predict scalars for given target particles
9572
9673 auto job = QSharedPointer<ShapeScalarJob>::create (session, target_feature, target_particles, JobType::Predict);
74+ job->set_quiet_mode (true );
9775
9876 Eigen::VectorXd prediction;
9977
@@ -106,8 +84,9 @@ Eigen::VectorXd ShapeScalarJob::predict_scalars(QSharedPointer<Session> session,
10684
10785 session->get_py_worker ()->run_job (job);
10886
87+ // wait for job to finish without using sleep
10988 while (!finished) {
110- QThread::msleep ( 100 );
89+ QApplication::processEvents ( );
11190 }
11291
11392 return prediction;
@@ -119,5 +98,55 @@ void ShapeScalarJob::prep_data() {
11998 all_scalars_ = session_->get_all_scalars (target_feature_.toStdString ());
12099}
121100
101+ // ---------------------------------------------------------------------------
102+ void ShapeScalarJob::run_fit () {
103+ prep_data ();
104+ py::module np = py::module::import (" numpy" );
105+ py::module sw = py::module::import (" shapeworks" );
106+
107+ py::object A = np.attr (" array" )(all_particles_);
108+ py::object B = np.attr (" array" )(all_scalars_);
109+
110+ // returns a tuple of (png_raw_bytes, y_pred, mse)
111+ using ResultType = std::tuple<py::array, Eigen::MatrixXd, double >;
112+
113+ py::object run_mbpls = sw.attr (" shape_scalars" ).attr (" run_mbpls" );
114+ ResultType result = run_mbpls (A, B, num_components_, num_folds_).cast <ResultType>();
115+
116+ py::array png_raw_bytes = std::get<0 >(result);
117+ Eigen::MatrixXd y_pred = std::get<1 >(result);
118+ double mse = std::get<2 >(result);
119+
120+ // interpret png_raw_bytes as a QImage
121+ QImage image;
122+ image.loadFromData ((const uchar*)png_raw_bytes.data (), png_raw_bytes.size (), " PNG" );
123+ plot_ = QPixmap::fromImage (image);
124+
125+ SW_LOG (" mse = {}" , mse);
126+ }
127+
128+ // ---------------------------------------------------------------------------
129+ void ShapeScalarJob::run_prediction () {
130+ py::module np = py::module::import (" numpy" );
131+ py::module sw = py::module::import (" shapeworks" );
132+
133+ py::object does_mbpls_model_exist = sw.attr (" shape_scalars" ).attr (" does_mbpls_model_exist" );
134+ if (!does_mbpls_model_exist ().cast <bool >()) {
135+ SW_LOG (" No MBPLS model exists, running fit" );
136+ run_fit ();
137+ }
138+
139+ py::object new_x = np.attr (" array" )(target_particles_.transpose ());
140+ py::object run_prediction = sw.attr (" shape_scalars" ).attr (" pred_from_mbpls" );
141+
142+ using ResultType = Eigen::VectorXd;
143+
144+ ResultType result = run_prediction (new_x).cast <ResultType>();
145+
146+ auto y_pred = result;
147+
148+ prediction_ = y_pred;
149+ }
150+
122151// ---------------------------------------------------------------------------
123152} // namespace shapeworks
0 commit comments