172 {
173
174 std::default_random_engine generator;
175
176
177 Eigen::Vector3d f;
178 for (int i = 0; i < 3; ++i) {
180 }
181
182
183 int polynomialDimension = 4;
184 if (argc > 1) {
185 polynomialDimension = atoi(argv[1]);
186 }
187
188
189 Eigen::VectorXd p(polynomialDimension);
190 for (int i = 0; i < polynomialDimension; ++i) {
192 }
193
194 std::cout << "Ground truth vectors f=" << f.transpose()
195 << "; p=" << p.transpose() << std::endl;
196
197
198 int obs = 6;
199 if (argc > 2) {
200 obs = atoi(argv[2]);
201 }
202
203
204
205
206
207 double sigmaZ = 0.1;
208 std::vector<FunctionObservation> observations(obs);
209 std::uniform_int_distribution<int> cardinalitySampler(1, 5);
210
211 for (int i = 0; i < obs; ++i) {
213 int numObs = cardinalitySampler(generator);
216 for (int o = 0; o < numObs; ++o) {
218 double x3 =
pow(fo.
x[o], 3);
219 fo.
z[o] = Eigen::poly_eval(f, fo.
x[o]) +
220 x3 * (Eigen::poly_eval(p, fo.
x[o])) +
222 }
223 }
224
225
226 std::unique_ptr<g2o::BlockSolverX::LinearSolverType> linearSolver =
227 std::make_unique<
229
230
231 std::unique_ptr<g2o::BlockSolverX> blockSolver =
232 std::make_unique<g2o::BlockSolverX>(std::move(linearSolver));
233
234
237
238
239 std::unique_ptr<g2o::SparseOptimizer> optimizer =
240 std::make_unique<g2o::SparseOptimizer>();
241 optimizer->setVerbose(true);
242 optimizer->setAlgorithm(optimisationAlgorithm);
243
244
247 optimizer->addVertex(pf);
248
249
252 optimizer->addVertex(pv);
253
254
255 double omega = 1 / (sigmaZ * sigmaZ);
256
257
258 for (int i = 0; i < obs; ++i) {
262 optimizer->addEdge(mve);
263 }
264
265
266
267
268
269
270 for (int testDimension = 1; testDimension <= polynomialDimension;
271 ++testDimension) {
273 optimizer->initializeOptimization();
274 optimizer->optimize(10);
275 std::cout <<
"Computed parameters: f=" << pf->
estimate().transpose()
276 <<
"; p=" << pv->
estimate().transpose() << std::endl;
277 }
278 for (int testDimension = polynomialDimension - 1; testDimension >= 1;
279 --testDimension) {
281 optimizer->initializeOptimization();
282 optimizer->optimize(10);
283 std::cout <<
"Computed parameters: f= " << pf->
estimate().transpose()
284 <<
"; p=" << pv->
estimate().transpose() << std::endl;
285 }
286}
virtual bool setDimension(int newDimension)
const EstimateType & estimate() const
return the current estimate of the vertex
void setVertex(size_t i, Vertex *v)
linear solver which uses the sparse Cholesky solver from Eigen
virtual void setId(int id)
Implementation of the Levenberg Algorithm.
Generic interface for a non-linear solver operating on a graph.
Jet< T, N > pow(const Jet< T, N > &f, double g)
double sampleUniform(double min, double max, std::mt19937 *generator)
double sampleGaussian(std::mt19937 *generator)