samer@0
|
1 /*
|
samer@0
|
2 * Copyright (c) 2000, Samer Abdallah, King's College London.
|
samer@0
|
3 * All rights reserved.
|
samer@0
|
4 *
|
samer@0
|
5 * This software is provided AS iS and WITHOUT ANY WARRANTY;
|
samer@0
|
6 * without even the implied warranty of MERCHANTABILITY or
|
samer@0
|
7 * FITNESS FOR A PARTICULAR PURPOSE.
|
samer@0
|
8 */
|
samer@0
|
9
|
samer@0
|
10 package samer.maths.opt;
|
samer@0
|
11 import samer.maths.*;
|
samer@0
|
12 import samer.core.*;
|
samer@0
|
13
|
samer@0
|
14 public abstract class Constraints
|
samer@0
|
15 {
|
samer@0
|
16 public State S;
|
samer@0
|
17 public int[] active; // active dimensions
|
samer@0
|
18 public int[] inactive; // inactive dimensions
|
samer@0
|
19 public int n,m; // number of active dimensions
|
samer@0
|
20
|
samer@0
|
21 public Constraints(State s)
|
samer@0
|
22 {
|
samer@0
|
23 S=s; n=S.n;
|
samer@0
|
24 active = new int[n];
|
samer@0
|
25 inactive = new int[n];
|
samer@0
|
26 activateAll();
|
samer@0
|
27 }
|
samer@0
|
28
|
samer@0
|
29 public final int activeCount() { return m; }
|
samer@0
|
30
|
samer@0
|
31 public void report()
|
samer@0
|
32 {
|
samer@0
|
33 Shell.print("inactive dimensions:");
|
samer@0
|
34 for (int i=0; i<(n-m); i++) {
|
samer@0
|
35 Shell.print(" - "+inactive[i]);
|
samer@0
|
36 }
|
samer@0
|
37 Shell.print("active dimensions:");
|
samer@0
|
38 for (int i=0; i<m; i++) {
|
samer@0
|
39 Shell.print(" + "+active[i]);
|
samer@0
|
40 }
|
samer@0
|
41 Shell.print(" active: "+m);
|
samer@0
|
42 Shell.print("inactive: "+(n-m));
|
samer@0
|
43 }
|
samer@0
|
44
|
samer@0
|
45 public void activateAll() {
|
samer@0
|
46 for (int i=0; i<n; i++) active[i]=i;
|
samer@0
|
47 m=n;
|
samer@0
|
48 }
|
samer@0
|
49
|
samer@0
|
50 public void deactivateAll() {
|
samer@0
|
51 for (int i=0; i<n; i++) inactive[i]=i;
|
samer@0
|
52 m=0;
|
samer@0
|
53 }
|
samer@0
|
54
|
samer@0
|
55 public void zeroInactive(double [] z) {
|
samer@0
|
56 for (int i=0; i<(n-m); i++) z[inactive[i]]=0;
|
samer@0
|
57 }
|
samer@0
|
58
|
samer@0
|
59 /**
|
samer@0
|
60 Inactivate the i'th dimension
|
samer@0
|
61 Presupposes that it is not already inactive
|
samer@0
|
62 */
|
samer@0
|
63 public final void inactivate(int i)
|
samer@0
|
64 {
|
samer@0
|
65 inactive[n-m]=i;
|
samer@0
|
66 int j=Util.find(i,active,m);
|
samer@0
|
67 if (j<(m-1)) {
|
samer@0
|
68 System.arraycopy(active,j+1,active,j,m-j-1);
|
samer@0
|
69 }
|
samer@0
|
70 m--;
|
samer@0
|
71 }
|
samer@0
|
72
|
samer@0
|
73 /**
|
samer@0
|
74 activate the i'th dimension
|
samer@0
|
75 Presupposes that it is not already inactive
|
samer@0
|
76 */
|
samer@0
|
77 public final void activate(int i)
|
samer@0
|
78 {
|
samer@0
|
79 active[m]=i;
|
samer@0
|
80 int j=Util.find(i,inactive,n-m);
|
samer@0
|
81 if (j<(n-m-1)) {
|
samer@0
|
82 System.arraycopy(inactive,j+1,inactive,j,n-m-j-1);
|
samer@0
|
83 }
|
samer@0
|
84 m++;
|
samer@0
|
85 }
|
samer@0
|
86
|
samer@0
|
87 /**
|
samer@0
|
88 take a step of lambda*h, set alpha, but don't
|
samer@0
|
89 evaluate function at new point
|
samer@0
|
90 */
|
samer@0
|
91 public void step(double lambda)
|
samer@0
|
92 {
|
samer@0
|
93 for (int i=0; i<m; i++) {
|
samer@0
|
94 int j=active[i];
|
samer@0
|
95 S.P2.x[j] = S.P1.x[j] + lambda*S.h[j];
|
samer@0
|
96 }
|
samer@0
|
97 S.alpha=lambda;
|
samer@0
|
98 }
|
samer@0
|
99
|
samer@0
|
100 /** evaluate function and gradient at P2 */
|
samer@0
|
101 public void eval2()
|
samer@0
|
102 {
|
samer@0
|
103 S.func.evaluate(S.P2);
|
samer@0
|
104 S.P2.s = dot(S.P2.g,S.h);
|
samer@0
|
105 }
|
samer@0
|
106
|
samer@0
|
107 /** sparse matrix mutiplication */
|
samer@0
|
108 public final void mul( double [] y, double [][]A, double [] x)
|
samer@0
|
109 {
|
samer@0
|
110 double [] arow;
|
samer@0
|
111
|
samer@0
|
112 for (int k=0; k<m; k++) {
|
samer@0
|
113 int i=active[k];
|
samer@0
|
114 double t=0;
|
samer@0
|
115 arow=A[i];
|
samer@0
|
116 for (int l=0; l<m; l++) { int j=active[l]; t+=arow[j]*x[j]; }
|
samer@0
|
117 y[i]=t;
|
samer@0
|
118 }
|
samer@0
|
119 }
|
samer@0
|
120
|
samer@0
|
121 /** sparse vector dot product */
|
samer@0
|
122 public final double dot( double [] a, double [] b)
|
samer@0
|
123 {
|
samer@0
|
124 double t=0;
|
samer@0
|
125 for (int k=0; k<m; k++) { int i=active[k]; t+=a[i]*b[i]; }
|
samer@0
|
126 return t;
|
samer@0
|
127 }
|
samer@0
|
128
|
samer@0
|
129 /** sparse vector time scalar */
|
samer@0
|
130 public final void mul( double [] a, double b)
|
samer@0
|
131 {
|
samer@0
|
132 for (int k=0; k<m; k++) { int i=active[k]; a[i]*=b; }
|
samer@0
|
133 }
|
samer@0
|
134
|
samer@0
|
135 /** sparse vector subtraction */
|
samer@0
|
136 public final void sub( double [] out, double [] a, double [] b)
|
samer@0
|
137 {
|
samer@0
|
138 for (int k=0; k<m; k++) { int i=active[k]; out[i]=a[i]-b[i]; }
|
samer@0
|
139 }
|
samer@0
|
140
|
samer@0
|
141 /** sparse vector subtraction in place */
|
samer@0
|
142 public final void sub( double [] a, double [] b)
|
samer@0
|
143 {
|
samer@0
|
144 for (int k=0; k<m; k++) { int i=active[k]; a[i]-=b[i]; }
|
samer@0
|
145 }
|
samer@0
|
146
|
samer@0
|
147
|
samer@0
|
148 /** sparse vector negation in place */
|
samer@0
|
149 public final void negate(double [] x)
|
samer@0
|
150 {
|
samer@0
|
151 for (int k=0; k<m; k++) { int i=active[k]; x[i]=-x[i]; }
|
samer@0
|
152 }
|
samer@0
|
153
|
samer@0
|
154 /** sparse vector negation in place */
|
samer@0
|
155 public final void negate(double [] x, double [] y)
|
samer@0
|
156 {
|
samer@0
|
157 for (int k=0; k<m; k++) { int i=active[k]; y[i]=-x[i]; }
|
samer@0
|
158 }
|
samer@0
|
159
|
samer@0
|
160 /** sparse max(abs(x)) */
|
samer@0
|
161 public final double maxabs(double [] x)
|
samer@0
|
162 {
|
samer@0
|
163 double max=0;
|
samer@0
|
164 for (int k=0; k<m; k++) {
|
samer@0
|
165 double xk = Math.abs(x[active[k]]);
|
samer@0
|
166 if (xk>max) max=xk;
|
samer@0
|
167 }
|
samer@0
|
168 return max;
|
samer@0
|
169 }
|
samer@0
|
170
|
samer@0
|
171 // ugh
|
samer@0
|
172 public boolean release(Datum P) { return false; }
|
samer@0
|
173 public int getReleasedDimension() { return -1; }
|
samer@0
|
174 public int getReleasableDimensions() { return 0; }
|
samer@0
|
175 public abstract void lineSearch(Condition c, CubicLineSearch ls, double step);
|
samer@0
|
176 public abstract void initialise();
|
samer@0
|
177
|
samer@0
|
178 public interface Factory {
|
samer@0
|
179 public Constraints build(MinimiserBase min);
|
samer@0
|
180 }
|
samer@0
|
181 }
|