From 2bd70a58eed01f5fe88e01bc2bec83d96ea1b746 Mon Sep 17 00:00:00 2001 From: Florian Angerer <florian.angerer@oracle.com> Date: Wed, 23 Aug 2017 18:04:57 +0200 Subject: [PATCH] Added tests for in-place transposition of non-square matrices. --- .../vector/CachedReplaceVectorNode.java | 2 +- .../truffle/r/nodes/binary/CastTypeNode.java | 13 +++-- .../r/nodes/unary/CastIntegerNode.java | 6 +-- .../truffle/r/test/ExpectedTestOutput.test | 48 +++++++++++++++++++ .../r/test/builtins/TestBuiltin_t.java | 11 +++++ 5 files changed, 72 insertions(+), 8 deletions(-) diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedReplaceVectorNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedReplaceVectorNode.java index a81e194adf..71a7e7c718 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedReplaceVectorNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedReplaceVectorNode.java @@ -352,7 +352,7 @@ final class CachedReplaceVectorNode extends CachedVectorNode { if (castType == RType.List) { return CastListNodeGen.create(true, false, true); } else { - return CastTypeNode.createCast(castType, true, true, true); + return CastTypeNode.createCast(castType, true, true, true, false); } } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/binary/CastTypeNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/binary/CastTypeNode.java index 65e0a251a6..144f971527 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/binary/CastTypeNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/binary/CastTypeNode.java @@ -63,7 +63,12 @@ public abstract class CastTypeNode extends RBaseNode { @TruffleBoundary public static CastNode createCast(RType type) { - return createCast(type, false, false, false); + return createCast(type, false, false, false, false); + } + + @TruffleBoundary + public static CastNode createCast(RType type, boolean reuseNonShared) { + return createCast(type, false, false, false, reuseNonShared); } public static CastTypeNode create() { @@ -71,16 +76,16 @@ public abstract class CastTypeNode extends RBaseNode { } @TruffleBoundary - public static CastNode createCast(RType type, boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) { + public static CastNode createCast(RType type, boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, boolean reuseNonShared) { switch (type) { case Character: return CastStringNodeGen.create(preserveNames, preserveDimensions, preserveAttributes); case Complex: return CastComplexNodeGen.create(preserveNames, preserveDimensions, preserveAttributes); case Double: - return CastDoubleNodeGen.create(preserveNames, preserveDimensions, preserveAttributes); + return CastDoubleNodeGen.create(preserveNames, preserveDimensions, preserveAttributes, false, reuseNonShared); case Integer: - return CastIntegerNodeGen.create(preserveNames, preserveDimensions, preserveAttributes); + return CastIntegerNodeGen.create(preserveNames, preserveDimensions, preserveAttributes, false, reuseNonShared); case Logical: return CastLogicalNodeGen.create(preserveNames, preserveDimensions, preserveAttributes); case Raw: diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java index 997193d66f..f455f26773 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java @@ -175,17 +175,17 @@ public abstract class CastIntegerNode extends CastIntegerBaseNode { return (RAbstractIntVector) castWithReuse(RType.Integer, operand, naProfile.getConditionProfile()); } - @Specialization + @Specialization(guards = "!isReusable(operand)") public RIntVector doLogicalVector(RAbstractLogicalVector operand) { return createResultVector(operand, index -> naCheck.convertLogicalToInt(operand.getDataAt(index))); } - @Specialization + @Specialization(guards = "!isReusable(operand)") protected RIntVector doDoubleVector(RAbstractDoubleVector operand) { return createResultVector(operand, index -> naCheck.convertDoubleToInt(operand.getDataAt(index))); } - @Specialization + @Specialization(guards = "!isReusable(operand)") protected RIntVector doRawVector(RAbstractRawVector operand) { return createResultVector(operand, index -> RRuntime.raw2int(operand.getDataAt(index))); } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test index 933cf6864b..7378e3a895 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test @@ -69567,6 +69567,54 @@ Error in t.default(new.env()) : argument is not a matrix b 1 c 2 +##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNotSquare# +#{ m <- matrix(1:8, 2, 4) ; t(m) } + [,1] [,2] +[1,] 1 2 +[2,] 3 4 +[3,] 5 6 +[4,] 7 8 + +##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNotSquare# +#{ m <- matrix(as.raw(c(1:8)), 2, 4); t(m) } + [,1] [,2] +[1,] 01 02 +[2,] 03 04 +[3,] 05 06 +[4,] 07 08 + +##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNotSquare# +#{ m <- matrix(c('1', '2', '3', '4', '5', '6', '7', '8'), 2, 4); t(m) } + [,1] [,2] +[1,] "1" "2" +[2,] "3" "4" +[3,] "5" "6" +[4,] "7" "8" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNotSquare# +#{ m <- matrix(c(T, F, F, F, T, F, F, T), 2, 4); t(m) } + [,1] [,2] +[1,] TRUE FALSE +[2,] FALSE FALSE +[3,] TRUE FALSE +[4,] FALSE TRUE + +##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNotSquare# +#{ m <- matrix(list(a=1,b=2,c=3,d=4,e=5,f=6,g=7,h=8), 2, 4); t(m) } + [,1] [,2] +[1,] 1 2 +[2,] 3 4 +[3,] 5 6 +[4,] 7 8 + +##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNotSquare# +#{ m <- matrix(seq(0.1,0.8,0.1), 2, 4) ; t(m) } + [,1] [,2] +[1,] 0.1 0.2 +[2,] 0.3 0.4 +[3,] 0.5 0.6 +[4,] 0.7 0.8 + ##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeSquare# #{ m <- matrix(1:64, 8, 8) ; sum(m * t(m)) } [1] 72976 diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_t.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_t.java index d1708c7290..2ab45b0034 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_t.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_t.java @@ -59,4 +59,15 @@ public class TestBuiltin_t extends TestBase { assertEval("{ m <- matrix(as.raw(c(1,2,3,4)), 2, 2); t(m) }"); assertEval("{ m <- matrix(list(a=1,b=2,c=3,d=4), 2, 2); t(m) }"); } + + @Test + public void testTransposeNotSquare() { + // test square matrices + assertEval("{ m <- matrix(1:8, 2, 4) ; t(m) }"); + assertEval("{ m <- matrix(seq(0.1,0.8,0.1), 2, 4) ; t(m) }"); + assertEval("{ m <- matrix(c(T, F, F, F, T, F, F, T), 2, 4); t(m) }"); + assertEval("{ m <- matrix(c('1', '2', '3', '4', '5', '6', '7', '8'), 2, 4); t(m) }"); + assertEval("{ m <- matrix(as.raw(c(1:8)), 2, 4); t(m) }"); + assertEval("{ m <- matrix(list(a=1,b=2,c=3,d=4,e=5,f=6,g=7,h=8), 2, 4); t(m) }"); + } } -- GitLab