134b254c5SRichard Tran Mills #include <petsc/private/regressorimpl.h> 234b254c5SRichard Tran Mills 334b254c5SRichard Tran Mills PetscBool PetscRegressorRegisterAllCalled = PETSC_FALSE; 434b254c5SRichard Tran Mills PetscFunctionList PetscRegressorList = NULL; 534b254c5SRichard Tran Mills 634b254c5SRichard Tran Mills PetscClassId PETSCREGRESSOR_CLASSID; 734b254c5SRichard Tran Mills 834b254c5SRichard Tran Mills /* Logging support */ 934b254c5SRichard Tran Mills PetscLogEvent PetscRegressor_SetUp, PetscRegressor_Fit, PetscRegressor_Predict; 1034b254c5SRichard Tran Mills 1134b254c5SRichard Tran Mills /*@C 1234b254c5SRichard Tran Mills PetscRegressorRegister - Adds a method to the `PetscRegressor` package. 1334b254c5SRichard Tran Mills 1434b254c5SRichard Tran Mills Not collective 1534b254c5SRichard Tran Mills 1634b254c5SRichard Tran Mills Input Parameters: 1734b254c5SRichard Tran Mills + sname - name of a new user-defined regressor 1834b254c5SRichard Tran Mills - function - routine to create method context 1934b254c5SRichard Tran Mills 2034b254c5SRichard Tran Mills Notes: 2134b254c5SRichard Tran Mills `PetscRegressorRegister()` may be called multiple times to add several user-defined regressors. 2234b254c5SRichard Tran Mills 2334b254c5SRichard Tran Mills Example Usage: 2434b254c5SRichard Tran Mills .vb 2534b254c5SRichard Tran Mills PetscRegressorRegister("my_regressor",MyRegressorCreate); 2634b254c5SRichard Tran Mills .ve 2734b254c5SRichard Tran Mills 2834b254c5SRichard Tran Mills Then, your regressor can be chosen with the procedural interface via 2934b254c5SRichard Tran Mills .vb 3034b254c5SRichard Tran Mills PetscRegressorSetType(regressor,"my_regressor") 3134b254c5SRichard Tran Mills .ve 3234b254c5SRichard Tran Mills or at runtime via the option 3334b254c5SRichard Tran Mills .vb 3434b254c5SRichard Tran Mills -regressor_type my_regressor 3534b254c5SRichard Tran Mills .ve 3634b254c5SRichard Tran Mills 3734b254c5SRichard Tran Mills Level: advanced 3834b254c5SRichard Tran Mills 3934b254c5SRichard Tran Mills .seealso: `PetscRegressorRegisterAll()` 4034b254c5SRichard Tran Mills @*/ 4134b254c5SRichard Tran Mills PetscErrorCode PetscRegressorRegister(const char sname[], PetscErrorCode (*function)(PetscRegressor)) 4234b254c5SRichard Tran Mills { 4334b254c5SRichard Tran Mills PetscFunctionBegin; 4434b254c5SRichard Tran Mills PetscCall(PetscRegressorInitializePackage()); 4534b254c5SRichard Tran Mills PetscCall(PetscFunctionListAdd(&PetscRegressorList, sname, function)); 4634b254c5SRichard Tran Mills PetscFunctionReturn(PETSC_SUCCESS); 4734b254c5SRichard Tran Mills } 4834b254c5SRichard Tran Mills 4934b254c5SRichard Tran Mills /*@ 5034b254c5SRichard Tran Mills PetscRegressorCreate - Creates a `PetscRegressor` object. 5134b254c5SRichard Tran Mills 5234b254c5SRichard Tran Mills Collective 5334b254c5SRichard Tran Mills 5434b254c5SRichard Tran Mills Input Parameter: 5534b254c5SRichard Tran Mills . comm - the MPI communicator that will share the `PetscRegressor` object 5634b254c5SRichard Tran Mills 5734b254c5SRichard Tran Mills Output Parameter: 5834b254c5SRichard Tran Mills . newregressor - the new `PetscRegressor` object 5934b254c5SRichard Tran Mills 6034b254c5SRichard Tran Mills Level: beginner 6134b254c5SRichard Tran Mills 6234b254c5SRichard Tran Mills .seealso: `PetscRegressorFit()`, `PetscRegressorPredict()`, `PetscRegressor` 6334b254c5SRichard Tran Mills @*/ 6434b254c5SRichard Tran Mills PetscErrorCode PetscRegressorCreate(MPI_Comm comm, PetscRegressor *newregressor) 6534b254c5SRichard Tran Mills { 6634b254c5SRichard Tran Mills PetscRegressor regressor; 6734b254c5SRichard Tran Mills 6834b254c5SRichard Tran Mills PetscFunctionBegin; 6934b254c5SRichard Tran Mills PetscAssertPointer(newregressor, 2); 7034b254c5SRichard Tran Mills *newregressor = NULL; 7134b254c5SRichard Tran Mills PetscCall(PetscRegressorInitializePackage()); 7234b254c5SRichard Tran Mills 7334b254c5SRichard Tran Mills PetscCall(PetscHeaderCreate(regressor, PETSCREGRESSOR_CLASSID, "PetscRegressor", "Regressor", "PetscRegressor", comm, PetscRegressorDestroy, PetscRegressorView)); 7434b254c5SRichard Tran Mills 7534b254c5SRichard Tran Mills regressor->setupcalled = PETSC_FALSE; 7634b254c5SRichard Tran Mills regressor->fitcalled = PETSC_FALSE; 7734b254c5SRichard Tran Mills regressor->data = NULL; 7834b254c5SRichard Tran Mills regressor->training = NULL; 7934b254c5SRichard Tran Mills regressor->target = NULL; 8034b254c5SRichard Tran Mills PetscObjectParameterSetDefault(regressor, regularizer_weight, 1.0); // Default to regularizer weight of 1.0, usually the default in SciKit-learn 8134b254c5SRichard Tran Mills 8234b254c5SRichard Tran Mills *newregressor = regressor; 8334b254c5SRichard Tran Mills PetscFunctionReturn(PETSC_SUCCESS); 8434b254c5SRichard Tran Mills } 8534b254c5SRichard Tran Mills 8634b254c5SRichard Tran Mills /*@ 8734b254c5SRichard Tran Mills PetscRegressorView - Prints information about the `PetscRegressor` object 8834b254c5SRichard Tran Mills 8934b254c5SRichard Tran Mills Collective 9034b254c5SRichard Tran Mills 9134b254c5SRichard Tran Mills Input Parameters: 9234b254c5SRichard Tran Mills + regressor - the `PetscRegressor` context 9334b254c5SRichard Tran Mills - viewer - a `PetscViewer` context 9434b254c5SRichard Tran Mills 9534b254c5SRichard Tran Mills Options Database Key: 9634b254c5SRichard Tran Mills . -regressor_view - Calls `PetscRegressorView()` at the end of `PetscRegressorFit()` 9734b254c5SRichard Tran Mills 9834b254c5SRichard Tran Mills Level: beginner 9934b254c5SRichard Tran Mills 10034b254c5SRichard Tran Mills Notes: 10134b254c5SRichard Tran Mills The available visualization contexts include 10234b254c5SRichard Tran Mills + `PETSC_VIEWER_STDOUT_SELF` - standard output (default) 10334b254c5SRichard Tran Mills - `PETSC_VIEWER_STDOUT_WORLD` - synchronized standard 10434b254c5SRichard Tran Mills output where only the first processor opens 10534b254c5SRichard Tran Mills the file. All other processors send their 10634b254c5SRichard Tran Mills data to the first processor to print. 10734b254c5SRichard Tran Mills 10834b254c5SRichard Tran Mills .seealso: [](ch_regressor), `PetscRegressor`, `PetscViewerASCIIOpen()` 10934b254c5SRichard Tran Mills @*/ 11034b254c5SRichard Tran Mills PetscErrorCode PetscRegressorView(PetscRegressor regressor, PetscViewer viewer) 11134b254c5SRichard Tran Mills { 11234b254c5SRichard Tran Mills PetscBool isascii, isstring; 11334b254c5SRichard Tran Mills PetscRegressorType type; 11434b254c5SRichard Tran Mills 11534b254c5SRichard Tran Mills PetscFunctionBegin; 11634b254c5SRichard Tran Mills PetscValidHeaderSpecific(regressor, PETSCREGRESSOR_CLASSID, 1); 11734b254c5SRichard Tran Mills if (!viewer) PetscCall(PetscViewerASCIIGetStdout(((PetscObject)regressor)->comm, &viewer)); 11834b254c5SRichard Tran Mills PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2); 11934b254c5SRichard Tran Mills PetscCheckSameComm(regressor, 1, viewer, 2); 12034b254c5SRichard Tran Mills 12134b254c5SRichard Tran Mills PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii)); 12234b254c5SRichard Tran Mills PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERSTRING, &isstring)); 12334b254c5SRichard Tran Mills if (isascii) { 12434b254c5SRichard Tran Mills PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)regressor, viewer)); 12534b254c5SRichard Tran Mills 12634b254c5SRichard Tran Mills PetscCall(PetscViewerASCIIPushTab(viewer)); 12734b254c5SRichard Tran Mills PetscTryTypeMethod(regressor, view, viewer); 12834b254c5SRichard Tran Mills if (regressor->tao) PetscCall(TaoView(regressor->tao, viewer)); 12934b254c5SRichard Tran Mills PetscCall(PetscViewerASCIIPopTab(viewer)); 13034b254c5SRichard Tran Mills } else if (isstring) { 13134b254c5SRichard Tran Mills PetscCall(PetscRegressorGetType(regressor, &type)); 13234b254c5SRichard Tran Mills PetscCall(PetscViewerStringSPrintf(viewer, " PetscRegressorType: %-7.7s", type)); 13334b254c5SRichard Tran Mills } 13434b254c5SRichard Tran Mills PetscFunctionReturn(PETSC_SUCCESS); 13534b254c5SRichard Tran Mills } 13634b254c5SRichard Tran Mills 13734b254c5SRichard Tran Mills /*@ 13834b254c5SRichard Tran Mills PetscRegressorViewFromOptions - View a `PetscRegressor` object based on values in the options database 13934b254c5SRichard Tran Mills 14034b254c5SRichard Tran Mills Collective 14134b254c5SRichard Tran Mills 14234b254c5SRichard Tran Mills Input Parameters: 14334b254c5SRichard Tran Mills + A - the `PetscRegressor` context 14434b254c5SRichard Tran Mills . obj - Optional object that provides the prefix for the options database 14534b254c5SRichard Tran Mills - name - command line option 14634b254c5SRichard Tran Mills 14734b254c5SRichard Tran Mills Level: intermediate 14834b254c5SRichard Tran Mills 14934b254c5SRichard Tran Mills .seealso: [](ch_regressor), `PetscRegressor`, `PetscRegressorView`, `PetscObjectViewFromOptions()`, `PetscRegressorCreate()` 15034b254c5SRichard Tran Mills @*/ 15134b254c5SRichard Tran Mills PetscErrorCode PetscRegressorViewFromOptions(PetscRegressor A, PetscObject obj, const char name[]) 15234b254c5SRichard Tran Mills { 15334b254c5SRichard Tran Mills PetscFunctionBegin; 15434b254c5SRichard Tran Mills PetscValidHeaderSpecific(A, PETSCREGRESSOR_CLASSID, 1); 15534b254c5SRichard Tran Mills PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name)); 15634b254c5SRichard Tran Mills PetscFunctionReturn(PETSC_SUCCESS); 15734b254c5SRichard Tran Mills } 15834b254c5SRichard Tran Mills 15934b254c5SRichard Tran Mills /*@ 16034b254c5SRichard Tran Mills PetscRegressorSetFromOptions - Sets `PetscRegressor` options from the options database. 16134b254c5SRichard Tran Mills 16234b254c5SRichard Tran Mills Collective 16334b254c5SRichard Tran Mills 16434b254c5SRichard Tran Mills Input Parameter: 16534b254c5SRichard Tran Mills . regressor - the `PetscRegressor` context 16634b254c5SRichard Tran Mills 16734b254c5SRichard Tran Mills Options Database Keys: 16834b254c5SRichard Tran Mills . -regressor_type <type> - the particular type of regressor to be used; see `PetscRegressorType` for complete list 16934b254c5SRichard Tran Mills 17034b254c5SRichard Tran Mills Level: beginner 17134b254c5SRichard Tran Mills 17234b254c5SRichard Tran Mills Note: 17334b254c5SRichard Tran Mills This routine must be called before `PetscRegressorSetUp()` (or `PetscRegressorFit()`, which calls 17434b254c5SRichard Tran Mills the former) if the user is to be allowed to set the regressor type. 17534b254c5SRichard Tran Mills 17634b254c5SRichard Tran Mills .seealso: `PetscRegressor`, `PetscRegressorCreate()` 17734b254c5SRichard Tran Mills @*/ 17834b254c5SRichard Tran Mills PetscErrorCode PetscRegressorSetFromOptions(PetscRegressor regressor) 17934b254c5SRichard Tran Mills { 18034b254c5SRichard Tran Mills PetscBool flg; 18134b254c5SRichard Tran Mills PetscRegressorType default_type = PETSCREGRESSORLINEAR; 18234b254c5SRichard Tran Mills char type[256]; 18334b254c5SRichard Tran Mills 18434b254c5SRichard Tran Mills PetscFunctionBegin; 18534b254c5SRichard Tran Mills PetscValidHeaderSpecific(regressor, PETSCREGRESSOR_CLASSID, 1); 18634b254c5SRichard Tran Mills if (((PetscObject)regressor)->type_name) default_type = ((PetscObject)regressor)->type_name; 18734b254c5SRichard Tran Mills PetscObjectOptionsBegin((PetscObject)regressor); 18834b254c5SRichard Tran Mills /* Check for type from options */ 18934b254c5SRichard Tran Mills PetscCall(PetscOptionsFList("-regressor_type", "PetscRegressor type", "PetscRegressorSetType", PetscRegressorList, default_type, type, 256, &flg)); 19034b254c5SRichard Tran Mills if (flg) { 19134b254c5SRichard Tran Mills PetscCall(PetscRegressorSetType(regressor, type)); 19234b254c5SRichard Tran Mills } else if (!((PetscObject)regressor)->type_name) { 19334b254c5SRichard Tran Mills PetscCall(PetscRegressorSetType(regressor, default_type)); 19434b254c5SRichard Tran Mills } 19534b254c5SRichard Tran Mills PetscCall(PetscOptionsReal("-regressor_regularizer_weight", "Weight for the regularizer", "PetscRegressorSetRegularizerWeight", regressor->regularizer_weight, ®ressor->regularizer_weight, &flg)); 19634b254c5SRichard Tran Mills if (flg) PetscCall(PetscRegressorSetRegularizerWeight(regressor, regressor->regularizer_weight)); 19734b254c5SRichard Tran Mills // The above is a little superfluous, because we have already set regressor->regularizer_weight above, but we also need to set the flag indicating that the user has set the weight! 19834b254c5SRichard Tran Mills PetscTryTypeMethod(regressor, setfromoptions, PetscOptionsObject); 19934b254c5SRichard Tran Mills PetscOptionsEnd(); 20034b254c5SRichard Tran Mills PetscFunctionReturn(PETSC_SUCCESS); 20134b254c5SRichard Tran Mills } 20234b254c5SRichard Tran Mills 20334b254c5SRichard Tran Mills /*@ 20434b254c5SRichard Tran Mills PetscRegressorSetUp - Sets up the internal data structures for the later use of a regressor. 20534b254c5SRichard Tran Mills 20634b254c5SRichard Tran Mills Collective 20734b254c5SRichard Tran Mills 20834b254c5SRichard Tran Mills Input Parameter: 20934b254c5SRichard Tran Mills . regressor - the `PetscRegressor` context 21034b254c5SRichard Tran Mills 21134b254c5SRichard Tran Mills Notes: 21234b254c5SRichard Tran Mills For basic use of the `PetscRegressor` solvers the user need not to explicitly call 21334b254c5SRichard Tran Mills `PetscRegressorSetUp()`, since these actions will automatically occur during 21434b254c5SRichard Tran Mills the call to `PetscRegressorFit()`. However, if one wishes to control this 21534b254c5SRichard Tran Mills phase separately, `PetscRegressorSetUp()` should be called after `PetscRegressorCreate()`, 21634b254c5SRichard Tran Mills `PetscRegressorSetUp()`, and optional routines of the form `PetscRegressorSetXXX()`, 21734b254c5SRichard Tran Mills but before `PetscRegressorFit()`. 21834b254c5SRichard Tran Mills 21934b254c5SRichard Tran Mills Level: advanced 22034b254c5SRichard Tran Mills 22134b254c5SRichard Tran Mills .seealso: `PetscRegressorCreate()`, `PetscRegressorFit()`, `PetscRegressorDestroy()` 22234b254c5SRichard Tran Mills @*/ 22334b254c5SRichard Tran Mills PetscErrorCode PetscRegressorSetUp(PetscRegressor regressor) 22434b254c5SRichard Tran Mills { 22534b254c5SRichard Tran Mills PetscFunctionBegin; 22634b254c5SRichard Tran Mills PetscValidHeaderSpecific(regressor, PETSCREGRESSOR_CLASSID, 1); 22734b254c5SRichard Tran Mills if (regressor->setupcalled) PetscFunctionReturn(PETSC_SUCCESS); 22834b254c5SRichard Tran Mills PetscCall(PetscLogEventBegin(PetscRegressor_SetUp, regressor, 0, 0, 0)); 22934b254c5SRichard Tran Mills //TODO is there some mat vec etc that must be set, like TaoSolution? 23034b254c5SRichard Tran Mills PetscTryTypeMethod(regressor, setup); 23134b254c5SRichard Tran Mills regressor->setupcalled = PETSC_TRUE; 23234b254c5SRichard Tran Mills PetscCall(PetscLogEventEnd(PetscRegressor_SetUp, regressor, 0, 0, 0)); 23334b254c5SRichard Tran Mills PetscFunctionReturn(PETSC_SUCCESS); 23434b254c5SRichard Tran Mills } 23534b254c5SRichard Tran Mills 23634b254c5SRichard Tran Mills /* NOTE: I've decided to make this take X and y, like the Scikit-learn Fit routines do. 23734b254c5SRichard Tran Mills * Am I overlooking some reason that X should be set in a separate function call, a la KSPSetOperators()?. */ 23834b254c5SRichard Tran Mills /*@ 23934b254c5SRichard Tran Mills PetscRegressorFit - Fit, or train, a regressor from a training dataset 24034b254c5SRichard Tran Mills 24134b254c5SRichard Tran Mills Collective 24234b254c5SRichard Tran Mills 24334b254c5SRichard Tran Mills Input Parameters: 24434b254c5SRichard Tran Mills + regressor - the `PetscRegressor` context 24534b254c5SRichard Tran Mills . X - matrix of training data (of dimension [number of samples] x [number of features]) 24634b254c5SRichard Tran Mills - y - vector of target values from the training dataset 24734b254c5SRichard Tran Mills 24834b254c5SRichard Tran Mills Level: beginner 24934b254c5SRichard Tran Mills 25034b254c5SRichard Tran Mills .seealso: `PetscRegressorCreate()`, `PetscRegressorSetUp()`, `PetscRegressorDestroy()`, `PetscRegressorPredict()` 25134b254c5SRichard Tran Mills @*/ 25234b254c5SRichard Tran Mills PetscErrorCode PetscRegressorFit(PetscRegressor regressor, Mat X, Vec y) 25334b254c5SRichard Tran Mills { 25434b254c5SRichard Tran Mills PetscFunctionBegin; 25534b254c5SRichard Tran Mills PetscValidHeaderSpecific(regressor, PETSCREGRESSOR_CLASSID, 1); 25634b254c5SRichard Tran Mills if (X) PetscValidHeaderSpecific(X, MAT_CLASSID, 2); 25734b254c5SRichard Tran Mills if (y) PetscValidHeaderSpecific(y, VEC_CLASSID, 3); 25834b254c5SRichard Tran Mills 25934b254c5SRichard Tran Mills if (X) { 26034b254c5SRichard Tran Mills PetscCall(PetscObjectReference((PetscObject)X)); 26134b254c5SRichard Tran Mills PetscCall(MatDestroy(®ressor->training)); 26234b254c5SRichard Tran Mills regressor->training = X; 26334b254c5SRichard Tran Mills } 26434b254c5SRichard Tran Mills if (y) { 26534b254c5SRichard Tran Mills PetscCall(PetscObjectReference((PetscObject)y)); 26634b254c5SRichard Tran Mills PetscCall(VecDestroy(®ressor->target)); 26734b254c5SRichard Tran Mills regressor->target = y; 26834b254c5SRichard Tran Mills } 26934b254c5SRichard Tran Mills PetscCall(PetscRegressorSetUp(regressor)); 27034b254c5SRichard Tran Mills 27134b254c5SRichard Tran Mills PetscCall(PetscLogEventBegin(PetscRegressor_Fit, regressor, X, y, 0)); 27234b254c5SRichard Tran Mills PetscUseTypeMethod(regressor, fit); 27334b254c5SRichard Tran Mills PetscCall(PetscLogEventEnd(PetscRegressor_Fit, regressor, X, y, 0)); 27434b254c5SRichard Tran Mills //TODO print convergence data 27534b254c5SRichard Tran Mills PetscCall(PetscRegressorViewFromOptions(regressor, NULL, "-regressor_view")); 27634b254c5SRichard Tran Mills regressor->fitcalled = PETSC_TRUE; 27734b254c5SRichard Tran Mills PetscFunctionReturn(PETSC_SUCCESS); 27834b254c5SRichard Tran Mills } 27934b254c5SRichard Tran Mills 28034b254c5SRichard Tran Mills /*@ 28134b254c5SRichard Tran Mills PetscRegressorPredict - Compute predictions (that is, perform inference) using a fitted regression model. 28234b254c5SRichard Tran Mills 28334b254c5SRichard Tran Mills Collective 28434b254c5SRichard Tran Mills 28534b254c5SRichard Tran Mills Input Parameters: 28634b254c5SRichard Tran Mills + regressor - the `PetscRegressor` context (for which `PetscRegressorFit()` must have been called) 28734b254c5SRichard Tran Mills - X - data matrix of unlabeled observations 28834b254c5SRichard Tran Mills 28934b254c5SRichard Tran Mills Output Parameter: 29034b254c5SRichard Tran Mills . y - vector of predicted labels 29134b254c5SRichard Tran Mills 29234b254c5SRichard Tran Mills Level: beginner 29334b254c5SRichard Tran Mills 29434b254c5SRichard Tran Mills .seealso: `PetscRegressorFit()`, `PetscRegressorDestroy()` 29534b254c5SRichard Tran Mills @*/ 29634b254c5SRichard Tran Mills PetscErrorCode PetscRegressorPredict(PetscRegressor regressor, Mat X, Vec y) 29734b254c5SRichard Tran Mills { 29834b254c5SRichard Tran Mills PetscFunctionBegin; 29934b254c5SRichard Tran Mills PetscValidHeaderSpecific(regressor, PETSCREGRESSOR_CLASSID, 1); 30034b254c5SRichard Tran Mills if (X) PetscValidHeaderSpecific(X, MAT_CLASSID, 2); 30134b254c5SRichard Tran Mills if (y) PetscValidHeaderSpecific(y, VEC_CLASSID, 3); 30234b254c5SRichard Tran Mills PetscCheck(regressor->fitcalled == PETSC_TRUE, ((PetscObject)regressor)->comm, PETSC_ERR_ARG_WRONGSTATE, "PetscRegressorFit() must be called before PetscRegressorPredict()"); 30334b254c5SRichard Tran Mills PetscCall(PetscLogEventBegin(PetscRegressor_Predict, regressor, X, y, 0)); 30434b254c5SRichard Tran Mills PetscTryTypeMethod(regressor, predict, X, y); 30534b254c5SRichard Tran Mills PetscCall(PetscLogEventEnd(PetscRegressor_Predict, regressor, X, y, 0)); 30634b254c5SRichard Tran Mills PetscFunctionReturn(PETSC_SUCCESS); 30734b254c5SRichard Tran Mills } 30834b254c5SRichard Tran Mills 30934b254c5SRichard Tran Mills /*@ 31034b254c5SRichard Tran Mills PetscRegressorReset - Resets a `PetscRegressor` context by removing any allocated `Vec` and `Mat`. Any options set in the object remain. 31134b254c5SRichard Tran Mills 31234b254c5SRichard Tran Mills Collective 31334b254c5SRichard Tran Mills 31434b254c5SRichard Tran Mills Input Parameter: 31534b254c5SRichard Tran Mills . regressor - context obtained from `PetscRegressorCreate()` 31634b254c5SRichard Tran Mills 31734b254c5SRichard Tran Mills Level: intermediate 31834b254c5SRichard Tran Mills 31934b254c5SRichard Tran Mills .seealso: `PetscRegressorCreate()`, `PetscRegressorSetUp()`, `PetscRegressorFit()`, `PetscRegressorPredict()`, `PetscRegressorDestroy()` 32034b254c5SRichard Tran Mills @*/ 32134b254c5SRichard Tran Mills PetscErrorCode PetscRegressorReset(PetscRegressor regressor) 32234b254c5SRichard Tran Mills { 32334b254c5SRichard Tran Mills PetscFunctionBegin; 32434b254c5SRichard Tran Mills PetscValidHeaderSpecific(regressor, PETSCREGRESSOR_CLASSID, 1); 32534b254c5SRichard Tran Mills if (regressor->ops->reset) PetscTryTypeMethod(regressor, reset); 32634b254c5SRichard Tran Mills PetscCall(MatDestroy(®ressor->training)); 32734b254c5SRichard Tran Mills PetscCall(VecDestroy(®ressor->target)); 32834b254c5SRichard Tran Mills PetscCall(TaoDestroy(®ressor->tao)); 32934b254c5SRichard Tran Mills regressor->setupcalled = PETSC_FALSE; 33034b254c5SRichard Tran Mills regressor->fitcalled = PETSC_FALSE; 33134b254c5SRichard Tran Mills PetscFunctionReturn(PETSC_SUCCESS); 33234b254c5SRichard Tran Mills } 33334b254c5SRichard Tran Mills 33434b254c5SRichard Tran Mills /*@C 33534b254c5SRichard Tran Mills PetscRegressorDestroy - Destroys the regressor context that was created with `PetscRegressorCreate()`. 33634b254c5SRichard Tran Mills 33734b254c5SRichard Tran Mills Collective 33834b254c5SRichard Tran Mills 33934b254c5SRichard Tran Mills Input Parameter: 34034b254c5SRichard Tran Mills . regressor - the `PetscRegressor` context 34134b254c5SRichard Tran Mills 34234b254c5SRichard Tran Mills Level: beginner 34334b254c5SRichard Tran Mills 34434b254c5SRichard Tran Mills .seealso: `PetscRegressorCreate()`, `PetscRegressorSetUp()`, `PetscRegressorReset()`, `PetscRegressor` 34534b254c5SRichard Tran Mills @*/ 34634b254c5SRichard Tran Mills PetscErrorCode PetscRegressorDestroy(PetscRegressor *regressor) 34734b254c5SRichard Tran Mills { 34834b254c5SRichard Tran Mills PetscFunctionBegin; 34934b254c5SRichard Tran Mills if (!*regressor) PetscFunctionReturn(PETSC_SUCCESS); 350*3a7d0413SPierre Jolivet PetscValidHeaderSpecific(*regressor, PETSCREGRESSOR_CLASSID, 1); 351*3a7d0413SPierre Jolivet if (--((PetscObject)*regressor)->refct > 0) { 35234b254c5SRichard Tran Mills *regressor = NULL; 35334b254c5SRichard Tran Mills PetscFunctionReturn(PETSC_SUCCESS); 35434b254c5SRichard Tran Mills } 35534b254c5SRichard Tran Mills 35634b254c5SRichard Tran Mills PetscCall(PetscRegressorReset(*regressor)); 35734b254c5SRichard Tran Mills PetscTryTypeMethod(*regressor, destroy); 35834b254c5SRichard Tran Mills 35934b254c5SRichard Tran Mills PetscCall(PetscHeaderDestroy(regressor)); 36034b254c5SRichard Tran Mills PetscFunctionReturn(PETSC_SUCCESS); 36134b254c5SRichard Tran Mills } 36234b254c5SRichard Tran Mills 36334b254c5SRichard Tran Mills /*@C 36434b254c5SRichard Tran Mills PetscRegressorSetType - Sets the type for the regressor. 36534b254c5SRichard Tran Mills 36634b254c5SRichard Tran Mills Collective 36734b254c5SRichard Tran Mills 36834b254c5SRichard Tran Mills Input Parameters: 36934b254c5SRichard Tran Mills + regressor - the `PetscRegressor` context 37034b254c5SRichard Tran Mills - type - a known regression method 37134b254c5SRichard Tran Mills 37234b254c5SRichard Tran Mills Options Database Key: 37334b254c5SRichard Tran Mills . -regressor_type <type> - Sets the type of regressor; use -help for a list of available types 37434b254c5SRichard Tran Mills 37534b254c5SRichard Tran Mills Level: intermediate 37634b254c5SRichard Tran Mills 37734b254c5SRichard Tran Mills Notes: 37834b254c5SRichard Tran Mills See "include/petscregressor.h" for available methods (for instance) 37934b254c5SRichard Tran Mills . `PETSCREGRESSORLINEAR` - Regression model that is linear in its coefficients; supports ordinary least squares as well as regularized variants 38034b254c5SRichard Tran Mills 38134b254c5SRichard Tran Mills Normally, it is best to use the `PetscRegressorSetFromOptions()` command and then 38234b254c5SRichard Tran Mills set the `PetscRegressor` type from the options database rather than by using 38334b254c5SRichard Tran Mills this routine, as this provides maximum flexibility. 38434b254c5SRichard Tran Mills The `PetscRegressorSetType()` routine is provided for those situations where it 38534b254c5SRichard Tran Mills is necessary to set the nonlinear solver independently of the command 38634b254c5SRichard Tran Mills line or options database. 38734b254c5SRichard Tran Mills 38834b254c5SRichard Tran Mills .seealso: `PetscRegressorType` 38934b254c5SRichard Tran Mills @*/ 39034b254c5SRichard Tran Mills PetscErrorCode PetscRegressorSetType(PetscRegressor regressor, PetscRegressorType type) 39134b254c5SRichard Tran Mills { 39234b254c5SRichard Tran Mills PetscErrorCode (*r)(PetscRegressor); 39334b254c5SRichard Tran Mills PetscBool match; 39434b254c5SRichard Tran Mills 39534b254c5SRichard Tran Mills PetscFunctionBegin; 39634b254c5SRichard Tran Mills PetscValidHeaderSpecific(regressor, PETSCREGRESSOR_CLASSID, 1); 39734b254c5SRichard Tran Mills PetscAssertPointer(type, 2); 39834b254c5SRichard Tran Mills 39934b254c5SRichard Tran Mills PetscCall(PetscObjectTypeCompare((PetscObject)regressor, type, &match)); 40034b254c5SRichard Tran Mills if (match) PetscFunctionReturn(PETSC_SUCCESS); 40134b254c5SRichard Tran Mills 40234b254c5SRichard Tran Mills PetscCall(PetscFunctionListFind(PetscRegressorList, type, &r)); 40334b254c5SRichard Tran Mills PetscCheck(r, PetscObjectComm((PetscObject)regressor), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unable to find requested PetscRegressor type %s", type); 40434b254c5SRichard Tran Mills 40534b254c5SRichard Tran Mills /* Destroy the existing solver information */ 40634b254c5SRichard Tran Mills PetscTryTypeMethod(regressor, destroy); 40734b254c5SRichard Tran Mills PetscCall(TaoDestroy(®ressor->tao)); 40834b254c5SRichard Tran Mills regressor->ops->setup = NULL; 40934b254c5SRichard Tran Mills regressor->ops->setfromoptions = NULL; 41034b254c5SRichard Tran Mills regressor->ops->settraining = NULL; 41134b254c5SRichard Tran Mills regressor->ops->fit = NULL; 41234b254c5SRichard Tran Mills regressor->ops->predict = NULL; 41334b254c5SRichard Tran Mills regressor->ops->destroy = NULL; 41434b254c5SRichard Tran Mills regressor->ops->reset = NULL; 41534b254c5SRichard Tran Mills regressor->ops->view = NULL; 41634b254c5SRichard Tran Mills 41734b254c5SRichard Tran Mills /* Call the PetscRegressorCreate_XXX routine for this particular regressor */ 41834b254c5SRichard Tran Mills regressor->setupcalled = PETSC_FALSE; 41934b254c5SRichard Tran Mills PetscCall((*r)(regressor)); 42034b254c5SRichard Tran Mills PetscCall(PetscObjectChangeTypeName((PetscObject)regressor, type)); 42134b254c5SRichard Tran Mills PetscFunctionReturn(PETSC_SUCCESS); 42234b254c5SRichard Tran Mills } 42334b254c5SRichard Tran Mills 42434b254c5SRichard Tran Mills /*@ 42534b254c5SRichard Tran Mills PetscRegressorGetType - Gets the current `PetscRegressorType` being used in the `PetscRegressor` object 42634b254c5SRichard Tran Mills 42734b254c5SRichard Tran Mills Not Collective 42834b254c5SRichard Tran Mills 42934b254c5SRichard Tran Mills Input Parameter: 43034b254c5SRichard Tran Mills . regressor - the `PetscRegressor` solver context 43134b254c5SRichard Tran Mills 43234b254c5SRichard Tran Mills Output Parameter: 43334b254c5SRichard Tran Mills . type - the `PetscRegressorType` 43434b254c5SRichard Tran Mills 43534b254c5SRichard Tran Mills Level: intermediate 43634b254c5SRichard Tran Mills 43734b254c5SRichard Tran Mills .seealso: [](ch_regressor), `PetscRegressor`, `PetscRegressorType`, `PetscRegressorSetType()` 43834b254c5SRichard Tran Mills @*/ 43934b254c5SRichard Tran Mills PetscErrorCode PetscRegressorGetType(PetscRegressor regressor, PetscRegressorType *type) 44034b254c5SRichard Tran Mills { 44134b254c5SRichard Tran Mills PetscFunctionBegin; 44234b254c5SRichard Tran Mills PetscValidHeaderSpecific(regressor, PETSCREGRESSOR_CLASSID, 1); 44334b254c5SRichard Tran Mills PetscAssertPointer(type, 2); 44434b254c5SRichard Tran Mills *type = ((PetscObject)regressor)->type_name; 44534b254c5SRichard Tran Mills PetscFunctionReturn(PETSC_SUCCESS); 44634b254c5SRichard Tran Mills } 44734b254c5SRichard Tran Mills 44834b254c5SRichard Tran Mills /*@ 44934b254c5SRichard Tran Mills PetscRegressorSetRegularizerWeight - Sets the weight to be used for the regularizer for a `PetscRegressor` context 45034b254c5SRichard Tran Mills 45134b254c5SRichard Tran Mills Logically Collective 45234b254c5SRichard Tran Mills 45334b254c5SRichard Tran Mills Input Parameters: 45434b254c5SRichard Tran Mills + regressor - the `PetscRegressor` context 45534b254c5SRichard Tran Mills - weight - the regularizer weight 45634b254c5SRichard Tran Mills 45734b254c5SRichard Tran Mills Options Database Key: 45834b254c5SRichard Tran Mills . regressor_regularizer_weight <weight> - sets the regularizer's weight 45934b254c5SRichard Tran Mills 46034b254c5SRichard Tran Mills Level: beginner 46134b254c5SRichard Tran Mills 46234b254c5SRichard Tran Mills .seealso: `PetscRegressorSetType` 46334b254c5SRichard Tran Mills @*/ 46434b254c5SRichard Tran Mills PetscErrorCode PetscRegressorSetRegularizerWeight(PetscRegressor regressor, PetscReal weight) 46534b254c5SRichard Tran Mills { 46634b254c5SRichard Tran Mills PetscFunctionBegin; 46734b254c5SRichard Tran Mills PetscValidHeaderSpecific(regressor, PETSCREGRESSOR_CLASSID, 1); 46834b254c5SRichard Tran Mills PetscValidLogicalCollectiveReal(regressor, weight, 2); 46934b254c5SRichard Tran Mills regressor->regularizer_weight = weight; 47034b254c5SRichard Tran Mills PetscFunctionReturn(PETSC_SUCCESS); 47134b254c5SRichard Tran Mills } 47234b254c5SRichard Tran Mills 47334b254c5SRichard Tran Mills /*@ 47434b254c5SRichard Tran Mills PetscRegressorGetTao - Returns the `Tao` context for a `PetscRegressor` object. 47534b254c5SRichard Tran Mills 47634b254c5SRichard Tran Mills Not Collective, but if the `PetscRegressor` is parallel, then the `Tao` object is parallel 47734b254c5SRichard Tran Mills 47834b254c5SRichard Tran Mills Input Parameter: 47934b254c5SRichard Tran Mills . regressor - the regressor context 48034b254c5SRichard Tran Mills 48134b254c5SRichard Tran Mills Output Parameter: 48234b254c5SRichard Tran Mills . tao - the `Tao` context 48334b254c5SRichard Tran Mills 48434b254c5SRichard Tran Mills Level: beginner 48534b254c5SRichard Tran Mills 48634b254c5SRichard Tran Mills Notes: 48734b254c5SRichard Tran Mills The `Tao` object will be created if it does not yet exist. 48834b254c5SRichard Tran Mills 48934b254c5SRichard Tran Mills The user can directly manipulate the `Tao` context to set various 49034b254c5SRichard Tran Mills options, etc. Likewise, the user can then extract and manipulate the 49134b254c5SRichard Tran Mills child contexts such as `KSP` or `TaoLineSearch`as well. 49234b254c5SRichard Tran Mills 49334b254c5SRichard Tran Mills Depending on the type of the regressor and the options that are set, the regressor may use not use a `Tao` object. 49434b254c5SRichard Tran Mills 49534b254c5SRichard Tran Mills .seealso: `PetscRegressorLinearGetKSP()` 49634b254c5SRichard Tran Mills @*/ 49734b254c5SRichard Tran Mills PetscErrorCode PetscRegressorGetTao(PetscRegressor regressor, Tao *tao) 49834b254c5SRichard Tran Mills { 49934b254c5SRichard Tran Mills PetscFunctionBegin; 50034b254c5SRichard Tran Mills PetscValidHeaderSpecific(regressor, PETSCREGRESSOR_CLASSID, 1); 50134b254c5SRichard Tran Mills PetscAssertPointer(tao, 2); 50234b254c5SRichard Tran Mills // Analogous to how SNESGetKSP() operates, this routine should create the Tao if it doesn't exist. 50334b254c5SRichard Tran Mills if (!regressor->tao) { 50434b254c5SRichard Tran Mills PetscCall(TaoCreate(PetscObjectComm((PetscObject)regressor), ®ressor->tao)); 50534b254c5SRichard Tran Mills PetscCall(PetscObjectIncrementTabLevel((PetscObject)regressor->tao, (PetscObject)regressor, 1)); 50634b254c5SRichard Tran Mills PetscCall(PetscObjectSetOptions((PetscObject)regressor->tao, ((PetscObject)regressor)->options)); 50734b254c5SRichard Tran Mills } 50834b254c5SRichard Tran Mills *tao = regressor->tao; 50934b254c5SRichard Tran Mills PetscFunctionReturn(PETSC_SUCCESS); 51034b254c5SRichard Tran Mills } 51134b254c5SRichard Tran Mills 51234b254c5SRichard Tran Mills /*@ 51334b254c5SRichard Tran Mills PetscRegressorSetOptionsPrefix - Sets the prefix used for searching for all 51434b254c5SRichard Tran Mills PetscRegressor options in the database. 51534b254c5SRichard Tran Mills 51634b254c5SRichard Tran Mills Logically Collective 51734b254c5SRichard Tran Mills 51834b254c5SRichard Tran Mills Input Parameters: 51934b254c5SRichard Tran Mills + regressor - the `PetscRegressor` context 52034b254c5SRichard Tran Mills - p - the prefix string to prepend to all PetscRegressor option requests 52134b254c5SRichard Tran Mills 52234b254c5SRichard Tran Mills Level: advanced 52334b254c5SRichard Tran Mills 52434b254c5SRichard Tran Mills Notes: 52534b254c5SRichard Tran Mills A hyphen (-) must NOT be given at the beginning of the prefix name. 52634b254c5SRichard Tran Mills The first character of all runtime options is AUTOMATICALLY the hyphen. 52734b254c5SRichard Tran Mills 52834b254c5SRichard Tran Mills For example, to distinguish between the runtime options for two 52934b254c5SRichard Tran Mills different PetscRegressor solvers, one could call 53034b254c5SRichard Tran Mills .vb 53134b254c5SRichard Tran Mills PetscRegressorSetOptionsPrefix(regressor1,"sys1_") 53234b254c5SRichard Tran Mills PetscRegressorSetOptionsPrefix(regressor2,"sys2_") 53334b254c5SRichard Tran Mills .ve 53434b254c5SRichard Tran Mills 53534b254c5SRichard Tran Mills This would enable use of different options for each system, such as 53634b254c5SRichard Tran Mills .vb 53734b254c5SRichard Tran Mills -sys1_regressor_method linear -sys1_regressor_regularizer_weight 1.2 53834b254c5SRichard Tran Mills -sys2_regressor_method linear -sys2_regressor_regularizer_weight 1.1 53934b254c5SRichard Tran Mills .ve 54034b254c5SRichard Tran Mills 54134b254c5SRichard Tran Mills .seealso: [](ch_regressor), `PetscRegressor`, `PetscRegressorSetFromOptions()`, `PetscRegressorAppendOptionsPrefix()`, `PetscRegressorGetOptionsPrefix()` 54234b254c5SRichard Tran Mills @*/ 54334b254c5SRichard Tran Mills PetscErrorCode PetscRegressorSetOptionsPrefix(PetscRegressor regressor, const char p[]) 54434b254c5SRichard Tran Mills { 54534b254c5SRichard Tran Mills PetscFunctionBegin; 54634b254c5SRichard Tran Mills PetscValidHeaderSpecific(regressor, PETSCREGRESSOR_CLASSID, 1); 54734b254c5SRichard Tran Mills PetscCall(PetscObjectSetOptionsPrefix((PetscObject)regressor, p)); 54834b254c5SRichard Tran Mills PetscFunctionReturn(PETSC_SUCCESS); 54934b254c5SRichard Tran Mills } 55034b254c5SRichard Tran Mills 55134b254c5SRichard Tran Mills /*@ 55234b254c5SRichard Tran Mills PetscRegressorAppendOptionsPrefix - Appends to the prefix used for searching for all PetscRegressor options in the database. 55334b254c5SRichard Tran Mills 55434b254c5SRichard Tran Mills Logically Collective 55534b254c5SRichard Tran Mills 55634b254c5SRichard Tran Mills Input Parameters: 55734b254c5SRichard Tran Mills + regressor - the `PetscRegressor` solver context 55834b254c5SRichard Tran Mills - p - the prefix string to prepend to all `PetscRegressor` option requests 55934b254c5SRichard Tran Mills 56034b254c5SRichard Tran Mills Level: advanced 56134b254c5SRichard Tran Mills 56234b254c5SRichard Tran Mills Note: 56334b254c5SRichard Tran Mills A hyphen (-) must NOT be given at the beginning of the prefix name. 56434b254c5SRichard Tran Mills The first character of all runtime options is automatically the hyphen. 56534b254c5SRichard Tran Mills 56634b254c5SRichard Tran Mills .seealso: [](ch_regressor), `PetscRegressor`, `PetscRegressorSetFromOptions()`, `PetscRegressorSetOptionsPrefix()`, `PetscRegressorGetOptionsPrefix()` 56734b254c5SRichard Tran Mills @*/ 56834b254c5SRichard Tran Mills PetscErrorCode PetscRegressorAppendOptionsPrefix(PetscRegressor regressor, const char p[]) 56934b254c5SRichard Tran Mills { 57034b254c5SRichard Tran Mills PetscFunctionBegin; 57134b254c5SRichard Tran Mills PetscValidHeaderSpecific(regressor, PETSCREGRESSOR_CLASSID, 1); 57234b254c5SRichard Tran Mills PetscCall(PetscObjectAppendOptionsPrefix((PetscObject)regressor, p)); 57334b254c5SRichard Tran Mills PetscFunctionReturn(PETSC_SUCCESS); 57434b254c5SRichard Tran Mills } 57534b254c5SRichard Tran Mills 57634b254c5SRichard Tran Mills /*@ 57734b254c5SRichard Tran Mills PetscRegressorGetOptionsPrefix - Gets the prefix used for searching for all 57834b254c5SRichard Tran Mills PetscRegressor options in the database 57934b254c5SRichard Tran Mills 58034b254c5SRichard Tran Mills Not Collective 58134b254c5SRichard Tran Mills 58234b254c5SRichard Tran Mills Input Parameter: 58334b254c5SRichard Tran Mills . regressor - the `PetscRegressor` context 58434b254c5SRichard Tran Mills 58534b254c5SRichard Tran Mills Output Parameter: 58634b254c5SRichard Tran Mills . p - pointer to the prefix string used is returned 58734b254c5SRichard Tran Mills 58834b254c5SRichard Tran Mills Fortran Notes: 58934b254c5SRichard Tran Mills Pass in a string 'prefix' of sufficient length to hold the prefix. 59034b254c5SRichard Tran Mills 59134b254c5SRichard Tran Mills Level: advanced 59234b254c5SRichard Tran Mills 59334b254c5SRichard Tran Mills .seealso: [](ch_regressor), `PetscRegressor`, `PetscRegressorSetFromOptions()`, `PetscRegressorSetOptionsPrefix()`, `PetscRegressorAppendOptionsPrefix()` 59434b254c5SRichard Tran Mills @*/ 59534b254c5SRichard Tran Mills PetscErrorCode PetscRegressorGetOptionsPrefix(PetscRegressor regressor, const char *p[]) 59634b254c5SRichard Tran Mills { 59734b254c5SRichard Tran Mills PetscFunctionBegin; 59834b254c5SRichard Tran Mills PetscValidHeaderSpecific(regressor, PETSCREGRESSOR_CLASSID, 1); 59934b254c5SRichard Tran Mills PetscCall(PetscObjectGetOptionsPrefix((PetscObject)regressor, p)); 60034b254c5SRichard Tran Mills PetscFunctionReturn(PETSC_SUCCESS); 60134b254c5SRichard Tran Mills } 602