fnspown.gms : Test correctness of signpower intrinsic

Description

Test the signed power function, comparing the true derivatives
with those computed numerically.  We don't push the range too much
for this test - we just want to be sure we get all the signs right,
etc.  The important thing is to test with negative bases x so we know
our implementation isn't making any gross errors.

Contributor: Steve Dirkse


Small Model of Type : GAMS


Category : GAMS Test library


Main file : fnspown.gms   includes :   fnset_xy.inc [htmlfntest_xy.inc [html]

$title 'Test correctness of signpower intrinsic' (FNSPOWN,SEQ=531)

$onText

Test the signed power function, comparing the true derivatives
with those computed numerically.  We don't push the range too much
for this test - we just want to be sure we get all the signs right,
etc.  The important thing is to test with negative bases x so we know
our implementation isn't making any gross errors.

Contributor: Steve Dirkse
$offText

$include fnset_xy.inc

option seed = 1776;

reps = 5e-5;
relToInput = 0;

sets
  ex 'exponents' / e1 * e100 /
  bs 'bases'     / b1 * b100 /
  T              / t1 * t10000 /
*   ex 'exponents' / e1 * e5 /
*   bs 'bases'     / b1 * b3 /
*   T              / t1 * t15 /
  Tex(T,ex)
  Tbs(T,bs)
  ;
scalars
  n_ex   / [card(ex)] /
  n_bs   / [card(bs)] /
  ;
parameters
  c(ex)
  x(bs)
  ;
c(ex) = uniform(1e-5, 2.8);
x(bs) = uniform(-0.5,15);
x(bs) = 10**x(bs);
Tex(T,ex) = [ord(ex) = (1 + floor((ord(T)-1)/n_bs))];
Tbs(T,bs) = [ord(bs) = 1 + (mod(ord(T)-1, n_bs))];


data(T,'x') = sum{Tbs(T,bs), x(bs)};
data(T,'y') = sum{Tex(T,ex), c(ex)};

* first test uses positive x values

data(T, 'f_'  ) = signpower.value(   data(T,'x'),data(T,'y'));
data(T, 'fx_' ) = signpower.grad(1:  data(T,'x'),data(T,'y'));
data(T, 'fxx_') = signpower.hess(1:1:data(T,'x'),data(T,'y'));
loop {T,
  data(T,  'f')  = signpower.value(    data(T,'x'),data(T,'y'));
  data(T, 'fx')  = signpower.gradn(1:  data(T,'x'),data(T,'y'));
  data(T,'fxx')  = signpower.hessn(1:1:data(T,'x'),data(T,'y'));
  data(T, 'rc')  = mathlastrc;
  data(T, 'ec')  = mathlastec;
};

$include fntest_xy.inc


* now repeat the test, but with x negative
data(T,'x') = -data(T,'x');

data(T, 'f_'  ) = signpower.value(   data(T,'x'),data(T,'y'));
data(T, 'fx_' ) = signpower.grad(1:  data(T,'x'),data(T,'y'));
data(T, 'fxx_') = signpower.hess(1:1:data(T,'x'),data(T,'y'));
loop {T,
  data(T,  'f')  = signpower.value(    data(T,'x'),data(T,'y'));
  data(T, 'fx')  = signpower.gradn(1:  data(T,'x'),data(T,'y'));
  data(T,'fxx')  = signpower.hessn(1:1:data(T,'x'),data(T,'y'));
  data(T, 'rc')  = mathlastrc;
  data(T, 'ec')  = mathlastec;
};

$include fntest_xy.inc