SALSA Analysis Modules
Feature sets

AnaMod has a mechanism for querying single category/component pairs, but often a specific set of features is needed quickly, and/or multiple times. For this, the `feature set' mechanism exists.

A feature set is a set of category/component pairs. It does not contain actual values. A feature set can be instantiated to a `feature values' object, which contains the actual values that the feature set takes on a given problem.

This is the workflow:

Here is a piece of example code:

  {
    FeatureSet symmetry; int sidx,aidx;
    ierr = NewFeatureSet(&symmetry); CHKERRQ(ierr);
    ierr = AddToFeatureSet
      (symmetry,"simple","symmetry-snorm",&sidx); CHKERRQ(ierr);
    ierr = AddToFeatureSet
      (symmetry,"simple","symmetry-anorm",&aidx); CHKERRQ(ierr);
    ierr = TransformObjectSetSuitabilityFunction
      (cur,(void*)symmetry,&onlyforsymmetricproblem); CHKERRQ(ierr);
  }

PetscErrorCode onlyforsymmetricproblem
(NumericalProblem problem,void *ctx,SuitabilityValue *v)
{
  FeatureSet features = (FeatureSet)ctx; FeatureValues values;
  AnalysisItem sn,an; PetscBool f1,f2; PetscErrorCode ierr;
  
  PetscFunctionBegin;
  ierr = NewFeatureValues(&values); CHKERRQ(ierr);
  ierr = InstantiateFeatureSet((void*)problem,features,values); CHKERRQ(ierr);
  ierr = GetFeatureValue(values,sidx,&sn,&f1); CHKERRQ(ierr);
  ierr = GetFeatureValue(values,aidx,&an,&f2); CHKERRQ(ierr);
  ierr = DeleteFeatureValues(values); CHKERRQ(ierr);
  if (f1 && f2 && an.r>1.e-12*sn.r) {
    printf("problem too unsymmetric\n");
  }