samer@0: /* samer@0: * RowColumn.java 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.maths; samer@0: samer@0: import samer.core.*; samer@0: import samer.core.types.*; samer@0: import samer.core.util.*; samer@0: import java.util.*; samer@0: samer@0: /** samer@0: Looks like a vector externally, but reads data samer@0: from a row or column of a matrix. Provides samer@0: commands for setting which row or column to use, samer@0: and for switching between rows and columns. samer@0: */ samer@0: samer@0: public class RowColumn extends VVector implements Mat, Observer samer@0: { samer@0: Matrix M; samer@0: VInteger num; samer@0: int rowcol; samer@0: Mat mat; samer@0: samer@0: public final static Object FLIPPED = new Object(); samer@0: public final static Object SWITCHED = new Object(); samer@0: samer@0: public RowColumn(Matrix A) { this( new Node("rowcolumn",A.getNode()), A); } samer@0: public RowColumn(Node n, Matrix A) samer@0: { samer@0: super(n,A.getColumn(0)); samer@0: samer@0: Shell.push(node); samer@0: M=A; rowcol=COL; samer@0: boolean rowwise=Shell.getBoolean("rowwise",(A.getRowDimension()==1)); samer@0: if (rowwise) { vec=A.getRow(0); rowcol=ROW; } samer@0: Shell.pop(); samer@0: samer@0: if (rowcol==ROW) createVRow(); samer@0: else createVColumn(); samer@0: samer@0: M.addObserver(this); samer@0: } samer@0: samer@0: // Vec implementation samer@0: public double[] array() { return null; } samer@0: public Vec getVec() { return this; } samer@0: public Mat mat() { if (mat==null) mat=vec.mat(); return this; } samer@0: samer@0: // Mat implementation samer@0: public int width() { return mat.width(); } samer@0: public int height() { return mat.height(); } samer@0: public double get( int i, int j) { return mat.get(i,j); } samer@0: public void set( int i, int j, double t) { mat.set(i,j,t); } samer@0: samer@0: private void createVRow() samer@0: { samer@0: Shell.push(getNode().getParent()); samer@0: num = new VInteger("row",0,Variable.NOINIT); samer@0: num.setRange(0,M.getRowDimension()-1); samer@0: num.addObserver(this); samer@0: Shell.registerViewable(num); samer@0: Shell.pop(); samer@0: } samer@0: samer@0: private void createVColumn() samer@0: { samer@0: Shell.push(getNode().getParent()); samer@0: num = new VInteger("column",0,Variable.NOINIT); samer@0: num.setRange(0,M.getColumnDimension()-1); samer@0: num.addObserver(this); samer@0: Shell.registerViewable(num); samer@0: Shell.pop(); samer@0: } samer@0: samer@0: public void dispose() samer@0: { samer@0: Shell.deregisterViewable(num); samer@0: M.deleteObserver(this); samer@0: num.dispose(); samer@0: super.dispose(); samer@0: } samer@0: samer@0: public void setNum(int n) { num.value=n; num.changed(); } samer@0: samer@0: public void setRow(int r) { samer@0: num.value=r; vec=M.getRow(r); samer@0: if (mat!=null) mat=vec.mat(); samer@0: if (rowcol==ROW) changed(SWITCHED); samer@0: else { rowcol=ROW; changed(FLIPPED); } samer@0: } samer@0: samer@0: public void setColumn(int r) { samer@0: num.value=r; vec=M.getColumn(r); samer@0: if (mat!=null) mat=vec.mat(); samer@0: if (rowcol==COL) changed(SWITCHED); samer@0: else { rowcol=COL; changed(FLIPPED); } samer@0: } samer@0: samer@0: public void getCommands(Agent.Registry r) { samer@0: super.getCommands(r); r.group(); samer@0: r.add("row").add("column").add("dispose"); samer@0: } samer@0: samer@0: public void execute(String cmd, Environment env) throws Exception samer@0: { samer@0: if (cmd.equals("row")) { samer@0: samer@0: if (rowcol==COL) { samer@0: num.deleteObserver(this); samer@0: num.dispose(); samer@0: createVRow(); samer@0: setRow(0); samer@0: } samer@0: samer@0: // no need to get number: num is automatically exposed samer@0: // env.datum().get(num); samer@0: samer@0: } else if (cmd.equals("column")) { samer@0: samer@0: if (rowcol==ROW) { samer@0: num.deleteObserver(this); samer@0: num.dispose(); samer@0: createVColumn(); samer@0: setColumn(0); samer@0: } samer@0: samer@0: // no need to get number: num is automatically exposed samer@0: // env.datum().get(num); samer@0: } else if (cmd.equals("dispose")) { samer@0: dispose(); samer@0: } else super.execute(cmd,env); samer@0: } samer@0: samer@0: public void notifyObservers(Object s) { samer@0: super.notifyObservers(s); samer@0: if (s!=Viewable.DISPOSING && s!=RowColumn.SWITCHED) { samer@0: M.changed(this); // pass notification onto matrix observers samer@0: } samer@0: } samer@0: samer@0: public void update(Observable o, Object s) { // &&& samer@0: if (M.equals(o)) { // Matrix changed samer@0: if (s==Viewable.DISPOSING) dispose(); samer@0: else if (s!=this) super.notifyObservers(this); samer@0: } else if (num.equals(o)) { samer@0: if (rowcol==ROW) setRow(num.value); samer@0: else setColumn(num.value); samer@0: } samer@0: } samer@0: samer@0: private final static int ROW = 1; samer@0: private final static int COL = 2; samer@0: }