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 }
|