diff --git a/src/main/java/org/apache/sysds/runtime/util/UtilFunctions.java b/src/main/java/org/apache/sysds/runtime/util/UtilFunctions.java index 838a0aa1e32..e7d3c3f5b68 100644 --- a/src/main/java/org/apache/sysds/runtime/util/UtilFunctions.java +++ b/src/main/java/org/apache/sysds/runtime/util/UtilFunctions.java @@ -438,6 +438,8 @@ public static long getSeqLength(double from, double to, double incr, boolean che //a very small increment. Hence, we use a different formulation //that exhibits better numerical stability by avoiding the subtraction //of numbers of different magnitude. + //Additionally we check the resulting length and add 1 if this check + //allows inferring that round-off errors happened. if( (isSpecial(from) || isSpecial(to) || isSpecial(incr) || (from > to && incr > 0) || (from < to && incr < 0)) ) { if( check ) @@ -445,7 +447,8 @@ public static long getSeqLength(double from, double to, double incr, boolean che else return 0; // invalid loop configuration } - return 1L + (long) Math.floor(to/incr - from/incr); + long tmp = 1L + (long) Math.floor(to/incr - from/incr); + return tmp + ((from+tmp*incr <= to) ? 1 : 0); } /** diff --git a/src/test/java/org/apache/sysds/test/functions/io/SeqSizeTest.java b/src/test/java/org/apache/sysds/test/functions/io/SeqSizeTest.java new file mode 100644 index 00000000000..45f9b132f21 --- /dev/null +++ b/src/test/java/org/apache/sysds/test/functions/io/SeqSizeTest.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.sysds.test.functions.io; + +import org.junit.Test; +import org.apache.sysds.test.AutomatedTestBase; +import org.apache.sysds.test.TestConfiguration; +import org.apache.sysds.test.TestUtils; + +public class SeqSizeTest extends AutomatedTestBase { + + private final static String TEST_NAME = "SeqSizeTest"; + private final static String TEST_DIR = "functions/io/"; + private final static String TEST_CLASS_DIR = TEST_DIR + SeqSizeTest.class.getSimpleName() + "/"; + + private final static double eps = 1e-9; + + @Override + public void setUp() { + TestUtils.clearAssertionInformation(); + addTestConfiguration(TEST_NAME, + new TestConfiguration(TEST_CLASS_DIR, TEST_NAME, new String[] { "Rout" }) ); + } + + @Test + public void runSizeTest() { + TestConfiguration config = getTestConfiguration(TEST_NAME); + loadTestConfiguration(config); + String HOME = SCRIPT_DIR + TEST_DIR; + fullDMLScriptName = HOME + TEST_NAME + ".dml"; + programArgs = new String[]{"-explain", "-args", output("R")}; + runTest(true, false, null, -1); + double dmlScalar = TestUtils.readDMLScalar(output("R")); + TestUtils.compareScalars(dmlScalar, 5, eps); + } +} diff --git a/src/test/scripts/functions/io/SeqSizeTest.dml b/src/test/scripts/functions/io/SeqSizeTest.dml new file mode 100644 index 00000000000..d683f207feb --- /dev/null +++ b/src/test/scripts/functions/io/SeqSizeTest.dml @@ -0,0 +1,23 @@ +#------------------------------------------------------------- +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +#------------------------------------------------------------- + +x = length(seq(1,1001,250)) +write(x, $1);