1 static char help[] = "Tests basic creation and destruction of PetscRegressor objects.\n\n";
2
3 /*
4 Uses PetscRegressor to train a linear model (that is, linear in its coefficients)
5 for a quadratic polynomial data-fitting problem. This is example 3.2 in the first (1996) edition of Michael
6 T. Heath's "Scientific Computing: An Introductory Survey" textbook.
7 This example and ex2.c are essentially the same, except the input arrays are mean-centered in ex1.c
8 and are not in ex2.c. (The data in ex2.c correspond to the data as presented in Heath's example.)
9 */
10
11 #include <petscregressor.h>
12
main(int argc,char ** args)13 int main(int argc, char **args)
14 {
15 PetscRegressor regressor;
16 PetscMPIInt rank;
17 Mat X;
18 Vec y, y_predicted, coefficients;
19 PetscScalar intercept;
20 /* y_array[] and X_array[] are mean-centered; in ex2.c they are not! */
21 PetscScalar y_array[5] = {0.20000, -0.30000, -0.80000, -0.30000, 1.20000};
22 PetscScalar X_array[10] = {-1.00000, 0.50000, -0.50000, -0.25000, 0.00000, -0.50000, 0.50000, -0.25000, 1.00000, 0.50000};
23 PetscInt rows_ix[5] = {0, 1, 2, 3, 4};
24 PetscInt cols_ix[2] = {0, 1};
25
26 PetscCall(PetscInitialize(&argc, &args, (char *)0, help));
27 PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
28
29 PetscCall(VecCreate(PETSC_COMM_WORLD, &y));
30 PetscCall(VecSetSizes(y, PETSC_DECIDE, 5));
31 PetscCall(VecSetFromOptions(y));
32 PetscCall(VecDuplicate(y, &y_predicted));
33 PetscCall(MatCreate(PETSC_COMM_WORLD, &X));
34 PetscCall(MatSetSizes(X, PETSC_DECIDE, PETSC_DECIDE, 5, 2));
35 PetscCall(MatSetFromOptions(X));
36 PetscCall(MatSetUp(X));
37
38 if (!rank) {
39 PetscCall(VecSetValues(y, 5, rows_ix, y_array, INSERT_VALUES));
40 PetscCall(MatSetValues(X, 5, rows_ix, 2, cols_ix, X_array, ADD_VALUES));
41 }
42 PetscCall(VecAssemblyBegin(y));
43 PetscCall(VecAssemblyEnd(y));
44 PetscCall(MatAssemblyBegin(X, MAT_FINAL_ASSEMBLY));
45 PetscCall(MatAssemblyEnd(X, MAT_FINAL_ASSEMBLY));
46
47 PetscCall(PetscRegressorCreate(PETSC_COMM_WORLD, ®ressor));
48 PetscCall(PetscRegressorSetType(regressor, PETSCREGRESSORLINEAR));
49 PetscCall(PetscRegressorSetFromOptions(regressor));
50 PetscCall(PetscRegressorFit(regressor, X, y));
51 PetscCall(PetscRegressorPredict(regressor, X, y_predicted));
52 PetscCall(PetscRegressorLinearGetIntercept(regressor, &intercept));
53 PetscCall(PetscRegressorLinearGetCoefficients(regressor, &coefficients));
54
55 PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Intercept is %lf\n", (double)intercept));
56 PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Coefficients are\n"));
57 PetscCall(VecView(coefficients, PETSC_VIEWER_STDOUT_WORLD));
58 PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Predicted values are\n"));
59 PetscCall(VecView(y_predicted, PETSC_VIEWER_STDOUT_WORLD));
60
61 PetscCall(MatDestroy(&X));
62 PetscCall(VecDestroy(&y));
63 PetscCall(VecDestroy(&y_predicted));
64 PetscCall(PetscRegressorDestroy(®ressor));
65
66 PetscCall(PetscFinalize());
67 return 0;
68 }
69
70 /*TEST
71
72 build:
73 requires: !complex !single !__float128 !defined(PETSC_USE_64BIT_INDICES)
74
75 test:
76 suffix: prefix_tao
77 args: -regressor_view
78
79 test:
80 suffix: prefix_ksp
81 args: -regressor_view -regressor_linear_use_ksp -regressor_linear_ksp_lsqr_monitor
82
83 test:
84 requires: suitesparse
85 suffix: prefix_ksp_qr
86 args: -regressor_view -regressor_linear_use_ksp -regressor_linear_ksp_lsqr_monitor -regressor_linear_pc_type qr regressor_linear_pc_factor_mat_solver_type spqr
87 TODO: Matrix of type composite does not support checking for transpose
88
89 TEST*/
90