annotate src/samer/maths/Ops.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;
samer@0 11 import samer.core.*;
samer@0 12 import samer.tools.*;
samer@0 13 import java.util.*;
samer@0 14
samer@0 15
samer@0 16 /**
samer@0 17 An agent which allows the creation of vectors and
samer@0 18 matrices, and can also arrange for them to be
samer@0 19 multiplied as part of the current task list
samer@0 20 */
samer@0 21
samer@0 22 public class Ops
samer@0 23 {
samer@0 24 public static Task update(final Viewable v) {
samer@0 25 return new AnonymousTask() { public void run() { v.changed(); } };
samer@0 26 }
samer@0 27
samer@0 28 public static Task times(VVector out, Matrix A, VVector x) {
samer@0 29 return new MatrixTimesVector(out,A,x);
samer@0 30 }
samer@0 31
samer@0 32 // copy as much as possible from one vector to another
samer@0 33 public static Task transfer(final Vec in, final Vec out) {
samer@0 34 final int len=Math.min(in.size(),out.size());
samer@0 35 double src[]=in.array();
samer@0 36
samer@0 37 if (src!=null) return new ArrayCopy(src,0,out.array(),0,len);
samer@0 38 else return new IteratorCopy(in,out,len);
samer@0 39 }
samer@0 40
samer@0 41 // copy a given range from one vector to another
samer@0 42 public static Task transfer(
samer@0 43 final Vec in, int inpos, final Vec out, int outpos, int len)
samer@0 44 {
samer@0 45 return new ArrayCopy(in.array(),inpos,out.array(),outpos,len);
samer@0 46 }
samer@0 47
samer@0 48 // copy a listed elements to another vector
samer@0 49 public static Task transfer(final Vec in, final Vec out, final int[] elements) {
samer@0 50 return new AnonymousTask() {
samer@0 51 double [] dst=out.array();
samer@0 52 double [] src=in.array();
samer@0 53 int N=elements.length;
samer@0 54 public void run() {
samer@0 55 for (int i=0; i<N; i++) dst[i]=src[elements[i]];
samer@0 56 }
samer@0 57 };
samer@0 58 }
samer@0 59
samer@0 60 public static Task apply(Vec vout, final Function f, Vec vin) {
samer@0 61 final double [] in = vin.array();
samer@0 62 final double [] out = vout.array();
samer@0 63 return new AnonymousTask() {
samer@0 64 Function fn=f;
samer@0 65 public void run() { fn.apply(in,out); }
samer@0 66 public void setFunction(Function fn) { this.fn=fn; }
samer@0 67 };
samer@0 68 }
samer@0 69
samer@0 70 public static Task apply(final Function fn, Vec vin) {
samer@0 71 final double [] in = vin.array();
samer@0 72 return new AnonymousTask() {
samer@0 73 public void run() { fn.apply(in); }
samer@0 74 };
samer@0 75 }
samer@0 76
samer@0 77 public static Task apply(final VVector vout, final VectorFunctionOfVector fn, VVector vin) {
samer@0 78 final double [] in = vin.array();
samer@0 79 final double [] out= vout.array();
samer@0 80 return new AnonymousTask() {
samer@0 81 public void run() { fn.apply(in,out); vout.changed(); }
samer@0 82 };
samer@0 83 }
samer@0 84
samer@0 85 public static void apply( Function fn, Matrix A) {
samer@0 86 double _A[][]=A.getArray();
samer@0 87 int N=A.getRowDimension();
samer@0 88 for (int i=0; i<N; i++) fn.apply(_A[i]);
samer@0 89 A.changed();
samer@0 90 }
samer@0 91
samer@0 92 public static void apply( Function fn, Matrix B, Matrix A) {
samer@0 93 double _A[][]=A.getArray(),_B[][]=B.getArray();
samer@0 94 int N=A.getRowDimension();
samer@0 95 for (int i=0; i<N; i++) fn.apply(_B[i],_A[i]);
samer@0 96 A.changed();
samer@0 97 }
samer@0 98
samer@0 99
samer@0 100
samer@0 101 public static Task plusEquals(final VVector x, final VVector y) {
samer@0 102 final double [] _x=x.array(), _y=y.array();
samer@0 103 return new AnonymousTask() {
samer@0 104 public void run() { Mathx.add(_x,_y); x.changed(); }
samer@0 105 };
samer@0 106 }
samer@0 107
samer@0 108 public static Task timesEquals(final VVector x, final VVector y) {
samer@0 109 final double [] _x=x.array(), _y=y.array();
samer@0 110 return new AnonymousTask() {
samer@0 111 public void run() { Mathx.mul(_x,_y); x.changed(); }
samer@0 112 };
samer@0 113 }
samer@0 114
samer@0 115 public static Task apply(final VectorFunctionOfVector fn, final VVector vinout) {
samer@0 116 final double [] in = vinout.array();
samer@0 117 return new AnonymousTask() {
samer@0 118 public void run() { fn.apply(in); vinout.changed(); }
samer@0 119 };
samer@0 120 }
samer@0 121
samer@0 122 /**
samer@0 123 causes a task to run whenever an observable changes
samer@0 124 */
samer@0 125 public static void triggerTask( final Task task, Observable obs)
samer@0 126 {
samer@0 127 obs.addObserver( new Observer() {
samer@0 128 public void update(Observable o, Object a) {
samer@0 129 if (a==Viewable.DISPOSING) {
samer@0 130 o.deleteObserver(this);
samer@0 131 task.dispose();
samer@0 132 return;
samer@0 133 }
samer@0 134 try { task.run(); }
samer@0 135 catch (Exception ex) {}
samer@0 136 }
samer@0 137 } );
samer@0 138 }
samer@0 139
samer@0 140 public static class ArrayCopy extends NullTask {
samer@0 141 Object src, dst;
samer@0 142 int i, j, n;
samer@0 143 public ArrayCopy(Object s, int spos, Object d, int dpos, int len) {
samer@0 144 src=s; dst=d; i=spos; j=dpos; n=len;
samer@0 145 }
samer@0 146 public void run() { System.arraycopy(src,i,dst,j,n); }
samer@0 147 }
samer@0 148
samer@0 149 public static class IteratorCopy extends NullTask {
samer@0 150 Vec src, dst;
samer@0 151 int N;
samer@0 152
samer@0 153 public IteratorCopy(Vec src, Vec dst, int N) {
samer@0 154 this.src=src; this.dst=dst; this.N=N;
samer@0 155 }
samer@0 156
samer@0 157 public void run() {
samer@0 158 Vec.Iterator it=src.iterator();
samer@0 159 double [] a=dst.array();
samer@0 160 for (int i=0; i<N; i++) a[i]=it.next();
samer@0 161 }
samer@0 162 }
samer@0 163 }