1 /*  _______________________________________________________________________
2 
3     PECOS: Parallel Environment for Creation Of Stochastics
4     Copyright (c) 2011, Sandia National Laboratories.
5     This software is distributed under the GNU Lesser General Public License.
6     For more information, see the README file in the top Pecos directory.
7     _______________________________________________________________________ */
8 
9 //- Class:        PolynomialApproximation
10 //- Description:  Implementation code for PolynomialApproximation class
11 //-
12 //- Owner:        Mike Eldred
13 
14 #include "PolynomialApproximation.hpp"
15 #include "BasisPolynomial.hpp"
16 #include "SparseGridDriver.hpp"
17 #include "NumericGenOrthogPolynomial.hpp"
18 #include "DiscrepancyCalculator.hpp"
19 
20 //#define DEBUG
21 
22 
23 namespace Pecos {
24 
compute_coefficients()25 void PolynomialApproximation::compute_coefficients()
26 {
27   if (!expansionCoeffFlag && !expansionCoeffGradFlag) {
28     PCerr << "Warning: neither expansion coefficients nor expansion "
29 	  << "coefficient gradients\n         are active in Polynomial"
30 	  << "Approximation::compute_coefficients().\n         Bypassing "
31 	  << "approximation construction." << std::endl;
32     return;
33   }
34 
35   // update surrData (if active aggregation key)
36   synchronize_surrogate_data();
37 
38   // For testing of anchor point logic:
39   //surrData.anchor_index(0); // treat 1st SDV,SDR as anchor point
40 
41   // anchor point, if present, is handled differently for different
42   // expCoeffsSolnApproach settings:
43   //   SAMPLING:   treat it as another data point
44   //   QUADRATURE/CUBATURE/*_SPARSE_GRID: error
45   //   LEAST_SQ_REGRESSION: use equality-constrained least squares
46   if (!surrData.points()) {
47     PCerr << "Error: nonzero number of sample points required in Polynomial"
48 	  << "Approximation::compute_coefficients()." << std::endl;
49     abort_handler(-1);
50   }
51 }
52 
53 
synchronize_surrogate_data()54 void PolynomialApproximation::synchronize_surrogate_data()
55 {
56   std::shared_ptr<SharedPolyApproxData> data_rep =
57     std::static_pointer_cast<SharedPolyApproxData>(sharedDataRep);
58   const UShortArray& active_key = data_rep->activeKey;
59   if (active_key != surrData.active_key()) {
60     PCerr << "Error: active key mismatch in PolynomialApproximation::"
61 	  << "synchronize_surrogate_data()." << std::endl;
62     abort_handler(-1);
63   }
64 
65   // level 0: surrData non-aggregated key stores raw data
66   short discrep_type = data_rep->expConfigOptions.discrepancyType,
67         combine_type = data_rep->expConfigOptions.combineType;
68   if (!discrep_type || !DiscrepancyCalculator::aggregated_key(active_key))
69     return;
70 
71   switch (discrep_type) {
72   case RECURSIVE_DISCREP:
73     // When using a recursive discrepancy with additive/multiplicative corr,
74     // we will subtract/divide the current polynomial approx prediction from
75     // the new surrData so that we form an expansion on the surplus.  Prior
76     // to using compute() to form the surplus, LF-hat must be generated and
77     // will be stored within surrData in a format that compute() can utilize.
78     generate_synthetic_data(surrData, active_key, combine_type);
79     break;
80   //case DISTINCT_DISCREP:
81     // When using a distinct discrepancy with additive/multiplicative corr,
82     // we will subtract/divide the HF,LF pairs.  In this case, the data is
83     // already provided within surrData and specific pairings are identified
84     // by data groups.
85   }
86   // now compute the discrepancy between {HF,LF} or {HF,LF-hat} datasets
87   DiscrepancyCalculator::compute(surrData, active_key, combine_type);
88 }
89 
90 
91 /** Compute the combined expansion prediction that corresponds to new surrData,
92     prior to forming an expansion on the difference (surplus). */
93 void PolynomialApproximation::
generate_synthetic_data(SurrogateData & surr_data,const UShortArray & active_key,short combine_type)94 generate_synthetic_data(SurrogateData& surr_data, const UShortArray& active_key,
95 			short combine_type)
96 {
97   // generate synthetic low-fidelity data at the high-fidelity points
98   // and store within surr_data[lf_hat_key] where lf_hat_key is the trailing
99   // portion of active_key.  This synthetic data then enables the computation
100   // and emulation of a recursive discrepancy from hf - lf_hat differences
101   // (surpluses) at the high-fidelity points
102   UShortArray hf_key, lf0_key, lf_hat_key; // LF-hat in surplus case
103   DiscrepancyCalculator::extract_keys(active_key, hf_key, lf_hat_key);
104   lf0_key = surr_data.filtered_key(RAW_DATA_FILTER, 0);
105 
106   // initialize surr_data[lf_hat_key]
107   surr_data.active_key(lf_hat_key); // active key restored at fn end
108   surr_data.variables_data(surr_data.variables_data(hf_key)); // shallow copies
109   surr_data.anchor_index(surr_data.anchor_index(hf_key));
110   surr_data.pop_count_stack(surr_data.pop_count_stack(hf_key));
111 
112   const SDRArray& hf_sdr_array = surr_data.response_data(hf_key);
113   surr_data.size_active_sdr(hf_sdr_array); // size lf_hat_sdr_array
114   const SDVArray&  sdv_array = surr_data.variables_data();
115   SDRArray& lf_hat_sdr_array = surr_data.response_data();
116 
117   // extract all discrepancy data sets (which have expansions supporting
118   // stored_{value,gradient} evaluations)
119   const std::map<UShortArray, SDRArray>& discrep_resp_map
120     = surr_data.filtered_response_data_map(AGGREGATED_DATA_FILTER);
121   std::map<UShortArray, SDRArray>::const_iterator cit;
122   size_t i, num_pts = hf_sdr_array.size();
123   switch (combine_type) {
124   case MULT_COMBINE: {
125     Real stored_val, fn_val_j, fn_val_jm1;
126     RealVector fn_grad_j, fn_grad_jm1;
127     size_t j, k, num_deriv_vars = surr_data.num_derivative_variables();
128     for (i=0; i<num_pts; ++i) {
129       const RealVector&       c_vars = sdv_array[i].continuous_variables();
130       SurrogateDataResp& lf_hat_sdr  = lf_hat_sdr_array[i];
131       short              lf_hat_bits = lf_hat_sdr.active_bits();
132       // start from emulation of lowest fidelity QoI (LF-hat)
133       fn_val_j = stored_value(c_vars, lf0_key); // coarsest fn
134       if (lf_hat_bits & 2)                      // coarsest grad
135 	fn_grad_j = stored_gradient_nonbasis_variables(c_vars, lf0_key);
136       // augment w/ emulation of discrepancies (Delta-hat) preceding active_key
137       for (cit = discrep_resp_map.begin(), j=0;
138 	   cit->first != active_key; ++cit, ++j) {
139 	stored_val = stored_value(c_vars, cit->first); // Delta-hat
140 	if (lf_hat_bits & 2) { // recurse using levels j and j-1
141 	  const RealVector& stored_grad   // discrepancy gradient-hat
142 	    = stored_gradient_nonbasis_variables(c_vars, cit->first);
143 	  fn_val_jm1 = fn_val_j;  fn_grad_jm1 = fn_grad_j;
144 	  for (k=0; k<num_deriv_vars; ++k) // grad corrected to level j
145 	    fn_grad_j[k] = ( fn_grad_jm1[k] * stored_val +
146 			     fn_val_jm1 * stored_grad[k] );
147 	}
148 	fn_val_j *= stored_val; // fn corrected to level j
149       }
150       if (lf_hat_bits & 1)
151 	lf_hat_sdr.response_function(fn_val_j);
152       if (lf_hat_bits & 2)
153 	lf_hat_sdr.response_gradient(fn_grad_j);
154     }
155     break;
156   }
157   default: { //case ADD_COMBINE: (correction specification not required)
158     Real sum_val;  RealVector sum_grad;
159     for (i=0; i<num_pts; ++i) {
160       const RealVector&      c_vars  = sdv_array[i].continuous_variables();
161       SurrogateDataResp& lf_hat_sdr  = lf_hat_sdr_array[i];
162       short              lf_hat_bits = lf_hat_sdr.active_bits();
163       if (lf_hat_bits & 1) {
164 	sum_val = stored_value(c_vars, lf0_key);
165 	for (cit = discrep_resp_map.begin(); cit->first != active_key; ++cit)
166 	  sum_val += stored_value(c_vars, cit->first);
167 	lf_hat_sdr.response_function(sum_val);
168       }
169       if (lf_hat_bits & 2) {
170 	sum_grad = stored_gradient_nonbasis_variables(c_vars, lf0_key);
171 	for (cit = discrep_resp_map.begin(); cit->first != active_key; ++cit)
172 	  sum_grad += stored_gradient_nonbasis_variables(c_vars, cit->first);
173 	lf_hat_sdr.response_gradient(sum_grad);
174       }
175     }
176     break;
177   }
178   }
179 
180   surr_data.active_key(active_key); // restore
181 }
182 
183 
combined_to_active(bool clear_combined)184 void PolynomialApproximation::combined_to_active(bool clear_combined)
185 {
186   allocate_component_sobol(); // size sobolIndices from shared sobolIndexMap
187 
188   // migrate moments
189   primaryMeanIter->second = combinedMeanBits;
190   primaryVarIter->second  = combinedVarBits;
191   std::shared_ptr<SharedPolyApproxData> data_rep =
192     std::static_pointer_cast<SharedPolyApproxData>(sharedDataRep);
193   if (!data_rep->nonRandomIndices.empty()) {
194     const UShortArray& key = data_rep->activeKey;
195     xPrevMean[key] = xPrevCombMean;
196     xPrevVar[key]  = xPrevCombVar;
197   }
198   if (clear_combined) {
199     primaryMomIter->second.swap(combinedMoments);
200     combinedMoments.resize(0);
201     clear_combined_bits();
202   }
203   else
204     primaryMomIter->second = combinedMoments; // deep copy
205 }
206 
207 
208 void PolynomialApproximation::
compute_moments(bool full_stats,bool combined_stats)209 compute_moments(bool full_stats, bool combined_stats)
210 {
211   // default for standard variables mode (2 moments for both full and
212   // intermediate stats) is specialized by {Interp,ProjectOrthog}PolyApprox
213 
214   if (combined_stats) {
215     if (combinedMoments.length() != 2) combinedMoments.resize(2);
216     combined_mean(); combined_variance();
217   }
218   else {
219     RealVector& mom1 = primaryMomIter->second;
220     if (mom1.length() != 2) mom1.sizeUninitialized(2);
221     mean(); variance();
222     //standardize_moments(mom1);
223 
224     if (!full_stats && !secondaryMoments.empty()) secondaryMoments.resize(0);
225   }
226 }
227 
228 
229 void PolynomialApproximation::
compute_moments(const RealVector & x,bool full_stats,bool combined_stats)230 compute_moments(const RealVector& x, bool full_stats, bool combined_stats)
231 {
232   // default for all variables mode (2 moments) is specialized by ...
233 
234   if (combined_stats) {
235     if (combinedMoments.length() != 2) combinedMoments.resize(2);
236     combined_mean(x); combined_variance(x);
237   }
238   else {
239     RealVector& mom1 = primaryMomIter->second;
240     if (mom1.length() != 2)            mom1.sizeUninitialized(2);
241     mean(x);          variance(x);
242     //standardize_moments(mom1);
243 
244     if (!full_stats && !secondaryMoments.empty()) secondaryMoments.resize(0);
245   }
246 }
247 
248 
249 void PolynomialApproximation::
integrate_moments(const RealVector & coeffs,const RealVector & t1_wts,RealVector & moments)250 integrate_moments(const RealVector& coeffs, const RealVector& t1_wts,
251 		  RealVector& moments)
252 {
253   // computes and stores the following moments:
254   // > mean     (1st raw moment)
255   // > variance (2nd central moment)
256   // > skewness (3rd standardized moment)
257   // > kurtosis (4th standardized moment with offset to eliminate "excess")
258 
259   // current support for this implementation: can't be open-ended since we
260   // employ a specific combination of raw, central, and standardized moments
261   size_t num_moments = moments.length();
262   if (num_moments < 1 || num_moments > 4) {
263     PCerr << "Error: unsupported number of moments requested in Polynomial"
264 	  << "Approximation::integrate_moments()" << std::endl;
265     abort_handler(-1);
266   }
267   size_t i, j, num_pts = coeffs.length();
268   if (t1_wts.length() != num_pts) {
269     PCerr << "Error: mismatch in array lengths between integration driver "
270 	  << "weights (" << t1_wts.length() << ") and coefficients (" << num_pts
271 	  << ") in PolynomialApproximation::integrate_moments()." << std::endl;
272     abort_handler(-1);
273   }
274 
275 #ifdef DEBUG
276   PCout <<  "Coeffs in integrate_moments():\n" << coeffs
277 	<< "Weights in integrate_moments():\n" << t1_wts;
278 #endif
279 
280   // estimate 1st raw moment (mean)
281   moments = 0.;
282   Real& mean = moments[0];
283   for (i=0; i<num_pts; ++i)
284     mean += t1_wts[i] * coeffs[i];
285 
286   // estimate central moments 2 through num_moments
287   if (num_moments > 1) {
288     Real centered_fn, pow_fn;
289     for (i=0; i<num_pts; ++i) {
290       pow_fn = centered_fn = coeffs[i] - mean;
291       for (j=1; j<num_moments; ++j) {
292 	pow_fn     *= centered_fn;
293 	moments[j] += t1_wts[i] * pow_fn;
294       }
295     }
296   }
297 
298   // standardize third and higher central moments, if present
299   //standardize_moments(moments);
300 }
301 
302 
303 void PolynomialApproximation::
integrate_moments(const RealVector & t1_coeffs,const RealMatrix & t2_coeffs,const RealVector & t1_wts,const RealMatrix & t2_wts,RealVector & moments)304 integrate_moments(const RealVector& t1_coeffs, const RealMatrix& t2_coeffs,
305 		  const RealVector& t1_wts, const RealMatrix& t2_wts,
306 		  RealVector& moments)
307 {
308   // computes and stores the following moments:
309   // > mean     (1st raw moment)
310   // > variance (2nd central moment)
311   // > skewness (3rd standardized moment)
312   // > kurtosis (4th standardized moment with offset to eliminate "excess")
313 
314   // current support for this implementation: can't be open-ended since we
315   // employ a specific combination of raw, central, and standardized moments
316   size_t num_moments = moments.length();
317   if (num_moments < 1 || num_moments > 4) {
318     PCerr << "Error: unsupported number of moments requested in Polynomial"
319 	  << "Approximation::integrate_moments()" << std::endl;
320     abort_handler(-1);
321   }
322   size_t i, j, k, num_pts = t1_coeffs.length(), num_v = sharedDataRep->numVars;
323   if (t1_wts.length() != num_pts || t2_wts.numCols() != num_pts ||
324       t2_coeffs.numCols() != num_pts) {
325     PCerr << "Error: mismatch in array lengths among integration driver "
326 	  << "weights ("  << t1_wts.length() << ", " << t2_wts.numCols()
327 	  << ") and coefficients (" << num_pts << ", " << t2_coeffs.numCols()
328 	  << ") in PolynomialApproximation::integrate_moments()." << std::endl;
329     abort_handler(-1);
330   }
331 
332   // estimate 1st raw moment (mean)
333   moments = 0.;
334   Real& mean = moments[0];
335   for (i=0; i<num_pts; ++i) {
336     mean += t1_wts[i] * t1_coeffs[i];
337     const Real* coeff2_i = t2_coeffs[i];
338     const Real*  t2_wt_i = t2_wts[i];
339     for (j=0; j<num_v; ++j)
340       mean += coeff2_i[j] * t2_wt_i[j];
341   }
342 
343   // estimate central moments 2 through num_moments
344   if (num_moments > 1) {
345     Real centered_fn, pow_fn;
346     for (i=0; i<num_pts; ++i) {
347       pow_fn = centered_fn = t1_coeffs[i] - mean;
348       const Real* coeff2_i = t2_coeffs[i];
349       const Real*  t2_wt_i = t2_wts[i];
350       for (j=1; j<num_moments; ++j) {
351 	Real& moment_j = moments[j];
352 	// type2 interpolation of (R - \mu)^n
353 	// --> interpolated gradients are n(R - \mu)^{n-1} dR/dx
354 	for (k=0; k<num_v; ++k)
355 	  moment_j += (j+1) * pow_fn * coeff2_i[k] * t2_wt_i[k];
356 	// type 1 interpolation of (R - \mu)^n
357 	pow_fn   *= centered_fn;
358 	moment_j += t1_wts[i] * pow_fn;
359       }
360     }
361   }
362 
363   // convert central moments to std deviation/skewness/kurtosis
364   //standardize_moments(moments);
365 }
366 
367 
368 void PolynomialApproximation::
standardize_moments(const RealVector & central_moments,RealVector & std_moments)369 standardize_moments(const RealVector& central_moments, RealVector& std_moments)
370 {
371   size_t num_moments = central_moments.length();
372   std_moments.sizeUninitialized(num_moments);
373   if (num_moments >= 1) std_moments[0] = central_moments[0]; // mean
374   if (num_moments <  2) return;
375 
376   const Real& var = central_moments[1];
377   Real&   std_dev = std_moments[1];
378   if (var > 0.) {
379     // standardized moment k is E[((X-mu)/sigma)^k] = E[(X-mu)^k]/sigma^k
380     std_dev = std::sqrt(var); // not standardized (2nd standardized moment is 1)
381     Real pow_fn = var;
382     for (size_t i=2; i<num_moments; ++i)
383       { pow_fn *= std_dev; std_moments[i] = central_moments[i] / pow_fn; }
384     // offset the fourth standardized moment to eliminate excess kurtosis
385     if (num_moments > 3)
386       std_moments[3] -= 3.;
387   }
388   else {
389     // don't leave uninitialized, even if undefined
390     for (size_t i=1; i<num_moments; ++i)
391       std_moments[i] = 0.;
392     // special case of zero variance is OK for num_moments == 2, but not higher
393     if ( !(num_moments == 2 && var == 0.) ) // std_dev OK for var == 0.
394       PCerr << "Warning: moments cannot be standardized due to non-positive "
395 	    << "variance.\n         Skipping standardization." << std::endl;
396   }
397 }
398 
399 
allocate_component_sobol()400 void PolynomialApproximation::allocate_component_sobol()
401 {
402   std::shared_ptr<SharedPolyApproxData> data_rep =
403     std::static_pointer_cast<SharedPolyApproxData>(sharedDataRep);
404   size_t sobol_len = data_rep->sobolIndexMap.size();
405   if (sobolIndices.length() != sobol_len)
406     sobolIndices.sizeUninitialized(sobol_len);
407 }
408 
409 
allocate_total_sobol()410 void PolynomialApproximation::allocate_total_sobol()
411 {
412   // number of total indices independent of number of component indices
413   std::shared_ptr<SharedPolyApproxData> data_rep =
414     std::static_pointer_cast<SharedPolyApproxData>(sharedDataRep);
415   if (totalSobolIndices.empty() && expansionCoeffFlag &&
416       data_rep->expConfigOptions.vbdFlag)
417     totalSobolIndices.sizeUninitialized(sharedDataRep->numVars);
418 }
419 
420 
421 void PolynomialApproximation::
initialize_covariance(PolynomialApproximation * poly_approx_2)422 initialize_covariance(PolynomialApproximation* poly_approx_2)
423 { } // default is no-op
424 
425 
clear_covariance_pointers()426 void PolynomialApproximation::clear_covariance_pointers()
427 { } // default is no-op
428 
429 
initialize_products()430 void PolynomialApproximation::initialize_products()
431 { } // default is no-op
432 
433 
product_interpolants()434 bool PolynomialApproximation::product_interpolants()
435 { return false; } // default
436 
437 
sparse_sobol_index_map() const438 ULongULongMap PolynomialApproximation::sparse_sobol_index_map() const
439 { return ULongULongMap(); } // default is empty map
440 
441 
expansion_terms() const442 size_t PolynomialApproximation::expansion_terms() const
443 {
444   PCerr << "Error: expansion_terms() not defined for this polynomial "
445 	<< "approximation type." << std::endl;
446   abort_handler(-1);
447   return _NPOS;
448 }
449 
450 
combined_mean()451 Real PolynomialApproximation::combined_mean()
452 {
453   PCerr << "Error: combined_mean() not available for this polynomial "
454 	<< "approximation type." << std::endl;
455   abort_handler(-1);
456   return 0.;
457 }
458 
459 
combined_mean(const RealVector & x)460 Real PolynomialApproximation::combined_mean(const RealVector& x)
461 {
462   PCerr << "Error: combined_mean() not available for this polynomial "
463 	<< "approximation type." << std::endl;
464   abort_handler(-1);
465   return 0.;
466 }
467 
468 
469 Real PolynomialApproximation::
combined_covariance(PolynomialApproximation * poly_approx_2)470 combined_covariance(PolynomialApproximation* poly_approx_2)
471 {
472   PCerr << "Error: combined_covariance() not available for this polynomial "
473 	<< "approximation type." << std::endl;
474   abort_handler(-1);
475   return 0.;
476 }
477 
478 
479 Real PolynomialApproximation::
combined_covariance(const RealVector & x,PolynomialApproximation * poly_approx_2)480 combined_covariance(const RealVector& x, PolynomialApproximation* poly_approx_2)
481 {
482   PCerr << "Error: combined_covariance() not available for this polynomial "
483 	<< "approximation type." << std::endl;
484   abort_handler(-1);
485   return 0.;
486 }
487 
488 
beta(bool cdf_flag,Real z_bar)489 Real PolynomialApproximation::beta(bool cdf_flag, Real z_bar)
490 {
491   PCerr << "Error: beta() not available for this polynomial approximation type."
492 	<< std::endl;
493   abort_handler(-1);
494   return 0.;
495 }
496 
497 
498 Real PolynomialApproximation::
beta(const RealVector & x,bool cdf_flag,Real z_bar)499 beta(const RealVector& x, bool cdf_flag, Real z_bar)
500 {
501   PCerr << "Error: beta(x) not available for this polynomial approximation "
502 	<< "type." << std::endl;
503   abort_handler(-1);
504   return 0.;
505 }
506 
507 
combined_beta(bool cdf_flag,Real z_bar)508 Real PolynomialApproximation::combined_beta(bool cdf_flag, Real z_bar)
509 {
510   PCerr << "Error: combined_beta() not available for this polynomial "
511 	<< "approximation type." << std::endl;
512   abort_handler(-1);
513   return 0.;
514 }
515 
516 
517 Real PolynomialApproximation::
combined_beta(const RealVector & x,bool cdf_flag,Real z_bar)518 combined_beta(const RealVector& x, bool cdf_flag, Real z_bar)
519 {
520   PCerr << "Error: combined_beta(x) not available for this polynomial "
521 	<< "approximation type." << std::endl;
522   abort_handler(-1);
523   return 0.;
524 }
525 
526 
delta_mean()527 Real PolynomialApproximation::delta_mean()
528 {
529   PCerr << "Error: delta_mean() not available for this polynomial "
530 	<< "approximation type." << std::endl;
531   abort_handler(-1);
532   return 0.;
533 }
534 
535 
delta_mean(const RealVector & x)536 Real PolynomialApproximation::delta_mean(const RealVector& x)
537 {
538   PCerr << "Error: delta_mean(x) not available for this polynomial "
539 	<< "approximation type." << std::endl;
540   abort_handler(-1);
541   return 0.;
542 }
543 
544 
delta_combined_mean()545 Real PolynomialApproximation::delta_combined_mean()
546 {
547   PCerr << "Error: delta_combined_mean() not available for this polynomial "
548 	<< "approximation type." << std::endl;
549   abort_handler(-1);
550   return 0.;
551 }
552 
553 
delta_combined_mean(const RealVector & x)554 Real PolynomialApproximation::delta_combined_mean(const RealVector& x)
555 {
556   PCerr << "Error: delta_combined_mean(x) not available for this polynomial "
557 	<< "approximation type." << std::endl;
558   abort_handler(-1);
559   return 0.;
560 }
561 
562 
delta_std_deviation()563 Real PolynomialApproximation::delta_std_deviation()
564 {
565   PCerr << "Error: delta_std_deviation() not available for this polynomial "
566 	<< "approximation type." << std::endl;
567   abort_handler(-1);
568   return 0.;
569 }
570 
571 
delta_std_deviation(const RealVector & x)572 Real PolynomialApproximation::delta_std_deviation(const RealVector& x)
573 {
574   PCerr << "Error: delta_std_deviation(x) not available for this polynomial "
575 	<< "approximation type." << std::endl;
576   abort_handler(-1);
577   return 0.;
578 }
579 
580 
delta_combined_std_deviation()581 Real PolynomialApproximation::delta_combined_std_deviation()
582 {
583   PCerr << "Error: delta_combined_std_deviation() not available for this "
584 	<< "polynomial approximation type." << std::endl;
585   abort_handler(-1);
586   return 0.;
587 }
588 
589 
delta_combined_std_deviation(const RealVector & x)590 Real PolynomialApproximation::delta_combined_std_deviation(const RealVector& x)
591 {
592   PCerr << "Error: delta_combined_std_deviation(x) not available for this "
593 	<< "polynomial approximation type." << std::endl;
594   abort_handler(-1);
595   return 0.;
596 }
597 
598 
599 Real PolynomialApproximation::
delta_covariance(PolynomialApproximation * poly_approx_2)600 delta_covariance(PolynomialApproximation* poly_approx_2)
601 {
602   PCerr << "Error: delta_covariance() not available for this polynomial "
603 	<< "approximation type." << std::endl;
604   abort_handler(-1);
605   return 0.;
606 }
607 
608 
609 Real PolynomialApproximation::
delta_covariance(const RealVector & x,PolynomialApproximation * poly_approx_2)610 delta_covariance(const RealVector& x, PolynomialApproximation* poly_approx_2)
611 {
612   PCerr << "Error: delta_covariance() not available for this polynomial "
613 	<< "approximation type." << std::endl;
614   abort_handler(-1);
615   return 0.;
616 }
617 
618 
619 Real PolynomialApproximation::
delta_combined_covariance(PolynomialApproximation * poly_approx_2)620 delta_combined_covariance(PolynomialApproximation* poly_approx_2)
621 {
622   PCerr << "Error: delta_combined_covariance() not available for this "
623 	<< "polynomial approximation type." << std::endl;
624   abort_handler(-1);
625   return 0.;
626 }
627 
628 
629 Real PolynomialApproximation::
delta_combined_covariance(const RealVector & x,PolynomialApproximation * poly_approx_2)630 delta_combined_covariance(const RealVector& x,
631 			  PolynomialApproximation* poly_approx_2)
632 {
633   PCerr << "Error: delta_combined_covariance() not available for this "
634 	<< "polynomial approximation type." << std::endl;
635   abort_handler(-1);
636   return 0.;
637 }
638 
639 
delta_beta(bool cdf_flag,Real z_bar)640 Real PolynomialApproximation::delta_beta(bool cdf_flag, Real z_bar)
641 {
642   PCerr << "Error: delta_beta() not available for this polynomial "
643 	<< "approximation type." << std::endl;
644   abort_handler(-1);
645   return 0.;
646 }
647 
648 
649 Real PolynomialApproximation::
delta_beta(const RealVector & x,bool cdf_flag,Real z_bar)650 delta_beta(const RealVector& x, bool cdf_flag, Real z_bar)
651 {
652   PCerr << "Error: delta_beta(x) not available for this polynomial "
653 	<< "approximation type." << std::endl;
654   abort_handler(-1);
655   return 0.;
656 }
657 
658 
delta_z(bool cdf_flag,Real beta_bar)659 Real PolynomialApproximation::delta_z(bool cdf_flag, Real beta_bar)
660 {
661   PCerr << "Error: delta_z() not available for this polynomial approximation "
662 	<< "type." << std::endl;
663   abort_handler(-1);
664   return 0.;
665 }
666 
667 
668 Real PolynomialApproximation::
delta_z(const RealVector & x,bool cdf_flag,Real beta_bar)669 delta_z(const RealVector& x, bool cdf_flag, Real beta_bar)
670 {
671   PCerr << "Error: delta_z(x) not available for this polynomial approximation "
672 	<< "type." << std::endl;
673   abort_handler(-1);
674   return 0.;
675 }
676 
677 
delta_combined_beta(bool cdf_flag,Real z_bar)678 Real PolynomialApproximation::delta_combined_beta(bool cdf_flag, Real z_bar)
679 {
680   PCerr << "Error: delta_combined_beta() not available for this polynomial "
681 	<< "approximation type." << std::endl;
682   abort_handler(-1);
683   return 0.;
684 }
685 
686 
687 Real PolynomialApproximation::
delta_combined_beta(const RealVector & x,bool cdf_flag,Real z_bar)688 delta_combined_beta(const RealVector& x, bool cdf_flag, Real z_bar)
689 {
690   PCerr << "Error: delta_combined_beta(x) not available for this polynomial "
691 	<< "approximation type." << std::endl;
692   abort_handler(-1);
693   return 0.;
694 }
695 
696 
delta_combined_z(bool cdf_flag,Real beta_bar)697 Real PolynomialApproximation::delta_combined_z(bool cdf_flag, Real beta_bar)
698 {
699   PCerr << "Error: delta_combined_z() not available for this polynomial "
700 	<< "approximation type." << std::endl;
701   abort_handler(-1);
702   return 0.;
703 }
704 
705 
706 Real PolynomialApproximation::
delta_combined_z(const RealVector & x,bool cdf_flag,Real beta_bar)707 delta_combined_z(const RealVector& x, bool cdf_flag, Real beta_bar)
708 {
709   PCerr << "Error: delta_combined_z(x) not available for this polynomial "
710 	<< "approximation type." << std::endl;
711   abort_handler(-1);
712   return 0.;
713 }
714 
715 } // namespace Pecos
716