RLPark 1.0.0
Reinforcement Learning Framework in Java

PVector.java

Go to the documentation of this file.
00001 package rlpark.plugin.rltoys.math.vector.implementations;
00002 
00003 import java.util.Arrays;
00004 
00005 import rlpark.plugin.rltoys.math.vector.BinaryVector;
00006 import rlpark.plugin.rltoys.math.vector.DenseVector;
00007 import rlpark.plugin.rltoys.math.vector.MutableVector;
00008 import rlpark.plugin.rltoys.math.vector.RealVector;
00009 import rlpark.plugin.rltoys.math.vector.SparseVector;
00010 import zephyr.plugin.core.api.monitoring.abstracts.DataMonitor;
00011 import zephyr.plugin.core.api.monitoring.abstracts.MonitorContainer;
00012 import zephyr.plugin.core.api.monitoring.abstracts.Monitored;
00013 import zephyr.plugin.core.api.monitoring.annotations.Monitor;
00014 
00015 @Monitor
00016 public class PVector extends AbstractVector implements DenseVector, MonitorContainer {
00017   private static final long serialVersionUID = -3114589590234820246L;
00018 
00019   final public double[] data;
00020 
00021   public PVector(int m) {
00022     super(m);
00023     data = new double[m];
00024   }
00025 
00026   public PVector(double... v) {
00027     this(v, false);
00028   }
00029 
00030   public PVector(double[] d, boolean copyArray) {
00031     super(d.length);
00032     data = copyArray ? d.clone() : d;
00033   }
00034 
00035   public PVector(RealVector v) {
00036     super(v.getDimension());
00037     data = new double[v.getDimension()];
00038     for (int i = 0; i < data.length; ++i)
00039       data[i] = v.getEntry(i);
00040   }
00041 
00042 
00043   @Override
00044   public MutableVector set(RealVector other, int start) {
00045     if (other instanceof DenseVector)
00046       return set(((DenseVector) other).accessData(), start);
00047     for (int i = 0; i < other.getDimension(); i++)
00048       data[i] = other.getEntry(i);
00049     return this;
00050   }
00051 
00052   @Override
00053   public MutableVector set(RealVector other) {
00054     return set(other, 0);
00055   }
00056 
00057   public PVector set(double[] v, int start) {
00058     System.arraycopy(v, 0, data, start, v.length);
00059     return this;
00060   }
00061 
00062   @Override
00063   public PVector copy() {
00064     return new PVector(Arrays.copyOf(data, size));
00065   }
00066 
00067   @Override
00068   public PVector subtractToSelf(RealVector other) {
00069     if (other instanceof SparseVector) {
00070       ((SparseVector) other).subtractSelfTo(data);
00071       return this;
00072     }
00073     double[] o = ((DenseVector) other).accessData();
00074     for (int i = 0; i < data.length; i++)
00075       data[i] -= o[i];
00076     return this;
00077   }
00078 
00079   @Override
00080   public MutableVector addToSelf(RealVector other) {
00081     if (other instanceof SparseVector) {
00082       ((SparseVector) other).addSelfTo(data);
00083       return this;
00084     }
00085     double[] o = ((DenseVector) other).accessData();
00086     for (int i = 0; i < data.length; i++)
00087       data[i] += o[i];
00088     return this;
00089   }
00090 
00091   @Override
00092   public double dotProduct(RealVector other) {
00093     if (other instanceof SparseVector)
00094       return ((SparseVector) other).dotProduct(data);
00095     if (other instanceof VectorNull)
00096       return 0;
00097     double result = 0;
00098     double[] o = ((PVector) other).data;
00099     for (int i = 0; i < data.length; i++)
00100       result += data[i] * o[i];
00101     return result;
00102   }
00103 
00104   @Override
00105   public double getEntry(int i) {
00106     return data[i];
00107   }
00108 
00109   @Override
00110   public MutableVector newInstance(int size) {
00111     return new PVector(size);
00112   }
00113 
00114   @Override
00115   public PVector set(double d) {
00116     Arrays.fill(data, d);
00117     return this;
00118   }
00119 
00120   @Override
00121   public void setEntry(int i, double d) {
00122     data[i] = d;
00123   }
00124 
00125   @Override
00126   public MutableVector mapMultiplyToSelf(double d) {
00127     for (int i = 0; i < data.length; i++)
00128       data[i] *= d;
00129     return this;
00130   }
00131 
00132   @Override
00133   public double[] accessData() {
00134     return data;
00135   }
00136 
00137   public void addToSelf(double[] array) {
00138     assert array.length == size;
00139     for (int i = 0; i < array.length; i++)
00140       data[i] += array[i];
00141   }
00142 
00143   @Override
00144   public MutableVector ebeDivideToSelf(RealVector v) {
00145     for (int i = 0; i < data.length; i++) {
00146       double value = data[i];
00147       if (value != 0)
00148         data[i] = value / v.getEntry(i);
00149     }
00150     return this;
00151   }
00152 
00153   @Override
00154   public MutableVector ebeMultiplyToSelf(RealVector v) {
00155     if (v instanceof PVector)
00156       return ebeMultiplyToSelf(((PVector) v).data);
00157     for (int i = 0; i < data.length; i++)
00158       data[i] *= v.getEntry(i);
00159     return this;
00160   }
00161 
00162   private MutableVector ebeMultiplyToSelf(double[] other) {
00163     for (int i = 0; i < other.length; i++)
00164       data[i] *= other[i];
00165     return this;
00166   }
00167 
00168   @Override
00169   public MutableVector copyAsMutable() {
00170     return copy();
00171   }
00172 
00173   @Override
00174   public PVector addToSelf(double factor, RealVector vect) {
00175     if (vect instanceof BinaryVector) {
00176       addBinaryToSelf(factor, (BinaryVector) vect);
00177       return this;
00178     }
00179     if (vect instanceof SVector) {
00180       ((SVector) vect).addSelfTo(factor, data);
00181       return this;
00182     }
00183     for (int i = 0; i < vect.getDimension(); i++)
00184       data[i] += factor * vect.getEntry(i);
00185     return this;
00186   }
00187 
00188   private void addBinaryToSelf(double factor, BinaryVector vect) {
00189     int[] activeIndexes = vect.getActiveIndexes();
00190     int nbActives = vect.nonZeroElements();
00191     for (int i = 0; i < nbActives; i++)
00192       data[activeIndexes[i]] += factor;
00193   }
00194 
00195   @Override
00196   public String toString() {
00197     return Arrays.toString(data);
00198   }
00199 
00200   @Override
00201   public PVector clear() {
00202     Arrays.fill(data, 0);
00203     return this;
00204   }
00205 
00206   @Override
00207   public void addToMonitor(DataMonitor monitor) {
00208     monitor.add("l1Norm", new Monitored() {
00209       @Override
00210       public double monitoredValue() {
00211         return Vectors.l1Norm(PVector.this);
00212       }
00213     });
00214     monitor.add("infNorm", new Monitored() {
00215       @Override
00216       public double monitoredValue() {
00217         return Vectors.infNorm(PVector.this);
00218       }
00219     });
00220   }
00221 
00222   @Override
00223   public double sum() {
00224     double sum = 0;
00225     for (double v : data)
00226       sum += v;
00227     return sum;
00228   }
00229 
00230   public double min() {
00231     double min = Double.MAX_VALUE;
00232     for (double v : data)
00233       if (v < min)
00234         min = v;
00235     return min;
00236   }
00237 }
 All Classes Namespaces Files Functions Variables Enumerations
Zephyr
RLPark