void TripletHelper::PutValuesInVector(Index dim, const Number* values, Vector& vector) { DBG_ASSERT(dim == vector.Dim()); DenseVector* dv = dynamic_cast<DenseVector*>(&vector); if (dv) { Number* dv_vals = dv->Values(); IpBlasDcopy(dim, values, 1, dv_vals, 1); return; } CompoundVector* cv = dynamic_cast<CompoundVector*>(&vector); if (cv) { Index ncomps = cv->NComps(); Index total_dim = 0; for (Index i=0; i<ncomps; i++) { SmartPtr<Vector> comp = cv->GetCompNonConst(i); Index comp_dim = comp->Dim(); PutValuesInVector(comp_dim, values, *comp); values += comp_dim; total_dim += comp_dim; } DBG_ASSERT(total_dim == dim); return; } THROW_EXCEPTION(UNKNOWN_VECTOR_TYPE,"Unknown vector type passed to TripletHelper::PutValuesInVector"); }
bool DenseGenMatrix::ComputeEigenVectors(const DenseSymMatrix& M, DenseVector& Evalues) { Index dim = M.Dim(); DBG_ASSERT(Evalues.Dim()==dim); DBG_ASSERT(NRows()==dim); DBG_ASSERT(NCols()==dim); // First we copy the content of the matrix into Q const Number* Mvalues = M.Values(); for (Index j=0; j<dim; j++) { for (Index i=j; i<dim; i++) { values_[i+j*dim] = Mvalues[i+j*dim]; } } bool compute_eigenvectors = true; Number* Evals = Evalues.Values(); Index info; IpLapackDsyev(compute_eigenvectors, dim, values_, dim, Evals, info); initialized_ = (info==0); ObjectChanged(); return (info==0); }
void DenseGenMatrix::CholeskySolveVector(DenseVector& b) const { DBG_ASSERT(NRows()==NCols()); DBG_ASSERT(b.Dim()==NRows()); DBG_ASSERT(initialized_); Number* bvalues = b.Values(); IpLapackDpotrs(NRows(), 1, values_, NRows(), bvalues, b.Dim()); }
void DenseGenMatrix::LUSolveVector(DenseVector& b) const { DBG_ASSERT(NRows()==NCols()); DBG_ASSERT(b.Dim()==NRows()); DBG_ASSERT(initialized_); DBG_ASSERT(factorization_==LU); Number* bvalues = b.Values(); IpLapackDgetrs(NRows(), 1, values_, NRows(), pivot_, bvalues, b.Dim()); }
void DenseGenMatrix::ScaleColumns(const DenseVector& scal_vec) { DBG_ASSERT(scal_vec.Dim() == NCols()); DBG_ASSERT(initialized_); const Number* scal_values = scal_vec.Values(); for (Index j=0; j<NCols(); j++) { IpBlasDscal(NRows(), scal_values[j], &values_[j*NRows()], 1); } ObjectChanged(); }
void DenseSymMatrix::SpecialAddForLMSR1(const DenseVector& D, const DenseGenMatrix& L) { const Index dim = Dim(); DBG_ASSERT(initialized_); DBG_ASSERT(dim==D.Dim()); DBG_ASSERT(dim==L.NRows()); DBG_ASSERT(dim==L.NCols()); // First add the diagonal matrix const Number* Dvalues = D.Values(); for (Index i=0; i<dim; i++) { values_[i+i*dim] += Dvalues[i]; } // Now add the strictly-lower triagular matrix L and its transpose const Number* Lvalues = L.Values(); for (Index j=0; j<dim; j++) { for (Index i=j+1; i<dim; i++) { values_[i+j*dim] += Lvalues[i+j*dim]; } } ObjectChanged(); }