Actual source code: ex1.c
1: static char help[] = "test least-squares problem created from a mapped taoterm quadratic";
3: #include <petsctao.h>
5: int main(int argc, char **argv)
6: {
7: MPI_Comm comm;
8: Mat A; // data matrix
9: Mat W; // weight matrix
10: Vec w; // observation vector
11: Vec b; // observation vector
12: PetscInt m = 100; // data size
13: PetscInt n = 20; // model size
14: TaoTerm data_term;
15: PetscRandom rand;
16: Tao tao;
17: PetscReal val, density = 0.3;
18: PetscBool test_quad_mat = PETSC_FALSE;
20: PetscFunctionBeginUser;
21: PetscCall(PetscInitialize(&argc, &argv, NULL, help));
22: comm = PETSC_COMM_WORLD;
24: PetscOptionsBegin(comm, "", help, "none");
25: PetscCall(PetscOptionsBoundedInt("-m", "data size", "", m, &m, NULL, 0));
26: PetscCall(PetscOptionsBoundedInt("-n", "model size", "", n, &n, NULL, 0));
27: PetscCall(PetscOptionsBool("-test_quad_mat", "Test if quadratic term matrix matches W matrix", "", test_quad_mat, &test_quad_mat, NULL));
28: PetscOptionsEnd();
30: PetscCall(TaoCreate(comm, &tao));
32: PetscCall(PetscRandomCreate(comm, &rand));
33: PetscCall(PetscRandomSetInterval(rand, -1.0, 1.0));
34: PetscCall(PetscRandomSetFromOptions(rand));
36: // create the model data, A, W and b
37: PetscCall(MatCreate(comm, &A));
38: PetscCall(MatSetSizes(A, PETSC_DECIDE, PETSC_DECIDE, m, n));
39: PetscCall(MatSetType(A, MATAIJ));
40: PetscCall(MatSetFromOptions(A));
41: PetscCall(MatSetUp(A));
42: for (PetscInt i = 0; i < m; i++) {
43: for (PetscInt j = 0; j < n; j++) {
44: PetscCall(PetscRandomGetValueReal(rand, &val));
45: // Optionally make it sparse: only insert some entries
46: if (val < density) PetscCall(MatSetValue(A, i, j, val, INSERT_VALUES));
47: }
48: }
49: PetscCall(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY));
50: PetscCall(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY));
51: PetscCall(VecCreateMPI(comm, PETSC_DECIDE, m, &b));
52: PetscCall(VecSetRandom(b, rand));
53: PetscCall(VecDuplicate(b, &w));
54: PetscCall(VecSetRandom(w, rand));
55: PetscCall(VecAbs(w));
56: PetscCall(VecShift(w, 1.0));
57: PetscCall(MatCreateDiagonal(w, &W));
58: PetscCall(VecDestroy(&w));
60: // the model term, (1/2) || Ax - b ||_W^2
61: PetscCall(TaoTermCreateQuadratic(W, &data_term));
62: PetscCall(PetscObjectSetOptionsPrefix((PetscObject)data_term, "data_"));
63: PetscCall(TaoAddTerm(tao, "data_", 3.0, data_term, b, A));
64: PetscCall(TaoTermDestroy(&data_term));
66: PetscCall(TaoSetFromOptions(tao));
67: PetscCall(TaoSolve(tao));
69: if (test_quad_mat) {
70: PetscReal scale;
71: TaoTerm term;
72: Vec params;
73: Mat map;
74: Mat quad_mat;
75: TaoTermType term_type;
76: PetscBool is_quad, mat_equal;
78: PetscCall(TaoGetTerm(tao, &scale, &term, ¶ms, &map));
79: PetscCall(TaoTermGetType(term, &term_type));
80: PetscCall(PetscStrcmp(term_type, TAOTERMQUADRATIC, &is_quad));
81: PetscCheck(is_quad, comm, PETSC_ERR_ARG_WRONG, "Term from TaoGetTerm is not a quadratic term");
83: PetscCall(TaoTermQuadraticGetMat(term, &quad_mat));
84: PetscCheck(quad_mat != NULL, comm, PETSC_ERR_ARG_NULL, "Quadratic term matrix is NULL");
86: PetscCall(MatEqual(W, quad_mat, &mat_equal));
87: PetscCheck(mat_equal, comm, PETSC_ERR_PLIB, "Quadratic term matrix does not match W matrix");
88: PetscCall(PetscPrintf(comm, "Test passed: Quadratic term matrix matches W matrix\n"));
89: }
91: PetscCall(VecDestroy(&b));
92: PetscCall(MatDestroy(&W));
93: PetscCall(MatDestroy(&A));
94: PetscCall(PetscRandomDestroy(&rand));
95: PetscCall(TaoDestroy(&tao));
96: PetscCall(PetscFinalize());
97: return 0;
98: }
100: /*TEST
102: build:
103: requires: !complex !single !quad !defined(PETSC_USE_64BIT_INDICES) !__float128
105: test:
106: suffix: 0
107: args: -tao_monitor -tao_view -tao_type nls
109: test:
110: suffix: 1
111: args: -tao_view ::ascii_info_detail -tao_type nls
113: test:
114: suffix: test_quad_mat
115: args: -test_quad_mat 1
117: TEST*/