24 using namespace PhysicsTools;
33 ProcMultiply(
const char *
name,
36 virtual ~ProcMultiply() {}
38 virtual void configure(ConfIterator iter,
unsigned int n)
override;
39 virtual void eval(ValueIterator iter,
unsigned int n)
const override;
40 virtual std::vector<double> deriv(
41 ValueIterator iter,
unsigned int n)
const override;
44 typedef std::vector<unsigned int>
Config;
47 std::vector<Config>
out;
52 ProcMultiply::ProcMultiply(
const char *
name,
59 std::back_inserter(
out));
62 void ProcMultiply::configure(ConfIterator iter,
unsigned int n)
67 for(
unsigned int i = 0;
i <
in;
i++)
68 iter++(Variable::FLAG_NONE);
70 for(
unsigned int i = 0;
i <
out.size();
i++)
71 iter << Variable::FLAG_NONE;
74 void ProcMultiply::eval(ValueIterator iter,
unsigned int n)
const
76 double *
values = (
double*)alloca(in *
sizeof(
double));
77 for(
double *pos = values; iter; iter++, pos++) {
80 <<
"Special input variable encountered "
81 "at index " << (pos -
values) <<
"."
86 for(std::vector<Config>::const_iterator
config =
out.begin();
89 for(std::vector<unsigned int>::const_iterator
var =
92 product *= values[*
var];
98 std::vector<double> ProcMultiply::deriv(
99 ValueIterator iter,
unsigned int n)
const
101 std::vector<double>
values;
102 std::vector<unsigned int>
offsets;
103 unsigned int size = 0;
105 offsets.push_back(size);
107 values.push_back(*iter++);
112 for(std::vector<Config>::const_iterator
config =
out.begin();
114 for(
unsigned int i = 0;
i <
config->size();
i++) {
115 double product = 1.0;
116 for(
unsigned int j = 0;
j <
config->size();
j++)
118 product *= values[(*config)[
j]];
120 result[k * size + offsets[
i]] = product;
MVATrainerComputer * calib
tuple size
Write out results.