From 378e91342c056e4c29a2046a16de2e5468ceb9aa Mon Sep 17 00:00:00 2001 From: Zbynek Slajchrt <zbynek.slajchrt@oracle.com> Date: Tue, 23 Aug 2016 12:38:33 +0200 Subject: [PATCH] Arg reimplemented using UnaryArithmeticBuiltinNode and Arg tests un-ignored --- .../truffle/r/nodes/builtin/base/Arg.java | 121 ++++++------------ .../r/test/builtins/TestBuiltin_Arg.java | 16 +-- 2 files changed, 48 insertions(+), 89 deletions(-) diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Arg.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Arg.java index 1e79286928..36e527030a 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Arg.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Arg.java @@ -22,8 +22,8 @@ */ package com.oracle.truffle.r.nodes.builtin.base; -import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.numericValue; import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.complexValue; +import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.numericValue; import static com.oracle.truffle.r.runtime.RDispatch.COMPLEX_GROUP_GENERIC; import static com.oracle.truffle.r.runtime.builtins.RBehavior.PURE; import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.PRIMITIVE; @@ -34,6 +34,8 @@ import com.oracle.truffle.r.nodes.builtin.CastBuilder; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; import com.oracle.truffle.r.runtime.RError; import com.oracle.truffle.r.runtime.RRuntime; +import com.oracle.truffle.r.nodes.unary.UnaryArithmeticBuiltinNode; +import com.oracle.truffle.r.runtime.RType; import com.oracle.truffle.r.runtime.builtins.RBuiltin; import com.oracle.truffle.r.runtime.data.RComplex; import com.oracle.truffle.r.runtime.data.RDataFactory; @@ -44,116 +46,75 @@ import com.oracle.truffle.r.runtime.data.model.RAbstractLogicalVector; import com.oracle.truffle.r.runtime.ops.na.NACheck; @RBuiltin(name = "Arg", kind = PRIMITIVE, parameterNames = {"z"}, dispatch = COMPLEX_GROUP_GENERIC, behavior = PURE) -public abstract class Arg extends RBuiltinNode { +public abstract class Arg extends UnaryArithmeticBuiltinNode { - private final ConditionProfile signumProfile = ConditionProfile.createBinaryProfile(); - private final NACheck naCheck = NACheck.create(); + public Arg() { + super(RType.Double, RError.Message.NON_NUMERIC_ARGUMENT_FUNCTION, null); + } @Override protected void createCasts(CastBuilder casts) { casts.arg("z").mustBe(numericValue().or(complexValue()), RError.Message.NON_NUMERIC_ARGUMENT_FUNCTION); } - @Specialization - protected double arg(double z) { - naCheck.enable(z); - if (naCheck.check(z)) { - return RRuntime.DOUBLE_NA; - } - if (signumProfile.profile(z >= 0)) { - return 0; - } else { - return Math.PI; + @Override + public RType calculateResultType(RType argumentType) { + switch (argumentType) { + case Complex: + return RType.Double; + default: + return super.calculateResultType(argumentType); } } - @Specialization - protected RAbstractDoubleVector arg(RAbstractDoubleVector v) { - double[] result = new double[v.getLength()]; - - naCheck.enable(v); - for (int i = 0; i < v.getLength(); i++) { - double z = v.getDataAt(i); - if (naCheck.check(z)) { - result[i] = RRuntime.DOUBLE_NA; - } else { - result[i] = z >= 0 ? 0 : Math.PI; - } - } + @Override + public int op(byte op) { + return 0; + } - return RDataFactory.createDoubleVector(result, v.isComplete()); + @Override + public int op(int op) { + return op; } - @Specialization - protected double arg(int z) { - naCheck.enable(z); - if (naCheck.check(z)) { - return RRuntime.DOUBLE_NA; - } - if (signumProfile.profile(z >= 0)) { + @Override + public double op(double op) { + if (op >= 0) { return 0; } else { return Math.PI; } } - @Specialization - protected RAbstractDoubleVector arg(RAbstractIntVector v) { - double[] result = new double[v.getLength()]; + @Override + public double opd(double re, double im) { + return Math.atan2(im, re); + } - naCheck.enable(v); - for (int i = 0; i < v.getLength(); i++) { - int z = v.getDataAt(i); - if (naCheck.check(z)) { - result[i] = RRuntime.DOUBLE_NA; - } else { - result[i] = z >= 0 ? 0 : Math.PI; - } - } + private final ConditionProfile signumProfile = ConditionProfile.createBinaryProfile(); + private final NACheck naCheck = NACheck.create(); - return RDataFactory.createDoubleVector(result, v.isComplete()); + @Override + protected void createCasts(CastBuilder casts) { + casts.arg("z").mustBe(numericValue().or(complexValue()), RError.Message.NON_NUMERIC_ARGUMENT_FUNCTION); } @Specialization - protected double arg(byte z) { + protected double arg(double z) { naCheck.enable(z); if (naCheck.check(z)) { return RRuntime.DOUBLE_NA; } - return 0; - } - - @Specialization - protected RAbstractDoubleVector arg(RAbstractLogicalVector v) { - double[] result = new double[v.getLength()]; - - naCheck.enable(v); - for (int i = 0; i < v.getLength(); i++) { - int z = v.getDataAt(i); - if (naCheck.check(z)) { - result[i] = RRuntime.DOUBLE_NA; - } else { - result[i] = 0; - } + if (signumProfile.profile(z >= 0)) { + return 0; + } else { + return Math.PI; } - - return RDataFactory.createDoubleVector(result, v.isComplete()); } @Specialization - protected RAbstractDoubleVector arg(RAbstractComplexVector v) { - double[] result = new double[v.getLength()]; - - naCheck.enable(v); - for (int i = 0; i < v.getLength(); i++) { - RComplex z = v.getDataAt(i); - if (naCheck.check(z)) { - result[i] = RRuntime.DOUBLE_NA; - } else { - result[i] = Math.atan2(z.getImaginaryPart(), z.getRealPart()); - } - } - - return RDataFactory.createDoubleVector(result, v.isComplete()); + @Override + public Object calculateUnboxed(Object op) { + return super.calculateUnboxed(op); } } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_Arg.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_Arg.java index b896511b88..0568155a69 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_Arg.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_Arg.java @@ -19,38 +19,36 @@ public class TestBuiltin_Arg extends TestBase { @Test public void testArg1() { - assertEval(Ignored.Unknown, "argv <- list(1+2i);Arg(argv[[1]]);"); + assertEval("argv <- list(1+2i);Arg(argv[[1]]);"); } @Test public void testArg2() { - assertEval(Ignored.Unknown, - "argv <- list(c(1554.86976865791+337.57296578684i, 1953.0195914094+434.16395869265i, 2020.8001333202+267.40279521531i, 12019.4947666225+397.6223289386i, 40989.2104557418+1079.1450107273i, 59779.5384921205+1460.5074297272i, 40703.4141691824+1049.8100128697i, 12234.4562968499+469.0052365648i, 2311.58538965355+142.56529231224i, 2158.93441543181+94.80017111005i, 2768.79882180339+256.05759156168i, 3234.20673958634+282.64174433659i, 2796.76248579155+64.23534085425i, 2030.22757739534-164.56566766766i, 1522.09271008314-273.51503749101i, 1109.23177636373-215.24298332377i, 714.154122222449-75.284630456206i, 509.684427096512-24.577531288476i, 628.214718823948+42.431050163574i, 1053.2295477549+190.4802567974i, 1388.73708931304+133.04405268816i, 1213.97041311196-135.67196064028i, 790.469479873384-232.737914916798i, 503.424076694357-99.275737105817i, 430.214847703846+45.250156289826i, 640.795334515383+121.961327286573i, 794.927869993865+100.643091831764i, 554.394621183915-15.753680159958i, 286.476583987294-104.634488576316i, 232.82067569803-92.469328935268i, 229.472155078088-54.85406188579i, 253.438957119958-65.123390974834i, 285.141954428461-79.653095359009i, 257.168942241366-34.332533775171i, 214.215071612655+18.001149572355i, 199.882436088191+0i));Arg(argv[[1]]);"); + assertEval("argv <- list(c(1554.86976865791+337.57296578684i, 1953.0195914094+434.16395869265i, 2020.8001333202+267.40279521531i, 12019.4947666225+397.6223289386i, 40989.2104557418+1079.1450107273i, 59779.5384921205+1460.5074297272i, 40703.4141691824+1049.8100128697i, 12234.4562968499+469.0052365648i, 2311.58538965355+142.56529231224i, 2158.93441543181+94.80017111005i, 2768.79882180339+256.05759156168i, 3234.20673958634+282.64174433659i, 2796.76248579155+64.23534085425i, 2030.22757739534-164.56566766766i, 1522.09271008314-273.51503749101i, 1109.23177636373-215.24298332377i, 714.154122222449-75.284630456206i, 509.684427096512-24.577531288476i, 628.214718823948+42.431050163574i, 1053.2295477549+190.4802567974i, 1388.73708931304+133.04405268816i, 1213.97041311196-135.67196064028i, 790.469479873384-232.737914916798i, 503.424076694357-99.275737105817i, 430.214847703846+45.250156289826i, 640.795334515383+121.961327286573i, 794.927869993865+100.643091831764i, 554.394621183915-15.753680159958i, 286.476583987294-104.634488576316i, 232.82067569803-92.469328935268i, 229.472155078088-54.85406188579i, 253.438957119958-65.123390974834i, 285.141954428461-79.653095359009i, 257.168942241366-34.332533775171i, 214.215071612655+18.001149572355i, 199.882436088191+0i));Arg(argv[[1]]);"); } @Test public void testArg3() { - assertEval(Ignored.Unknown, - "argv <- list(c(-12.561836573133-726.935211685406i, -19.15961591777-1315.40822424617i, -666.84872452586-2013.90899841237i, -5775.9038598237-11495.8986046958i, -19052.0606820086-36788.5714510618i, -27954.209922899-52600.8398855356i, -19930.6456597181-35739.3494902644i, -7168.9170917163-10787.9325286278i, -2331.00733468417-1545.77448035635i, -1953.77845230855-212.90200115993i, -1953.60071030304+1420.43983282655i, -1700.4015174326+2765.31423009739i, -862.10275212019+2693.95914108523i, 163.24691179114+1837.1971341258i, 824.29498680332+1155.03126302727i, 939.495937605926+679.549172893055i, 686.101881005818+305.166761591578i, 460.339323160381-14.067413050801i, 533.688543397269-293.997358985575i, 773.041200043657-698.096300485637i, 716.84959340189-1127.39175172066i, 226.23728166311-1110.40349894929i, -203.687633095422-740.924670781257i, -271.865544904439-437.858153233594i, -316.769706633022-279.671035520361i, -624.842102639273-228.211019456587i, -806.31350008813-164.912647906911i, -506.559675826232+24.376187336594i, -142.784303570554+217.087547410547i, -44.704338624059+260.225831716256i, 10.565037460572+219.942519605707i, 143.643627814428+218.823069474359i, 232.58540850813+214.905815487636i, 223.286482103748+175.139821578561i, 185.008902762186+116.519845434485i, 171.150234739785-0i));Arg(argv[[1]]);"); + assertEval("argv <- list(c(-12.561836573133-726.935211685406i, -19.15961591777-1315.40822424617i, -666.84872452586-2013.90899841237i, -5775.9038598237-11495.8986046958i, -19052.0606820086-36788.5714510618i, -27954.209922899-52600.8398855356i, -19930.6456597181-35739.3494902644i, -7168.9170917163-10787.9325286278i, -2331.00733468417-1545.77448035635i, -1953.77845230855-212.90200115993i, -1953.60071030304+1420.43983282655i, -1700.4015174326+2765.31423009739i, -862.10275212019+2693.95914108523i, 163.24691179114+1837.1971341258i, 824.29498680332+1155.03126302727i, 939.495937605926+679.549172893055i, 686.101881005818+305.166761591578i, 460.339323160381-14.067413050801i, 533.688543397269-293.997358985575i, 773.041200043657-698.096300485637i, 716.84959340189-1127.39175172066i, 226.23728166311-1110.40349894929i, -203.687633095422-740.924670781257i, -271.865544904439-437.858153233594i, -316.769706633022-279.671035520361i, -624.842102639273-228.211019456587i, -806.31350008813-164.912647906911i, -506.559675826232+24.376187336594i, -142.784303570554+217.087547410547i, -44.704338624059+260.225831716256i, 10.565037460572+219.942519605707i, 143.643627814428+218.823069474359i, 232.58540850813+214.905815487636i, 223.286482103748+175.139821578561i, 185.008902762186+116.519845434485i, 171.150234739785-0i));Arg(argv[[1]]);"); } @Test public void testArg4() { - assertEval(Ignored.Unknown, "argv <- list(logical(0));Arg(argv[[1]]);"); + assertEval("argv <- list(logical(0));Arg(argv[[1]]);"); } @Test public void testArg5() { - assertEval(Ignored.Unknown, "argv <- list(structure(numeric(0), .Dim = c(0L, 0L)));Arg(argv[[1]]);"); + assertEval("argv <- list(structure(numeric(0), .Dim = c(0L, 0L)));Arg(argv[[1]]);"); } @Test public void testArg6() { - assertEval(Ignored.Unknown, "argv <- list(FALSE);Arg(argv[[1]]);"); + assertEval("argv <- list(FALSE);Arg(argv[[1]]);"); } @Test public void testArg8() { - assertEval(Ignored.Unknown, "argv <- list(-1);do.call('Arg', argv)"); + assertEval("argv <- list(-1);do.call('Arg', argv)"); } } -- GitLab