RLPark 1.0.0
Reinforcement Learning Framework in Java
|
00001 package rlpark.plugin.rltoys.math.vector.filters; 00002 00003 import rlpark.plugin.rltoys.math.vector.MutableVector; 00004 import rlpark.plugin.rltoys.math.vector.RealVector; 00005 import rlpark.plugin.rltoys.math.vector.SparseVector; 00006 import rlpark.plugin.rltoys.math.vector.implementations.PVector; 00007 import rlpark.plugin.rltoys.utils.NotImplemented; 00008 00009 public class Filters { 00010 interface FilteredOperation { 00011 MutableVector operate(); 00012 00013 MutableVector sparseOperate(int[] indexes, int nbActive); 00014 } 00015 00016 private static MutableVector operate(FilteredOperation operation, RealVector filter) { 00017 if (filter instanceof SparseVector) { 00018 SparseVector sfilter = (SparseVector) filter; 00019 return operation.sparseOperate(sfilter.nonZeroIndexes(), sfilter.nonZeroElements()); 00020 } 00021 return operation.operate(); 00022 } 00023 00024 public static MutableVector minToSelf(final MutableVector result, final RealVector other, RealVector filter) { 00025 FilteredOperation minOperation = new FilteredOperation() { 00026 @Override 00027 public MutableVector sparseOperate(int[] indexes, int nbActive) { 00028 for (int i = 0; i < nbActive; i++) { 00029 int index = indexes[i]; 00030 result.setEntry(index, Math.min(result.getEntry(index), other.getEntry(index))); 00031 } 00032 return result; 00033 } 00034 00035 @Override 00036 public MutableVector operate() { 00037 int dimension = result.getDimension(); 00038 for (int index = 0; index < dimension; index++) 00039 result.setEntry(index, Math.min(result.getEntry(index), other.getEntry(index))); 00040 return result; 00041 } 00042 }; 00043 return operate(minOperation, filter); 00044 } 00045 00046 public static MutableVector maxToSelf(final MutableVector result, final RealVector other, RealVector filter) { 00047 FilteredOperation maxOperation = new FilteredOperation() { 00048 @Override 00049 public MutableVector sparseOperate(int[] indexes, int nbActive) { 00050 for (int i = 0; i < nbActive; i++) { 00051 int index = indexes[i]; 00052 result.setEntry(index, Math.max(result.getEntry(index), other.getEntry(index))); 00053 } 00054 return result; 00055 } 00056 00057 @Override 00058 public MutableVector operate() { 00059 int dimension = result.getDimension(); 00060 for (int index = 0; index < dimension; index++) 00061 result.setEntry(index, Math.max(result.getEntry(index), other.getEntry(index))); 00062 return result; 00063 } 00064 }; 00065 return operate(maxOperation, filter); 00066 } 00067 00068 public static MutableVector maxToSelf(final MutableVector result, final double other, RealVector filter) { 00069 FilteredOperation maxOperation = new FilteredOperation() { 00070 @Override 00071 public MutableVector sparseOperate(int[] indexes, int nbActive) { 00072 for (int i = 0; i < nbActive; i++) { 00073 int index = indexes[i]; 00074 result.setEntry(index, Math.max(result.getEntry(index), other)); 00075 } 00076 return result; 00077 } 00078 00079 @Override 00080 public MutableVector operate() { 00081 int dimension = result.getDimension(); 00082 for (int index = 0; index < dimension; index++) 00083 result.setEntry(index, Math.max(result.getEntry(index), other)); 00084 return result; 00085 } 00086 }; 00087 return operate(maxOperation, filter); 00088 } 00089 00090 public static MutableVector minToSelf(final MutableVector result, final double other, RealVector filter) { 00091 FilteredOperation maxOperation = new FilteredOperation() { 00092 @Override 00093 public MutableVector sparseOperate(int[] indexes, int nbActive) { 00094 for (int i = 0; i < nbActive; i++) { 00095 int index = indexes[i]; 00096 result.setEntry(index, Math.min(result.getEntry(index), other)); 00097 } 00098 return result; 00099 } 00100 00101 @Override 00102 public MutableVector operate() { 00103 int dimension = result.getDimension(); 00104 for (int index = 0; index < dimension; index++) 00105 result.setEntry(index, Math.min(result.getEntry(index), other)); 00106 return result; 00107 } 00108 }; 00109 return operate(maxOperation, filter); 00110 } 00111 00112 public static MutableVector boundAbsToSelf(final MutableVector result, final double other, RealVector filter) { 00113 FilteredOperation maxOperation = new FilteredOperation() { 00114 @Override 00115 public MutableVector sparseOperate(int[] indexes, int nbActive) { 00116 for (int i = 0; i < nbActive; i++) { 00117 int index = indexes[i]; 00118 result.setEntry(index, boundValue(result.getEntry(index))); 00119 } 00120 return result; 00121 } 00122 00123 @Override 00124 public MutableVector operate() { 00125 int dimension = result.getDimension(); 00126 for (int index = 0; index < dimension; index++) 00127 result.setEntry(index, boundValue(result.getEntry(index))); 00128 return result; 00129 } 00130 00131 public double boundValue(double value) { 00132 return Math.min(Math.abs(value), other) * Math.signum(value); 00133 } 00134 }; 00135 return operate(maxOperation, filter); 00136 } 00137 00138 public static MutableVector mapMultiplyToSelf(final PVector result, final double d, RealVector filter) { 00139 FilteredOperation mapMultiplySelfOperation = new FilteredOperation() { 00140 @Override 00141 public MutableVector sparseOperate(int[] indexes, int nbActive) { 00142 for (int i = 0; i < nbActive; i++) 00143 result.data[indexes[i]] *= d; 00144 return result; 00145 } 00146 00147 @Override 00148 public MutableVector operate() { 00149 return result.mapMultiplyToSelf(d); 00150 } 00151 }; 00152 return operate(mapMultiplySelfOperation, filter); 00153 } 00154 00155 public static MutableVector mapDivideToSelf(final PVector result, final double d, RealVector filter) { 00156 FilteredOperation mapDivideSelfOperation = new FilteredOperation() { 00157 @Override 00158 public MutableVector sparseOperate(int[] indexes, int nbActive) { 00159 for (int i = 0; i < nbActive; i++) 00160 result.data[indexes[i]] /= d; 00161 return result; 00162 } 00163 00164 @Override 00165 public MutableVector operate() { 00166 return result.mapMultiplyToSelf(1 / d); 00167 } 00168 }; 00169 return operate(mapDivideSelfOperation, filter); 00170 } 00171 00172 public static MutableVector ebeDivideToSelf(final MutableVector result, final RealVector arg, RealVector filter) { 00173 FilteredOperation mapDivideSelfOperation = new FilteredOperation() { 00174 @Override 00175 public MutableVector sparseOperate(int[] indexes, int nbActive) { 00176 for (int i = 0; i < nbActive; i++) { 00177 int entryIndex = indexes[i]; 00178 result.setEntry(entryIndex, result.getEntry(entryIndex) / arg.getEntry(entryIndex)); 00179 } 00180 return result; 00181 } 00182 00183 @Override 00184 public MutableVector operate() { 00185 return result.ebeDivideToSelf(arg); 00186 } 00187 }; 00188 return operate(mapDivideSelfOperation, filter); 00189 } 00190 00191 public static MutableVector powToSelf(final PVector result, final double b, RealVector filter) { 00192 FilteredOperation powSelfOperation = new FilteredOperation() { 00193 @Override 00194 public MutableVector sparseOperate(int[] indexes, int nbActive) { 00195 for (int i = 0; i < nbActive; i++) { 00196 int entryIndex = indexes[i]; 00197 double previousValue = result.getEntry(entryIndex); 00198 double resultValue = Math.pow(previousValue, b); 00199 result.setEntry(entryIndex, resultValue); 00200 } 00201 return result; 00202 } 00203 00204 @Override 00205 public MutableVector operate() { 00206 throw new NotImplemented(); 00207 } 00208 }; 00209 return operate(powSelfOperation, filter); 00210 } 00211 }