// Implementation of virtual function that determines intersection double Triangle::firstIntersectionBetween(Ray ray, double &tMin, double &tMax) { // Setup computeDummyVariables(ray); double m = computeM(); // Compute 't' double t = computeT(m); if (t < tMin || t > tMax) return -1; // Compute gamma double gamma = computeGamma(m); if (gamma < 0.0 || gamma > 1.0) return -1; // Compute betta double betta = computeBetta(m); if (betta < 0.0 || (betta > (1 - gamma))) return -1; // Intersected, fill in intersection tMax = t; return t; }
double HMM::baumWelchCached(const arma::mat & data, const std::vector<GMM> & B, unsigned int seed = 0) { init(B, seed); allocateMemory(data.n_cols); cacheProbabilities(data); double logprobc = forwardProcedureCached(); double logprobprev = 0.0; double delta; do { backwardProcedureCached(); computeXiCached(); computeGamma(); logprobprev = logprobc; //update state probabilities pi pi_ = gamma_.col(0).t(); for (unsigned int i = 0; i < N_; ++i) { arma::rowvec xi_i = arma::sum(xi_.slice(i)); double shortscale = 1./arma::accu(gamma_.submat(arma::span(i),arma::span(0,T_-2))); for (unsigned int j = 0; j < N_; ++j) { A_(i,j) = xi_i(j) * shortscale; } // and update distributions unsigned int numComponents = (unsigned int) BModels_[i].getNumComponents(); arma::mat gamma_lt = arma::mat(T_, numComponents); gamma_lt = (gamma_.row(i).t()* arma::ones(1, numComponents))% gammaLts_[i]; for(unsigned int t = 0; t < T_ ; ++t) { double sumProb = B_(t,i); if (sumProb != 0.) { gamma_lt.row(t) /= sumProb; } } double scale = 1./arma::accu(gamma_.row(i)); for (unsigned int l = 0; l < numComponents; ++l) { double sumGammaLt = arma::accu(gamma_lt.col(l)); double newWeight = scale * sumGammaLt; arma::vec newMu = data * gamma_lt.col(l) / sumGammaLt; arma::mat tempMat = data- newMu * arma::ones(1,T_); unsigned int d = data.n_rows; arma::mat newSigma = arma::zeros(d, d); for (unsigned int t = 0; t < T_ ; ++t) { arma::vec diff = data.col(t) - newMu; newSigma += diff * diff.t() * gamma_lt(t, l)/ sumGammaLt; } try{ BModels_[i].updateGM(l, newWeight, newMu, newSigma); } catch( const std::runtime_error & e) { tempMat.print("tempMat"); gamma_lt.col(l).print("gamma_lt"); throw e; } } arma::uvec indices = BModels_[i].cleanupGMs(); gammaLts_[i] = gammaLts_[i].cols(indices); } cacheProbabilities(data); logprobc = forwardProcedureCached(); std::cout << logprobc << " " << logprobprev << std::endl; delta = logprobc - logprobprev; } while (delta >= eps_ * std::abs(logprobprev)); return logprobc; }