MUQ  0.4.3
SeparableKarhunenLoeve.cpp
Go to the documentation of this file.
2 
4 
5 using namespace muq::Approximation;
6 using namespace muq::Utilities;
7 
8 SeparableKarhunenLoeve::SeparableKarhunenLoeve(std::vector<std::shared_ptr<KernelBase>> kernels,
9  std::vector<Eigen::MatrixXd> const& seedPts,
10  std::vector<Eigen::VectorXd> const& seedWts,
11  boost::property_tree::ptree options)
12 {
13 
14  const unsigned int numComps = kernels.size();
15 
16  // Check sizes of things
17  assert(numComps == seedPts.size());
18  assert(seedPts.size() == seedWts.size());
19 
20  const unsigned int inputDim = kernels.at(0).inputDim;
21 
22  for(int i=1; i<kernels.size(); ++i)
23  assert(kernels.at(i).inputDim == inputDim);
24 
25  // Build a KL decomposition for each separable component
26  components.resize(numComps);
27 
28  numModes = 1;
29 
30  Eigen::RowVectorXi allNumModes(numComps);
31 
32  for(int i=0; i<numComps; ++i){
33  Eigen::MatrixXd newPts = Eigen::MatrixXd::Zero(inputDim, seedPts.at(i).cols());
34 
35  for(int j=0; j<kernels.at(i).dimInds.size(); ++j)
36  newPts.row(kernels.at(i).dimInds.at(j)) = seedPts.at(i).row(j);
37 
38  components.at(i) = std::make_shared<KarhuneLoeveExpansion>(kernels.at(i), newPts, seedWts.at(i), options);
39 
40  allNumModes(i) = components.at(i)->NumModes();
41  numModes *= components.at(i)->NumModes();
42  }
43 
44  modeInds = MultiIndexFactoryCreateFullTensor(allNumModes);
45 
46 }
47 
49 {
50  return numModes;
51 }
52 
53 Eigen::MatrixXd SeparableKarhunenLoeve::GetModes(Eigen::Ref<const Eigen::MatrixXd> const& pts)
54 {
55  std::vector<Eigen::MatrixXd> allModes(components.size());
56  for(int i=0; i<components.size(); ++i)
57  allModes.at(i) = components.at(i)->GetModes(pts);
58 
59  Eigen::MatrixXd output = Eigen::MatrixXd::Ones(pts.cols(), numModes);
60 
61  for(int i=0; i<modeInds->Size(); ++i){
62  for(auto nzIt = modeInds->at(i)->GetNzBegin(); nzIt != modeInds->at(i)->GetNzEnd(); ++nzIt){
63  output.col(i) *= allModes.at(nzIt->first).col(nzIt->second);
64  }
65  }
66 
67  return output;
68 }
virtual unsigned int NumModes() const override
virtual Eigen::MatrixXd GetModes(Eigen::Ref< const Eigen::MatrixXd > const &pts) const override
SeparableKarhunenLoeve(std::vector< std::shared_ptr< KernelBase >> kernelsIn, std::vector< Eigen::MatrixXd > const &seedPtsIn, std::vector< Eigen::VectorXd > const &seedWtsIn, boost::property_tree::ptree options=boost::property_tree::ptree())