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.units;
|
samer@0
|
11 import samer.core.*;
|
samer@0
|
12 import samer.maths.*;
|
samer@0
|
13 import samer.tools.*;
|
samer@0
|
14
|
samer@0
|
15 /*
|
samer@0
|
16 * Takes successive input vectors and stacks them into
|
samer@0
|
17 * one big output vector. Requires a task which it will
|
samer@0
|
18 * run to obtain each input vector.
|
samer@0
|
19 */
|
samer@0
|
20
|
samer@0
|
21 public class Stacker implements Task
|
samer@0
|
22 {
|
samer@0
|
23 Node node;
|
samer@0
|
24 Task nextvec;
|
samer@0
|
25 Vec srcvec;
|
samer@0
|
26 int size, step;
|
samer@0
|
27 VVector target;
|
samer@0
|
28 double [] a, b;
|
samer@0
|
29 int k0, k1, k2;
|
samer@0
|
30
|
samer@0
|
31 public Stacker(Vec v, Task t, int size, int step) { this(v,t,size,step,v.size()); }
|
samer@0
|
32 public Stacker(Vec v, Task t, int size, int step, int height)
|
samer@0
|
33 {
|
samer@0
|
34 node = new Node("stacker");
|
samer@0
|
35
|
samer@0
|
36 Shell.push(node);
|
samer@0
|
37 srcvec=v; nextvec=t;
|
samer@0
|
38 this.size = size;
|
samer@0
|
39 this.step = step;
|
samer@0
|
40
|
samer@0
|
41 k0=height;
|
samer@0
|
42 k1=step*k0;
|
samer@0
|
43 k2=(size-step)*k0;
|
samer@0
|
44
|
samer@0
|
45 target = new VVector("output",k0*size);
|
samer@0
|
46 a = target.array();
|
samer@0
|
47 b = srcvec.array();
|
samer@0
|
48 Mathx.zero(a);
|
samer@0
|
49
|
samer@0
|
50 Shell.pop();
|
samer@0
|
51 }
|
samer@0
|
52
|
samer@0
|
53 public void dispose() {
|
samer@0
|
54 nextvec.dispose();
|
samer@0
|
55 target.dispose();
|
samer@0
|
56 a=b=null;
|
samer@0
|
57 }
|
samer@0
|
58
|
samer@0
|
59 public VVector output() { return target; }
|
samer@0
|
60
|
samer@0
|
61 public void starting() { nextvec.starting(); }
|
samer@0
|
62 public void stopping() { nextvec.stopping(); }
|
samer@0
|
63 public void run() throws Exception
|
samer@0
|
64 {
|
samer@0
|
65 // make some room in packed matrix
|
samer@0
|
66 System.arraycopy(a,k1,a,0,k2);
|
samer@0
|
67
|
samer@0
|
68 for (int i=0, j=k2; i<step; i++) {
|
samer@0
|
69 nextvec.run();
|
samer@0
|
70 // copy vec into packed matrix
|
samer@0
|
71 System.arraycopy(b,0,a,j,k0);
|
samer@0
|
72 j+=k0;
|
samer@0
|
73 }
|
samer@0
|
74 target.changed();
|
samer@0
|
75 }
|
samer@0
|
76 }
|