コード例 #1
0
ファイル: Outer.java プロジェクト: AlexOcculate/purdue-fastr
 // an attempt for performance improvement: but does not seem faster for now
 public static RInt expandXVectorCacheFriendly(IntImpl xarg, int xsize, int count) {
     int nsize = xsize * count;
     int[] x = xarg.getContent();
     int[] res = new int[nsize];
     int offset = 0;
     int rep = 0;
     int lastOffset = 0;
     if (rep < count) {
         System.arraycopy(x, 0, res, offset, xsize);
         lastOffset = offset;
         offset += xsize;
     }
     for (rep = 1; rep < count; rep++) {
         System.arraycopy(res, lastOffset, res, offset, xsize);
         lastOffset = offset;
         offset += xsize;
     }
     return RInt.RIntFactory.getFor(res);
 }
コード例 #2
0
ファイル: Outer.java プロジェクト: AlexOcculate/purdue-fastr
 public static RDouble expandXVector(DoubleImpl xarg, int xsize, int count) {
     int nsize = xsize * count;
     double[] x = xarg.getContent();
     double[] res = new double[nsize];
     int offset = 0;
     for (int rep = 0; rep < count; rep++) {
         System.arraycopy(x, 0, res, offset, xsize);
         offset += xsize;
     }
     return RDouble.RDoubleFactory.getFor(res);
 }
コード例 #3
0
ファイル: Outer.java プロジェクト: AlexOcculate/purdue-fastr
 public static RInt expandXVector(IntImpl xarg, int xsize, int count) {
     int nsize = xsize * count;
     int[] x = xarg.getContent();
     int[] res = new int[nsize];
     int offset = 0;
     for (int rep = 0; rep < count; rep++) {
         System.arraycopy(x, 0, res, offset, xsize);
         offset += xsize;
     }
     return RInt.RIntFactory.getFor(res);
 }
コード例 #4
0
ファイル: Outer.java プロジェクト: AlexOcculate/purdue-fastr
        public RAny outer(Frame frame, RAny xarg, RAny yarg, RAny farg) {
            // LICENSE: transcribed code from GNU R, which is licensed under GPL

            if (!(xarg instanceof RArray && yarg instanceof RArray)) {
                Utils.nyi("unsupported type");
                return null;
            }

            RArray x = (RArray) xarg;
            RArray y = (RArray) yarg;

            int xsize = x.size();
            int ysize = y.size();

            RArray expy;
            RArray expx;

            if (EAGER) {
                x = x.materialize(); // FIXME: probably unnecessary (both x and y), could be done on-the-fly in the expansion methods
                y = y.materialize();
                if (y instanceof DoubleImpl) {
                    expy = expandYVector((DoubleImpl) y, ysize, xsize);
                } else if (y instanceof IntImpl) {
                    expy = expandYVector((IntImpl) y, ysize, xsize);
                } else {
                    expy = expandYVector(y, ysize, xsize);
                }

                if (xsize > 0) {
                    if (x instanceof DoubleImpl) {
                        expx = expandXVector((DoubleImpl) x, xsize, ysize);
                    } else if (x instanceof IntImpl) {
                        expx = expandXVector((IntImpl) x, xsize, ysize);
                    } else {
                        expx = expandXVector(x, xsize, ysize);
                    }
                } else {
                    expx = x;
                }
            } else {
                if (y instanceof RInt) {
                    expy = lazyExpandYVector((RInt) y, ysize, xsize);
                } else {
                    throw Utils.nyi();
                }
                if (xsize > 0) {
                    if (x instanceof RInt) {
                        expx = lazyExpandXVector((RInt) x, xsize, ysize);
                    } else {
                        throw Utils.nyi();
                    }
                } else {
                    expx = x;
                }
            }

            xArgProvider.setValue(expx);
            yArgProvider.setValue(expy);
            callableProvider.matchAndSet(frame, farg);
            RArray res = (RArray) callNode.execute(frame);

            int[] dimx = x.dimensions();
            int[] dimy = y.dimensions();

            int[] dim;
            if (dimx == null) {
                if (dimy == null) {
                    dim = new int[]{xsize, ysize};
                } else {
                    dim = new int[1 + dimy.length];
                    dim[0] = xsize;
                    System.arraycopy(dimy, 0, dim, 1, dimy.length);
                }
            } else {
                if (dimy == null) {
                    dim = new int[dimx.length + 1];
                    System.arraycopy(dimx, 0, dim, 0, dimx.length);
                    dim[dimx.length] = ysize;
                } else {
                    dim = new int[dimx.length + dimy.length];
                    System.arraycopy(dimx, 0, dim, 0, dimx.length);
                    System.arraycopy(dimy, 0, dim, dimx.length, dimy.length);
                }
            }
            return res.setDimensions(dim); // triggers materialization of the result
        }