00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "Parallel.h"
00020
00021
00022 using std::ostringstream;
00023 using std::vector;
00024
00025 using namespace Marsyas;
00026
00027 Parallel::Parallel(mrs_string name):MarSystem("Parallel",name)
00028 {
00029 isComposite_ = true;
00030 }
00031
00032 Parallel::~Parallel()
00033 {
00034 deleteSlices();
00035 }
00036
00037 void Parallel::deleteSlices()
00038 {
00039 vector<realvec *>::const_iterator iter;
00040 for (iter = slices_.begin(); iter != slices_.end(); iter++) {
00041 delete *(iter);
00042 }
00043 slices_.clear();
00044 }
00045
00046 MarSystem* Parallel::clone() const
00047 {
00048 return new Parallel(*this);
00049 }
00050
00051 void Parallel::myUpdate(MarControlPtr sender)
00052 {
00053 if (marsystemsSize_ != 0)
00054 {
00055 mrs_natural highestStabilizingDelay = ctrl_inStabilizingDelay_->to<mrs_natural>();
00056
00057 marsystems_[0]->setctrl("mrs_natural/inSamples", inSamples_);
00058 marsystems_[0]->setctrl("mrs_real/israte", israte_);
00059 marsystems_[0]->setctrl("mrs_natural/inStabilizingDelay", inStabilizingDelay_);
00060
00061 mrs_string inObsName;
00062 mrs_string temp;
00063 mrs_string inObsNames = ctrl_inObsNames_->to<mrs_string>();
00064
00065 inObsName = inObsNames.substr(0, inObsNames.find(","));
00066 temp = inObsNames.substr(inObsNames.find(",")+1, inObsNames.length());
00067 inObsNames = temp;
00068 marsystems_[0]->setctrl("mrs_string/inObsNames", inObsName + ",");
00069 marsystems_[0]->update();
00070
00071 mrs_natural inObservations = marsystems_[0]->getctrl("mrs_natural/inObservations")->to<mrs_natural>();
00072 mrs_natural onObservations = marsystems_[0]->getctrl("mrs_natural/onObservations")->to<mrs_natural>();
00073 mrs_natural localStabilizingDelay = marsystems_[0]->getctrl("mrs_natural/onStabilizingDelay")->to<mrs_natural>();
00074 if (highestStabilizingDelay < localStabilizingDelay)
00075 highestStabilizingDelay = localStabilizingDelay;
00076
00077 ostringstream oss;
00078 oss << marsystems_[0]->getctrl("mrs_string/onObsNames");
00079
00080 for (mrs_natural i=1; i < marsystemsSize_; ++i)
00081 {
00082 marsystems_[i]->setctrl("mrs_natural/inSamples", marsystems_[0]->getctrl("mrs_natural/inSamples"));
00083 marsystems_[i]->setctrl("mrs_real/israte", marsystems_[0]->getctrl("mrs_real/israte"));
00084 marsystems_[i]->setctrl("mrs_natural/inStabilizingDelay", inStabilizingDelay_);
00085
00086
00087 inObsName = inObsNames.substr(0, inObsNames.find(","));
00088 temp = inObsNames.substr(inObsNames.find(",")+1, inObsNames.length());
00089 inObsNames = temp;
00090 marsystems_[i]->setctrl("mrs_string/inObsNames", inObsName + ",");
00091
00092 marsystems_[i]->update();
00093 oss << marsystems_[i]->getctrl("mrs_string/onObsNames");
00094
00095 inObservations += marsystems_[i]->getctrl("mrs_natural/inObservations")->to<mrs_natural>();
00096 onObservations += marsystems_[i]->getctrl("mrs_natural/onObservations")->to<mrs_natural>();
00097 localStabilizingDelay = marsystems_[0]->getctrl("mrs_natural/onStabilizingDelay")->to<mrs_natural>();
00098 if (highestStabilizingDelay < localStabilizingDelay)
00099 highestStabilizingDelay = localStabilizingDelay;
00100 }
00101
00102
00103 setctrl(ctrl_onSamples_, marsystems_[0]->getctrl("mrs_natural/onSamples"));
00104 setctrl(ctrl_onObservations_, onObservations);
00105 setctrl(ctrl_osrate_, marsystems_[0]->getctrl("mrs_real/osrate"));
00106 setctrl(ctrl_onObsNames_, oss.str());
00107 setctrl(ctrl_onStabilizingDelay_, highestStabilizingDelay);
00108
00109
00110 if((mrs_natural)slices_.size() < 2*marsystemsSize_)
00111 {
00112 slices_.resize(2*marsystemsSize_, NULL);
00113 }
00114
00115 for (mrs_natural i = 0; i < marsystemsSize_; ++i)
00116 {
00117 if (slices_[2*i] != NULL)
00118 {
00119 if ((slices_[2*i])->getRows() != marsystems_[i]->getctrl("mrs_natural/inObservations")->to<mrs_natural>() ||
00120 (slices_[2*i])->getCols() != marsystems_[i]->getctrl("mrs_natural/inSamples")->to<mrs_natural>())
00121 {
00122 delete slices_[2*i];
00123 slices_[2*i] = new realvec(marsystems_[i]->getctrl("mrs_natural/inObservations")->to<mrs_natural>(),
00124 marsystems_[i]->getctrl("mrs_natural/inSamples")->to<mrs_natural>());
00125 }
00126 }
00127 else
00128 slices_[2*i] = new realvec(marsystems_[i]->getctrl("mrs_natural/inObservations")->to<mrs_natural>(),
00129 marsystems_[i]->getctrl("mrs_natural/inSamples")->to<mrs_natural>());
00130
00131 (slices_[2*i])->setval(0.0);
00132
00133 if (slices_[2*i+1] != NULL)
00134 {
00135 if ((slices_[2*i+1])->getRows() != marsystems_[i]->getctrl("mrs_natural/onObservations")->to<mrs_natural>() ||
00136 (slices_[2*i+1])->getCols() != marsystems_[i]->getctrl("mrs_natural/onSamples")->to<mrs_natural>())
00137 {
00138 delete slices_[2*i+1];
00139 slices_[2*i+1] = new realvec(marsystems_[i]->getctrl("mrs_natural/onObservations")->to<mrs_natural>(),
00140 marsystems_[i]->getctrl("mrs_natural/onSamples")->to<mrs_natural>());
00141 }
00142 }
00143 else
00144 slices_[2*i+1] = new realvec(marsystems_[i]->getctrl("mrs_natural/onObservations")->to<mrs_natural>(),
00145 marsystems_[i]->getctrl("mrs_natural/onSamples")->to<mrs_natural>());
00146
00147 (slices_[2*i+1])->setval(0.0);
00148 }
00149 }
00150 else
00151 MarSystem::myUpdate(sender);
00152 }
00153
00154 void Parallel::myProcess(realvec& in, realvec& out)
00155 {
00156 mrs_natural t,o;
00157 mrs_natural inIndex = 0;
00158 mrs_natural outIndex = 0;
00159 mrs_natural localIndex = 0;
00160
00161 if (marsystemsSize_ == 1)
00162 {
00163 marsystems_[0]->process(in, out);
00164 }
00165 else if (marsystemsSize_ > 1)
00166 {
00167 for (mrs_natural i = 0; i < marsystemsSize_; ++i)
00168 {
00169 localIndex = marsystems_[i]->getctrl("mrs_natural/inObservations")->to<mrs_natural>();
00170 for (o = 0; o < localIndex; o++)
00171 {
00172
00173 if ((inIndex + o) < in.getRows()) {
00174 for (t = 0; t < inSamples_; t++)
00175 {
00176 (*(slices_[2*i]))(o,t) = in(inIndex + o,t);
00177 }
00178 } else {
00179 for (t = 0; t < inSamples_; t++) {
00180 (*(slices_[2*i]))(o,t) = 0;
00181 }
00182 }
00183 }
00184 inIndex += localIndex;
00185 marsystems_[i]->process(*(slices_[2*i]), *(slices_[2*i+1]));
00186 localIndex = marsystems_[i]->getctrl("mrs_natural/onObservations")->to<mrs_natural>();
00187 for (o = 0; o < localIndex; o++)
00188 {
00189 for (t = 0; t < onSamples_; t++)
00190 {
00191 out(outIndex + o,t) = (*(slices_[2*i+1]))(o,t);
00192 }
00193 }
00194 outIndex += localIndex;
00195 }
00196 }
00197 else if(marsystemsSize_ == 0)
00198 {
00199 MRSWARN("Parallel::process: composite has no children MarSystems - passing input to output without changes.");
00200 out = in;
00201 }
00202 }