annotate src/samer/maths/opt/Constraints.java @ 8:5e3cbbf173aa tip

Reorganise some more
author samer
date Fri, 05 Apr 2019 22:41:58 +0100
parents bf79fb79ee13
children
rev   line source
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 }