설명
여기서 우리는 단변량에 대한 cppcclib의 외부 함수를 테스트합니다. 정규 분포(PDF 및 CDF)는 예상대로 작동합니다. 기여자: Steve
소형 모델 유형 :크레이지 슬롯
카테고리 : 크레이지 슬롯 테스트 라이브러리
메인 파일 : cpplib01.gms
$title cppcclib의 외부 함수 테스트(CPPLIB01,SEQ=635)
$onText
여기서 우리는 단변량에 대한 cppcclib의 외부 함수를 테스트합니다.
정규 분포(PDF 및 CDF)는 예상대로 작동합니다.
기여자: 스티브
$offText
$onDollar
$funcLibIn mvnLib cppcclib
함수 pdf1 '일변량 정규의 PDF' / mvnLib.pdfUVN /;
function cdf1 '일변량 정규의 CDF' / mvnLib.cdfUVN /;
$설정되지 않은 경우 INFILE $set INFILE uvnFull
별칭(*,u1,u2);
V(u2)를 설정하다
/x
f, f_, f_a, f_r
fx, fx_, fx_a, fx_r
fxx, fxx_, fxx_a, fxx_r
g, g_, g_a, g_r
gx, gx_, gx_a, gx_r
gxx, gxx_, gxx_a, gxx_r
/;
스칼라
aeps0 '절대 오류 허용 범위: 함수' / 1e-15 /
reps0 '상대 오류 허용 범위: 함수' / 1e-15 /
aeps1 '절대 오차 허용 범위: 기울기' / 1e-15 /
reps1 '상대 오차 허용오차: 기울기' / 1e-15 /
aeps2 '절대 오류 허용오차: 헤세 행렬' / 1e-13 /
reps2 '상대 오류 허용오차: 헤세 행렬' / 1e-13 /
aepsn '절대 오류 허용 범위: 숫자' / 1e-5 /
Repsn '상대 오류 허용 범위: 숫자' / 1e-5 /
;
T(u1)을 설정;
매개변수 데이터(u1,u2);
$gdxIn %INFILE%
$로드 데이터
$gdxIn
옵션 T < 데이터;
데이터(T,'x') = 데이터(T,'x') + eps;
루프 T,
data(T, 'f' ) = cdf1.value(data(T,'x'));
data(T, 'fx' ) = cdf1.grad (data(T,'x'));
data(T, 'fxx') = cdf1.hess (data(T,'x'));
data(T, 'g' ) = pdf1.value(data(T,'x'));
data(T, 'gx' ) = pdf1.grad (data(T,'x'));
data(T, 'gx_') = pdf1.gradn(data(T,'x'));
data(T, 'gxx') = pdf1.hess (data(T,'x'));
data(T, 'gxx_')= pdf1.hessn(data(T,'x'));
;
data(T, 'fx_' ) = data(T, 'g');
data(T, 'fxx_' ) = data(T, 'gx');
data(T, 'f_a' ) = abs(data(T, 'f')-data(T, 'f_'));
data(T, 'fx_a' ) = abs(data(T, 'fx')-data(T, 'fx_'));
data(T, 'fxx_a') = abs(data(T, 'fxx')-data(T, 'fxx_'));
data(T, 'g_a' ) = abs(data(T, 'g')-data(T, 'g_'));
data(T, 'gx_a' ) = abs(data(T, 'gx')-data(T, 'gx_'));
data(T, 'gxx_a') = abs(data(T, 'gxx')-data(T, 'gxx_'));
TT(u1)을 설정;
매개변수tmp(u1);
tmp(T) = max[abs(data(T,'f_')),abs(data(T,'f'))];
TT(T) = tmp(T) > 0;
데이터(T, 'f_r') = INF;
data(T , 'f_r')$(data(T, 'f_a') eq 0) = 0;
데이터(TT, 'f_r') = 데이터(TT, 'f_a') / tmp(TT);
tmp(T) = max[abs(data(T,'fx_')),abs(data(T,'fx'))];
TT(T) = tmp(T) > 0;
데이터(T, 'fx_r') = INF;
data(T , 'fx_r')$(data(T, 'fx_a') eq 0) = 0;
데이터(TT, 'fx_r') = 데이터(TT, 'fx_a') / tmp(TT);
tmp(T) = max[abs(data(T,'fxx_')),abs(data(T,'fxx'))];
TT(T) = tmp(T) > 0;
데이터(T, 'fxx_r') = INF;
data(T , 'fxx_r')$(data(T, 'fxx_a') eq 0) = 0;
데이터(TT, 'fxx_r') = 데이터(TT, 'fxx_a') / tmp(TT);
tmp(T) = max[abs(data(T,'g_')),abs(data(T,'g'))];
TT(T) = tmp(T) > 0;
데이터(T, 'g_r') = INF;
data(T , 'g_r')$(data(T, 'g_a') eq 0) = 0;
데이터(TT, 'g_r') = 데이터(TT, 'g_a') / tmp(TT);
tmp(T) = max[abs(data(T,'gx_')),abs(data(T,'gx'))];
TT(T) = tmp(T) > 0;
데이터(T, 'gx_r') = INF;
data(T , 'gx_r')$(data(T, 'gx_a') eq 0) = 0;
데이터(TT, 'gx_r') = 데이터(TT, 'gx_a') / tmp(TT);
tmp(T) = max[abs(data(T,'gxx_')),abs(data(T,'gxx'))];
TT(T) = tmp(T) > 0;
데이터(T, 'gxx_r') = INF;
data(T , 'gxx_r')$(data(T, 'gxx_a') eq 0) = 0;
데이터(TT, 'gxx_r') = 데이터(TT, 'gxx_a') / tmp(TT);
badT(u1)을 설정;
매개변수 오류(u1,u2);
badT(T) = ((data(T, 'f_a') > aeps0) 및 (data(T, 'f_r') > reps0))
또는 ((data(T, 'fx_a') > aeps1) 및 (data(T, 'fx_r') > reps1))
또는 ((data(T, 'fxx_a') > aeps2) 및 (data(T, 'fxx_r') > reps2))
OR ((data(T, 'g_a') > aeps0) 및 (data(T, 'g_r') > reps0))
OR ((data(T, 'gx_a') > aepsn) 및 (data(T, 'gx_r') > repsn))
OR ((data(T, 'gxx_a') > aepsn) 및 (data(T, 'gxx_r') > repsn))
;
실패(나쁜T,V) = 데이터(나쁜T,V);
스칼라 nTests, nErrors;
nTests = 카드(T);
nErrors = 카드(나쁜T);
'절대 허용오차, func: ', aeps0;을 표시합니다.
'상대 허용오차, func: ', reps0;을 표시합니다.
'절대 허용오차, grad: ', aeps1;을 표시합니다.
'상대 허용오차, grad: ', reps1;을 표시합니다.
'절대 허용오차, hess: ', aeps2;를 표시합니다.
'상대적 허용오차, hess: ', reps2;를 표시합니다.
'실패한 테스트', 실패를 표시합니다.
* 데이터 표시;
'테스트된 데이터 포인트 표시: ', nTests;
' 오류 표시: ', nErrors;
abort$(nErrors) '오류가 발생했습니다.';