RLPark 1.0.0
Reinforcement Learning Framework in Java
|
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 }