RLPark 1.0.0
Reinforcement Learning Framework in Java
|
00001 package rlpark.plugin.rltoys.math.vector.implementations; 00002 00003 00004 import rlpark.plugin.rltoys.math.vector.MutableVector; 00005 import rlpark.plugin.rltoys.math.vector.RealVector; 00006 import rlpark.plugin.rltoys.utils.NotImplemented; 00007 import rlpark.plugin.rltoys.utils.Utils; 00008 00009 public class Vectors { 00010 static public boolean equals(RealVector a, RealVector b) { 00011 return equals(a, b, 0); 00012 } 00013 00014 static public double diff(RealVector a, RealVector b) { 00015 double diff = 0; 00016 for (int i = 0; i < a.getDimension(); ++i) 00017 diff = Math.max(diff, Math.abs(a.getEntry(i) - b.getEntry(i))); 00018 return diff; 00019 } 00020 00021 static public boolean equals(RealVector a, RealVector b, double margin) { 00022 if (a == b) 00023 return true; 00024 if (a != null && b == null || a == null && b != null) 00025 return false; 00026 if (a.getDimension() != b.getDimension()) 00027 return false; 00028 for (int i = 0; i < a.getDimension(); i++) { 00029 final double diff = Math.abs(a.getEntry(i) - b.getEntry(i)); 00030 if (diff > margin) 00031 return false; 00032 } 00033 return true; 00034 } 00035 00036 public static boolean checkValues(RealVector v) { 00037 final double[] data = (v instanceof SVector) ? ((SVector) v).values : v.accessData(); 00038 final int nbChecks = (v instanceof SVector) ? ((SVector) v).nonZeroElements() : v.getDimension(); 00039 for (int i = 0; i < nbChecks; i++) 00040 if (!Utils.checkValue(data[i])) 00041 return false; 00042 return true; 00043 } 00044 00045 static public MutableVector absToSelf(MutableVector v) { 00046 if (v instanceof SVector) { 00047 absToSelf(((SVector) v).values, ((SVector) v).nbActive); 00048 return v; 00049 } 00050 if (v instanceof PVector) { 00051 absToSelf(((PVector) v).data, v.getDimension()); 00052 return v; 00053 } 00054 throw new NotImplemented(); 00055 } 00056 00057 static public void absToSelf(double[] data, int length) { 00058 for (int i = 0; i < length; i++) 00059 data[i] = Math.abs(data[i]); 00060 } 00061 00062 static public double l1Norm(RealVector v) { 00063 if (v instanceof BVector) 00064 return ((BVector) v).nonZeroElements(); 00065 double[] data; 00066 int length; 00067 if (v instanceof SVector) { 00068 SVector sv = (SVector) v; 00069 data = sv.values; 00070 length = sv.nonZeroElements(); 00071 } else { 00072 data = v.accessData(); 00073 length = data.length; 00074 } 00075 double sum = 0.0; 00076 for (int i = 0; i < length; i++) 00077 sum += Math.abs(data[i]); 00078 return sum; 00079 } 00080 00081 public static double infNorm(RealVector v) { 00082 if (v instanceof BVector) 00083 return ((BVector) v).nonZeroElements() > 0 ? 1 : 0; 00084 double[] data; 00085 int length; 00086 if (v instanceof SVector) { 00087 SVector sv = (SVector) v; 00088 data = sv.values; 00089 length = sv.nonZeroElements(); 00090 } else { 00091 data = v.accessData(); 00092 length = data.length; 00093 } 00094 double max = 0.0; 00095 for (int i = 0; i < length; i++) 00096 max = Math.max(max, Math.abs(data[i])); 00097 return max; 00098 } 00099 00100 public static MutableVector toBinary(MutableVector result, RealVector v) { 00101 assert result.getDimension() == v.getDimension(); 00102 result.clear(); 00103 if (v instanceof SVector) { 00104 SVector sv = (SVector) v; 00105 for (int i = 0; i < sv.nonZeroElements(); i++) 00106 result.setEntry(sv.activeIndexes[i], 1); 00107 return result; 00108 } 00109 double[] data = v.accessData(); 00110 for (int i = 0; i < data.length; i++) 00111 if (data[i] != 0) 00112 result.setEntry(i, 1); 00113 return result; 00114 } 00115 00116 public static boolean isNull(RealVector v) { 00117 for (double value : v.accessData()) 00118 if (value != 0) 00119 return false; 00120 return true; 00121 } 00122 00123 public static MutableVector maxToSelf(MutableVector result, RealVector other) { 00124 for (int i = 0; i < result.getDimension(); i++) 00125 result.setEntry(i, Math.max(result.getEntry(i), other.getEntry(i))); 00126 return result; 00127 } 00128 00129 public static MutableVector positiveMaxToSelf(MutableVector result, RealVector other) { 00130 if (other instanceof SVector) 00131 return positiveMaxToSelf(result, (SVector) other); 00132 return maxToSelf(result, other); 00133 } 00134 00135 private static MutableVector positiveMaxToSelf(MutableVector result, SVector sother) { 00136 for (int position = 0; position < sother.nonZeroElements(); position++) { 00137 final int index = sother.activeIndexes[position]; 00138 result.setEntry(index, Math.max(result.getEntry(index), sother.values[position])); 00139 } 00140 return result; 00141 } 00142 00143 public static RealVector bufferedCopy(RealVector source, RealVector target) { 00144 if (source == null) { 00145 if (target != null) 00146 if (target instanceof BVector) 00147 ((BVector) target).clear(); 00148 else 00149 ((MutableVector) target).clear(); 00150 return target; 00151 } 00152 RealVector result = target != null ? target : source.copy(); 00153 if (result instanceof BVector) 00154 ((BVector) result).set((BVector) source); 00155 else 00156 ((MutableVector) result).set(source); 00157 return result; 00158 } 00159 }