Skip to content

Commit 3d1a68c

Browse files
Merge pull request #1 from caleb-hamilton/main
NLDF example
2 parents f625b3f + 0a74e33 commit 3d1a68c

File tree

15 files changed

+547
-0
lines changed

15 files changed

+547
-0
lines changed

NLDF/GenDFEx.java

Lines changed: 207 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,207 @@
1+
import com.nag.routines.E04.E04GN; // nagf_opt_handle_solve_nldf
2+
import com.nag.routines.E04.E04GNU; // monit
3+
import com.nag.routines.E04.E04GNX; // confun dummy
4+
import com.nag.routines.E04.E04GNY; // congrd dummy
5+
import com.nag.routines.E04.E04RA; // Handle init
6+
import com.nag.routines.E04.E04RH; // box bounds
7+
import com.nag.routines.E04.E04RJ; // linear constraints
8+
import com.nag.routines.E04.E04RM; // add model and residual sparsity structure
9+
import com.nag.routines.E04.E04RZ; // destroy handle
10+
import com.nag.routines.E04.E04ZM; // optional parameters
11+
12+
import java.lang.Math;
13+
import java.util.Arrays;
14+
15+
16+
public class GenDFEx {
17+
18+
public static void main (String[] args) {
19+
20+
E04GN e04gn = new E04GN(); // the solver
21+
E04RA e04ra = new E04RA(); // the handle initializer
22+
E04RM e04rm = new E04RM(); // for setting model and residual sparsity structure
23+
E04ZM e04zm = new E04ZM(); // for setting optional parameters
24+
E04RZ e04rz = new E04RZ(); // handle destroyer
25+
26+
27+
MONIT monit = new MONIT(); // defined below using E04GNU
28+
CONFUN confun = new CONFUN(); // defined below using E04GNX (dummy)
29+
CONGRD congrd = new CONGRD(); // defined below using E04GNY (dummy)
30+
31+
32+
// Set up data and initial handle parameters
33+
double [] t = linspace(0.5, 2.5, 21);
34+
double [] ruser1 = toydata1(t); // For Example 1
35+
double [] ruser2 = toydata2(t); // For Example 2
36+
37+
double [] x = new double [2]; // instantiate an array for as many variable you need
38+
long handle = 0;
39+
int nvar = x.length;
40+
int ifail;
41+
int nres = t.length;
42+
43+
// Init for sparsity structure
44+
int isparse = 0;
45+
int nnzrd = 0;
46+
int [] irowrd = new int [nnzrd];
47+
int [] icolrd = new int [nnzrd];
48+
49+
50+
51+
// Get handle
52+
ifail = 0;
53+
e04ra.eval(handle, nvar, ifail);
54+
handle = e04ra.getHANDLE();
55+
56+
// Define the residual functions and sparsity structure
57+
ifail = 0;
58+
e04rm.eval(handle, nres, isparse, nnzrd, irowrd, icolrd, ifail);
59+
60+
// Set options
61+
ifail = 0;
62+
e04zm.eval(handle, "NLDF Loss Function Type = L2", ifail);
63+
e04zm.eval(handle, "Print Level = 1", ifail);
64+
e04zm.eval(handle, "Print Options = No", ifail);
65+
e04zm.eval(handle, "Print Solution = Yes", ifail);
66+
67+
// Initialize all the remaining parameters
68+
LSQFUN lsqfun = new LSQFUN();
69+
LSQGRD lsqgrd = new LSQGRD();
70+
double [] rx = new double[nres];
71+
double [] rinfo = new double[100];
72+
double [] stats = new double [100];
73+
int [] iuser = new int[0];
74+
long cpuser = 0;
75+
76+
// Solve
77+
System.out.println("\n----Solving Toy Dataset #1 with L2 Loss Function----");
78+
ifail = 0;
79+
x = init_x(); //give x the initial guess you want to start from
80+
// NOTE: x will be changed during solve
81+
e04gn.eval(handle, lsqfun, lsqgrd, confun, congrd, monit, nvar, x, nres, rx, rinfo,
82+
stats, iuser, ruser1, cpuser, ifail);
83+
84+
System.out.println("\n----Solving Toy Dataset #1 with L1 Loss Function----");
85+
ifail = 0;
86+
x = init_x();
87+
e04zm.eval(handle, "NLDF Loss Function Type = L1", ifail);
88+
e04gn.eval(handle, lsqfun, lsqgrd, confun, congrd, monit, nvar, x, nres, rx, rinfo,
89+
stats, iuser, ruser1, cpuser, ifail);
90+
91+
92+
93+
// The trade-off of a loss function
94+
// The handle can keep getting used. We are only changing the data passed to the
95+
// solver using ruser2 (first 3 and last 3 data points different from middle)
96+
System.out.println("\n----Solving Toy Dataset #2 with L2 Loss Function----");
97+
ifail = 0;
98+
x = init_x();
99+
e04zm.eval(handle, "NLDF Loss Function Type = L2", ifail);
100+
e04gn.eval(handle, lsqfun, lsqgrd, confun, congrd, monit, nvar, x, nres, rx, rinfo,
101+
stats, iuser, ruser2, cpuser, ifail);
102+
103+
System.out.println("\n----Solving Toy Dataset #2 with L1 Loss Function----");
104+
ifail = 0;
105+
x = init_x();
106+
e04zm.eval(handle, "NLDF Loss Function Type = L1", ifail);
107+
e04gn.eval(handle, lsqfun, lsqgrd, confun, congrd, monit, nvar, x, nres, rx, rinfo,
108+
stats, iuser, ruser2, cpuser, ifail);
109+
110+
System.out.println("\n----Solving Toy Dataset #2 with ATAN Loss Function----");
111+
ifail = 0;
112+
x = init_x();
113+
e04zm.eval(handle, "NLDF Loss Function Type = ATAN", ifail);
114+
e04gn.eval(handle, lsqfun, lsqgrd, confun, congrd, monit, nvar, x, nres, rx, rinfo,
115+
stats, iuser, ruser2, cpuser, ifail);
116+
117+
e04rz.eval(handle,ifail); // Destroy the handle
118+
119+
}
120+
121+
122+
public static class LSQFUN extends E04GN.Abstract_E04GN_LSQFUN {
123+
public void eval() {
124+
for(int i = 0; i < NRES; i++){
125+
this.RX[i] = RUSER[NRES + i] - X[0] * Math.sin(X[1] * RUSER[i]);
126+
}
127+
}
128+
}
129+
130+
public static class LSQGRD extends E04GN.Abstract_E04GN_LSQGRD {
131+
public void eval() {
132+
for(int i = 0; i < NRES; i++){
133+
this.RDX[i * NVAR] = (-1 * Math.sin(X[1]*RUSER[i]));
134+
this.RDX[i* NVAR + 1] = (-1 * RUSER[i] * X[0] * Math.cos(X[1] * RUSER[i]));
135+
}
136+
}
137+
}
138+
139+
// Dummy Functions required for NLDF solver
140+
public static class CONFUN extends E04GN.Abstract_E04GN_CONFUN {
141+
public void eval(){
142+
this.eval();
143+
}
144+
}
145+
146+
public static class CONGRD extends E04GN.Abstract_E04GN_CONGRD {
147+
public void eval(){
148+
this.eval();
149+
}
150+
}
151+
152+
public static class MONIT extends E04GN.Abstract_E04GN_MONIT {
153+
public void eval(){
154+
this.eval();
155+
}
156+
}
157+
158+
// Utilities for setting up data for problem
159+
public static double[] linspace(double startPoint, double endPoint, int length) {
160+
double[] a = new double[length];
161+
double step = (endPoint - startPoint) / (length - 1);
162+
a[0] = startPoint;
163+
a[length - 1] = endPoint;
164+
for (int i = 1; i < length - 1; i++) {
165+
a[i] = startPoint + i * step;
166+
}
167+
return a;
168+
}
169+
170+
public static double[] toydata1(double [] t) {
171+
double [] y = new double[t.length * 2];
172+
for(int i = 0; i < t.length * 2; i++){
173+
if(i < t.length){
174+
y[i] = t[i];
175+
}
176+
else{
177+
y[i] = Math.sin(t[i-t.length]);
178+
if(i - t.length == 10){
179+
y[i] = 5 * y[i];
180+
}
181+
}
182+
}
183+
return y;
184+
}
185+
186+
public static double[] toydata2(double [] t) {
187+
double [] y = new double[t.length * 2];
188+
for(int i = 0; i < t.length * 2; i++){
189+
if(i < t.length){
190+
y[i] = t[i];
191+
}
192+
else{
193+
y[i] = Math.sin(t[i-t.length]);
194+
if((i - t.length >= 3) && (i - t.length < 18)){
195+
y[i] = 5 * y[i];
196+
}
197+
}
198+
}
199+
return y;
200+
}
201+
202+
// For resetting the initial guess
203+
public static double[] init_x() {
204+
double [] x = new double [] {2.1,1.4};
205+
return x;
206+
}
207+
}

0 commit comments

Comments
 (0)