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 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