50 _partition_Mmean = getClassificationMmean();
51 _partition_Mscale = getClassificationMscale();
52 _partition_Xu = getClassificationXu();
53 _partition_Ell = getClassificationEll();
54 _partition_Eta = getClassificationEta();
55 _partition_Luu = getClassificationLuu();
56 _partition_Vind = getClassificationVind();
57 _partition_difference.resize(_partition_Xu[0].size(),
59 _partition_distance.resize(_partition_difference.size());
60 _partition_covariance.resize(_partition_distance.size());
61 _partition_b.resize(_partition_covariance.size());
62 _partition_A.resize(_partition_Luu[0].size(), _partition_Luu.size());
71 this->_json[
"m_mean"] = getClassificationMmean();
72 this->_json[
"m_scale"] = getClassificationMscale();
73 this->_json[
"xu"] = getClassificationXu();
74 this->_json[
"ell"] = getClassificationEll();
75 this->_json[
"eta"] = getClassificationEta();
76 this->_json[
"luu"] = getClassificationLuu();
77 this->_json[
"vind"] = getClassificationVind().get_values();
85 std::vector<bool> in_partition(_num_partitions,
false);
86 unsigned int num_partitions_active = 0;
87 for (
unsigned int p = 0;
p < _num_partitions; ++
p)
89 for (
unsigned int t = 0; t < this->_num_tiles[
p]; ++t)
90 if (!in_partition[
p] && this->checkInTile(
p, t))
91 in_partition[
p] =
true;
93 num_partitions_active += in_partition[
p];
95 mooseAssert(num_partitions_active <= _num_partitions,
96 "Number of paritions active must be less than total number of paritions");
97 if (!num_partitions_active)
98 mooseException(
"Number of active partitions (",
99 num_partitions_active,
100 ") out of total number of partitions (",
102 ") is zero. This may be because you are trying to sample outside the total "
103 "applicability of the model");
105 if (_num_partitions == 1)
108 dweights_dstress[0] = 0.0;
110 else if (_num_partitions == 2)
112 if (num_partitions_active == 1)
114 std::fill(dweights_dstress.begin(), dweights_dstress.end(), 0.0);
118 else if (in_partition[1])
121 mooseError(
"Internal error: Parition weight calculation incorrect when only one "
122 "partition is applicable");
124 else if (num_partitions_active == 2)
126 weights[1] = computeSecondPartitionWeight();
127 computeDSecondPartitionWeightDStress(dweights_dstress[1]);
128 dweights_dstress[0] = -dweights_dstress[1];
130 weights[0] = 1.0 - weights[1];
133 mooseError(
"Internal error: number of partitions can only be 1 or 2");
135 if (_num_partitions == 2)
136 _second_partition_weight[_qp] = this->_partition_weights[1];
138 _second_partition_weight[_qp] = 0.0;
141 for (
unsigned int p = 0;
p < _num_partitions; ++
p)
143 weights[
p] = (1.0 - sigmoid(0.0, 1.0, weights[
p]));
144 dweights_dstress[
p] *= -sigmoid(0.0, 1.0, weights[
p],
true);
152 using std::sqrt, std::exp, std::min, std::max;
156 std::vector<GenericReal<is_ad>> scaled_input_values(_num_inputs - 1);
157 unsigned int inc = 0;
158 for (
const auto i : index_range(_input_values))
160 if (i != _old_strain_input_index)
162 scaled_input_values[inc] =
163 (_input_values[i] - _partition_Mmean[inc]) / _partition_Mscale[inc];
171 for (
const auto i : index_range(_partition_Xu))
172 for (
const auto j : index_range(_partition_Xu[0]))
173 _partition_difference[j][i] =
174 Utility::pow<2>((_partition_Xu[i][j] - scaled_input_values[i]) / _partition_Ell);
177 std::fill(_partition_distance.begin(), _partition_distance.end(), 0.0);
178 for (
const auto i : index_range(_partition_difference))
180 for (
const auto j : index_range(_partition_difference[0]))
181 _partition_distance[i] += _partition_difference[i][j];
182 _partition_distance[i] = sqrt(_partition_distance[i]);
187 for (
const auto i : index_range(_partition_covariance))
188 _partition_covariance[i] = Utility::pow<2>(_partition_Eta) * exp(-0.5 * _partition_distance[i]);
191 for (
const auto i : index_range(_partition_covariance))
192 _partition_b(i) = _partition_covariance[i];
195 for (
const auto i : index_range(_partition_Luu[0]))
196 for (
const auto j : index_range(_partition_Luu))
197 _partition_A(i, j) = _partition_Luu[j][i];
200 DenseVector<GenericReal<is_ad>> ma(_partition_b.size());
201 _partition_A.lu_solve(_partition_b, ma);
205 for (
const auto i : index_range(ma))
206 partition_weight += ma(i) * _partition_Vind(i);
209 partition_weight = -partition_weight + 1.0;
210 partition_weight = min(partition_weight, 1.0);
211 partition_weight = max(partition_weight, 0.0);
212 return partition_weight;