samer@0: /* samer@0: * Copyright (c) 2000, Samer Abdallah, King's College London. samer@0: * All rights reserved. samer@0: * samer@0: * This software is provided AS iS and WITHOUT ANY WARRANTY; samer@0: * without even the implied warranty of MERCHANTABILITY or samer@0: * FITNESS FOR A PARTICULAR PURPOSE. samer@0: */ samer@0: samer@0: package samer.units; samer@0: import samer.core.*; samer@0: import samer.maths.*; samer@0: import samer.tools.*; samer@0: samer@0: /* samer@0: * Takes successive input vectors and stacks them into samer@0: * one big output vector. Requires a task which it will samer@0: * run to obtain each input vector. samer@0: */ samer@0: samer@0: public class Stacker implements Task samer@0: { samer@0: Node node; samer@0: Task nextvec; samer@0: Vec srcvec; samer@0: int size, step; samer@0: VVector target; samer@0: double [] a, b; samer@0: int k0, k1, k2; samer@0: samer@0: public Stacker(Vec v, Task t, int size, int step) { this(v,t,size,step,v.size()); } samer@0: public Stacker(Vec v, Task t, int size, int step, int height) samer@0: { samer@0: node = new Node("stacker"); samer@0: samer@0: Shell.push(node); samer@0: srcvec=v; nextvec=t; samer@0: this.size = size; samer@0: this.step = step; samer@0: samer@0: k0=height; samer@0: k1=step*k0; samer@0: k2=(size-step)*k0; samer@0: samer@0: target = new VVector("output",k0*size); samer@0: a = target.array(); samer@0: b = srcvec.array(); samer@0: Mathx.zero(a); samer@0: samer@0: Shell.pop(); samer@0: } samer@0: samer@0: public void dispose() { samer@0: nextvec.dispose(); samer@0: target.dispose(); samer@0: a=b=null; samer@0: } samer@0: samer@0: public VVector output() { return target; } samer@0: samer@0: public void starting() { nextvec.starting(); } samer@0: public void stopping() { nextvec.stopping(); } samer@0: public void run() throws Exception samer@0: { samer@0: // make some room in packed matrix samer@0: System.arraycopy(a,k1,a,0,k2); samer@0: samer@0: for (int i=0, j=k2; i