File: parameterSelector.cpp

package info (click to toggle)
groops 0%2Bgit20250907%2Bds-1
  • links: PTS, VCS
  • area: non-free
  • in suites: forky, sid
  • size: 11,140 kB
  • sloc: cpp: 135,607; fortran: 1,603; makefile: 20
file content (124 lines) | stat: -rw-r--r-- 4,015 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/***********************************************/
/**
* @file parameterSelector.cpp
*
* @brief Index vector from selected parameters.
*
* @author Sebastian Strasser
* @date 2018-05-08
*
*/
/***********************************************/

#define DOCSTRING_ParameterSelector

#include "base/import.h"
#include "config/configRegister.h"
#include "inputOutput/logging.h"
#include "classes/parameterSelector/parameterSelectorComplement.h"
#include "classes/parameterSelector/parameterSelectorMatrix.h"
#include "classes/parameterSelector/parameterSelectorNames.h"
#include "classes/parameterSelector/parameterSelectorRange.h"
#include "classes/parameterSelector/parameterSelectorWildcard.h"
#include "classes/parameterSelector/parameterSelectorZeros.h"
#include "classes/parameterSelector/parameterSelector.h"

/***********************************************/

GROOPS_REGISTER_CLASS(ParameterSelector, "parameterSelectorType",
                      ParameterSelectorWildcard,
                      ParameterSelectorNames,
                      ParameterSelectorRange,
                      ParameterSelectorMatrix,
                      ParameterSelectorZeros,
                      ParameterSelectorComplement)

GROOPS_READCONFIG_UNBOUNDED_CLASS(ParameterSelector, "parameterSelectorType")

/***********************************************/

ParameterSelector::ParameterSelector(Config &config, const std::string &name)
{
  try
  {
    std::string type;
    while(readConfigChoice(config, name, type, Config::OPTIONAL, "", "selected parameters"))
    {
      renameDeprecatedChoice(config, type, "name", "wildcard", date2time(2020, 5, 30));

      if(readConfigChoiceElement(config, "wildcard",   type, "parameter name matching"))
        parameters.push_back(new ParameterSelectorWildcard(config));
      if(readConfigChoiceElement(config, "names",      type, "manual list of parameter names"))
        parameters.push_back(new ParameterSelectorNames(config));
      if(readConfigChoiceElement(config, "range",      type, "range of parameters"))
        parameters.push_back(new ParameterSelectorRange(config));
      if(readConfigChoiceElement(config, "matrix",     type, "matrix containing parameter indexes"))
        parameters.push_back(new ParameterSelectorMatrix(config));
      if(readConfigChoiceElement(config, "zeros",      type, "additional zero parameters"))
        parameters.push_back(new ParameterSelectorZeros(config));
      if(readConfigChoiceElement(config, "complement", type, "all parameters except those selected"))
        parameters.push_back(new ParameterSelectorComplement(config));
      endChoice(config);
      if(isCreateSchema(config))
        return;
    }
  }
  catch(std::exception &e)
  {
    GROOPS_RETHROW(e)
  }
}

/***********************************************/

ParameterSelector::~ParameterSelector()
{
  for(UInt i=0; i<parameters.size(); i++)
    delete parameters.at(i);
}

/***********************************************/

std::vector<UInt> ParameterSelector::indexVector(const std::vector<ParameterName> &parameterNames)
{
  try
  {
    std::vector<UInt> vector;
    for(const auto &param : parameters)
    {
      std::vector<UInt> vec = param->indexVector(parameterNames);
      vector.insert(vector.end(), vec.begin(), vec.end());
    }
    return vector;
  }
  catch(std::exception &e)
  {
    GROOPS_RETHROW(e)
  }
}

/***********************************************/

std::vector<UInt> ParameterSelector::indexVectorComplement(std::vector<UInt> vector, UInt referenceLength)
{
  try
  {
    std::vector<UInt> complement;
    std::vector<UInt> all(referenceLength);
    std::iota(all.begin(), all.end(), 0);

    if(!vector.size())
      return all;

    std::sort(vector.begin(), vector.end());
    std::set_difference(all.begin(), all.end(), vector.begin(), vector.end(), std::inserter(complement, complement.end()));

    return complement;
  }
  catch(std::exception &e)
  {
    GROOPS_RETHROW(e)
  }
}

/***********************************************/