fnlsemax.gms : LSEMax 내장의 정확성 테스트

설명

LSE max LSEMax는 다음과 같이 정의됩니다.

f := log(exp(x1)+exp(x2)+...)

소형 모델 유형 :슬롯 무료체험


카테고리 : 슬롯 무료체험 테스트 라이브러리


메인 파일 : fnlsemax.gms

$title 'LSEMax 내장의 정확성 테스트' (FNLSEMAX,SEQ=913)

$onText
  LSE max LSEMax는 다음과 같이 정의됩니다.

  f := log(exp(x1)+exp(x2)+...)
$offText

세트
   피
   뷔
   arg '세트 V의 예상 내용' / v00*v19 /
   쯧쯧(*)
   ;
별칭(V,Vp);
별칭(u,*);
싱글톤 세트 PP(P);
스칼라
   aErr0
   mx0
   rErr0
   ;
매개변수
   xIn(P,V)
   x(V)

   원하는 기능(P)
   wntFunc
   gotFunc

   원하는Grad(P,V)
   wntGrad(V)
   갓그라드(V)

   원하는Hess(P,V,V)
   wntHess(V,V)
   gotHess(V,V)

   aErr1(V)
   aErr1Show(V)
   m×1(V)
   rErr1(V)
   rErr1Show(V)

   aErr2(V,V)
   aErr2Show(V,V)
   m×2(V,V)
   rErr2(V,V)
   rErr2Show(V,V)
   ;

$gdxIn fnlsemax.gdx
$load P V xIn wantFunc wantGrad wantHess
$gdxIn

abort$[card(arg) <> 카드(V)] 'arg 세트와 V가 동일하지 않습니다.';
tst(arg) = 예;
tst(V) = 아니오;
abort$[card(tst)] 'arg 세트와 V가 동일하지 않습니다.', tst;

* ----------- LSEMax ------------
루프 P,
  PP(P) = 예;
  x(V) = xIn(P,V);
  wntFunc = wantFunc(P);
  gotFunc = LSEMax.value(x('v00'),x('v01'),x('v02'),x('v03'),x('v04'),
                         x('v05'),x('v06'),x('v07'),x('v08'),x('v09'),
                         x('v10'),x('v11'),x('v12'),x('v13'),x('v14'),
                         x('v15'),x('v16'),x('v17'),x('v18'),x('v19') );

  wntGrad(V) = wantGrad(P,V);
  루프V,
    gotGrad(V) = LSEMax.grad(ord(V): x('v00'),x('v01'),x('v02'),x('v03'),x('v04'),
                                     x('v05'),x('v06'),x('v07'),x('v08'),x('v09'),
                                     x('v10'),x('v11'),x('v12'),x('v13'),x('v14'),
                                     x('v15'),x('v16'),x('v17'),x('v18'),x('v19') );
  ;

  wntHess(V,Vp) = wantHess(P,V,Vp);
  루프(V,Vp),
    gotHess(V,Vp) = LSEMax.hess(ord(V):ord(Vp): x('v00'),x('v01'),x('v02'),x('v03'),x('v04'),
                                                x('v05'),x('v06'),x('v07'),x('v08'),x('v09'),
                                                x('v10'),x('v11'),x('v12'),x('v13'),x('v14'),
                                                x('v15'),x('v16'),x('v17'),x('v18'),x('v19') );
  ;

  aErr0 = ABS(gotFunc-wntFunc);
  반복 
    break$[aErr0 <= 1e-200];
    mx0 = max(abs(gotFunc),abs(wntFunc));
    rErr0 = aErr0 / mx0;
    break$[rErr0 <= 5e-16];
    'LSEMax의 잘못된 함수 값', PP, x, gotFunc, wntFunc, aErr0, rErr0을 중단합니다.
  예까지 ;

  aErr1(V) = abs(gotGrad(V)-wntGrad(V));
  aErr1Show(V) = aErr1(V)$[aErr1(V) > 1e-200];
  반복 
    break$[card(aErr1Show) = 0];
    mx1(V) = max(abs(gotGrad(V)),abs(wntGrad(V)));
    rErr1(V) = [aErr1(V) / mx1(V)]$aErr1Show(V);
    rErr1Show(V) = rErr1(V)$[rErr1(V) > 5e-16];
    break$[card(rErr1Show) = 0];
    'LSEMax의 잘못된 그라데이션 값', PP, x, gotGrad, wntGrad, aErr1Show, rErr1Show를 중단합니다.
  예까지 ;

  aErr2(V,Vp) = abs(gotHess(V,Vp)-wntHess(V,Vp));
  aErr2Show(V,Vp) = aErr2(V,Vp)$[aErr2(V,Vp) > 1e-200];
  반복 
    break$[card(aErr2Show) = 0];
    mx2(V,Vp) = max(abs(gotHess(V,Vp)),abs(wntHess(V,Vp)));
    rErr2(V,Vp) = [aErr2(V,Vp) / mx2(V,Vp)]$aErr2Show(V,Vp);
    rErr2Show(V,Vp) = rErr2(V,Vp)$[rErr2(V,Vp) > 5e-16];
    break$[card(rErr2Show) = 0];
    'LSEMax의 잘못된 헤시안 값', PP, x, gotHess, wntHess, aErr2Show, rErr2Show를 중단합니다.
  예까지 ;
;