* Jar packaging for maven Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Typo fixed Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * minimal viable prototype for SD Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Tests corrected Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * few fixes for bfloat16 in java and cpp (#114) Signed-off-by: raver119 <raver119@gmail.com> * Nd4j refactoring (#112) * refactoring Signed-off-by: Robert Altena <Rob@Ra-ai.com> * wip Signed-off-by: Robert Altena <Rob@Ra-ai.com> * wip Signed-off-by: Robert Altena <Rob@Ra-ai.com> * wip * fix: make test public. Signed-off-by: Robert Altena <Rob@Ra-ai.com> * make test public. Signed-off-by: Robert Altena <Rob@Ra-ai.com> * fixes read refactoring. Signed-off-by: Robert Altena <Rob@Ra-ai.com> * Enabled test Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Test copied from nd4j Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * [WIP] bitwise ops (#115) * - cyclic_shift_bits + test - shift_bits + test Signed-off-by: raver119 <raver119@gmail.com> * OMP_IF replacement Signed-off-by: raver119 <raver119@gmail.com> * Thin wrapper added Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Cleanup Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Shugeo cuda tests (#116) * Added tests for get_seed/set_seed ops. * Added missed tests for scatter_sub/mul/div ops. * Added tests for hardsigmoid and hardsigmoid_bp. * Added tests for hardtanh and hardtanh_bp ops. * Added test for histogram op. * Added tests for identity op. * Refactored mergemaxindex op. Added tests for log1p,mergemaxindex, mod and mod_bp ops. * Fixed tests for FloorDiv. * Added test for rank op. * Added tests for rationaltanh/rationaltanh_bp ops. * Added tests for realdiv/realdiv_bp. * Added tests for rectifiedtanh/_bp ops. * Added tests for shapes_of op. * Added tests for shapes_of op. * Added tests for size op. * Added tests for softplus/_bp ops. * Added tests for softsign/_bp ops. * Added tests for toggle_bits op. Fixed processing of OP_IMPL and so on defititions. * Added test for truncatediv op. * Added another test for truncatediv op. * Added another test for histogram. * Added tests for unstack_list op. * Refactored to_int32/uint32/float16/float32/double/int64/uint64 ops and tests. * Refactored mergemaxindex op helper for cuda platform and tests. * Fixed cuda kernel for histogram op helper. * Refactor skipgram to avoid early buffers shift. * Fixed check up with non_max_suppression op cuda helper. Added cuda kernel implementation for skipgram op helpers. * Added implementation of skipgram op helper for cuda platform. Working revision * Fixed mergeMaxIndex kernel and move it to separate source file. * Adding arithmetic Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Eliminated memory leaks and dropped waste prints with tests. (#117) * Added tests Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * fix test Signed-off-by: raver119 <raver119@gmail.com> * no openmp for ClipByGlobalNorm Signed-off-by: raver119 <raver119@gmail.com> * Stubs for ops Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * [WIP] right shift ops (#118) * right shift ops Signed-off-by: raver119 <raver119@gmail.com> * typo Signed-off-by: raver119 <raver119@gmail.com> * rotr test Signed-off-by: raver119 <raver119@gmail.com> * fix: IOException no longer thrown by read(). (#120) Signed-off-by: Robert Altena <Rob@Ra-ai.com> * Small fix in TensorflowConversion class (#121) Signed-off-by: Alex Black <blacka101@gmail.com> * Shyrma concat2 (#119) * - rewrite/improve concat Signed-off-by: Yurii <yurii@skymind.io> * - ged rid of unnecessary argument in concat kernel Signed-off-by: Yurii <yurii@skymind.io> * InferenceSession additional validation for shape calc (#122) Signed-off-by: Alex Black <blacka101@gmail.com> * [WIP] build fix (#124) * AffinityManager changes Signed-off-by: raver119 <raver119@gmail.com> * build fixes Signed-off-by: raver119 <raver119@gmail.com> * OP/CONFIGURABLE_OP shapefn fix (#125) Signed-off-by: raver119 <raver119@gmail.com> * Some ops added Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Nd4j refactoring (last one!) (#123) * fix: IOException no longer thrown by read(). Signed-off-by: Robert Altena <Rob@Ra-ai.com> * refactoring * last refactorings Signed-off-by: Robert Altena <Rob@Ra-ai.com> * Advanced tests Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * [WIP] Java wrappers (#126) * shift/rshift/rotl/rotr java/sd wrappers Signed-off-by: raver119 <raver119@gmail.com> * few additional wrappers Signed-off-by: raver119 <raver119@gmail.com> * minor naming tweak Signed-off-by: raver119 <raver119@gmail.com> * Test added Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * one more build fix Signed-off-by: raver119 <raver119@gmail.com> * Jar packaging for maven Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Typo fixed Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * minimal viable prototype for SD Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Tests corrected Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Enabled test Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Test copied from nd4j Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Thin wrapper added Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Cleanup Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Adding arithmetic Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Added tests Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Stubs for ops Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Some ops added Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Advanced tests Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Test added Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Ops added Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Small build fixes (#127) * Small build fixes Signed-off-by: Alex Black <blacka101@gmail.com> * Fix RL4J Signed-off-by: Alex Black <blacka101@gmail.com> * Test fixes Signed-off-by: Alex Black <blacka101@gmail.com> * Another fix Signed-off-by: Alex Black <blacka101@gmail.com> * parent module name fix Signed-off-by: raver119 <raver119@gmail.com> * [WIP] Roll rewritten (#128) * Process correct input vector. * Added tests for roll. * Refactored roll to conform with TF. Eliminated memory leaks with Roll op tests. * no thread_local for cpu Signed-off-by: raver119 <raver119@gmail.com> * Jar packaging for maven Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Typo fixed Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * minimal viable prototype for SD Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Tests corrected Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Enabled test Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Test copied from nd4j Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Thin wrapper added Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Cleanup Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Adding arithmetic Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Added tests Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Stubs for ops Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Some ops added Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Advanced tests Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Test added Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Ops added Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Tests added Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Boolen logic ops Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Test added Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com> * Shift operations Signed-off-by: Alexander Stoyakin <alexander.stoyakin@gmail.com>
287 lines
7.7 KiB
Scala
287 lines
7.7 KiB
Scala
/*******************************************************************************
|
|
* Copyright (c) 2015-2018 Skymind, Inc.
|
|
*
|
|
* This program and the accompanying materials are made available under the
|
|
* terms of the Apache License, Version 2.0 which is available at
|
|
* https://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.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
******************************************************************************/
|
|
package org.nd4s
|
|
|
|
import org.nd4s.Implicits._
|
|
import org.scalatest.FlatSpec
|
|
|
|
class NDArrayExtractionInCOrderingTest extends NDArrayExtractionTestBase with COrderingForTest
|
|
class NDArrayExtractionInFortranOrderingTest extends NDArrayExtractionTestBase with FortranOrderingForTest
|
|
|
|
trait NDArrayExtractionTestBase extends FlatSpec { self: OrderingForTest =>
|
|
|
|
"org.nd4j.api.Implicits.RichNDArray" should "be able to extract a value in specified indices" in {
|
|
val ndArray = Array(
|
|
Array(1, 2),
|
|
Array(3, 4)
|
|
).mkNDArray(ordering)
|
|
}
|
|
|
|
it should "be able to extract a part of 2d matrix" in {
|
|
val ndArray =
|
|
Array(
|
|
Array(1, 2, 3),
|
|
Array(4, 5, 6),
|
|
Array(7, 8, 9)
|
|
).mkNDArray(ordering)
|
|
|
|
val extracted = ndArray(1 -> 3, 0 -> 2)
|
|
|
|
val expected =
|
|
Array(
|
|
Array(4, 5),
|
|
Array(7, 8)
|
|
).mkNDArray(ordering)
|
|
assert(extracted == expected)
|
|
}
|
|
|
|
it should "be able to extract a part of 2d matrix with double data" in {
|
|
val ndArray = (5 to 8).map(_.toDouble).mkNDArray(Array(2, 2), NDOrdering.C)
|
|
|
|
val expectedArray = Array(
|
|
Array(5d, 6d),
|
|
Array(7d, 8d)
|
|
).mkNDArray(ordering)
|
|
assert(ndArray == expectedArray)
|
|
|
|
val expectedSlice = Array(
|
|
Array(5d),
|
|
Array(7d)
|
|
).toNDArray
|
|
assert(expectedArray(->, 0 -> 1) == expectedSlice)
|
|
}
|
|
|
|
it should "be able to extract a part of 2d matrix with integer data" in {
|
|
val ndArray = (1 to 9).mkNDArray(Array(2, 2))
|
|
|
|
val expectedArray = Array(
|
|
Array(1, 2),
|
|
Array(3, 4)
|
|
).mkNDArray(ordering)
|
|
assert(ndArray == expectedArray)
|
|
|
|
val expectedSlice = Array(
|
|
Array(1),
|
|
Array(3)
|
|
).toNDArray
|
|
val actualSlice = expectedArray(->, 0 -> 1)
|
|
assert(actualSlice == expectedSlice)
|
|
}
|
|
|
|
it should " provide overloaded -> operator providing matrix slices as nd4j" in {
|
|
|
|
val expectedArray = (1 to 9).mkNDArray(Array(2, 2))
|
|
val expectedSlice = expectedArray.slice(0)
|
|
val actualSlice = expectedArray(0, ->)
|
|
|
|
Console.println(expectedSlice)
|
|
|
|
assert(actualSlice == expectedSlice)
|
|
}
|
|
|
|
it should "be able to extract a part of vertically long matrix in" in {
|
|
val ndArray =
|
|
Array(
|
|
Array(1, 2),
|
|
Array(3, 4),
|
|
Array(5, 6),
|
|
Array(7, 8)
|
|
).mkNDArray(ordering)
|
|
|
|
assert(
|
|
ndArray(0 -> 2, ->) ==
|
|
Array(
|
|
Array(1, 2),
|
|
Array(3, 4)
|
|
).mkNDArray(ordering)
|
|
)
|
|
|
|
assert(
|
|
ndArray(2 -> 4, ->) ==
|
|
Array(
|
|
Array(5, 6),
|
|
Array(7, 8)
|
|
).mkNDArray(ordering)
|
|
)
|
|
}
|
|
|
|
it should "be able to extract a part of horizontally long matrix" in {
|
|
val ndArray =
|
|
Array(
|
|
Array(1, 2, 3, 4),
|
|
Array(5, 6, 7, 8)
|
|
).mkNDArray(ordering)
|
|
|
|
assert(
|
|
ndArray(->, 0 -> 2) ==
|
|
Array(
|
|
Array(1, 2),
|
|
Array(5, 6)
|
|
).mkNDArray(ordering)
|
|
)
|
|
|
|
assert(
|
|
ndArray(->, 2 -> 4) ==
|
|
Array(
|
|
Array(3, 4),
|
|
Array(7, 8)
|
|
).mkNDArray(ordering)
|
|
)
|
|
}
|
|
|
|
it should "be able to extract a part of 3d matrix" in {
|
|
val ndArray = (1 to 8).mkNDArray(Array(2, 2, 2), ordering)
|
|
|
|
val extracted = ndArray(0, ->, ->)
|
|
val expected = ndArray.slice(0)
|
|
assert(extracted == expected)
|
|
}
|
|
|
|
it should "return original NDArray if indexRange is all in 2d matrix" in {
|
|
val ndArray =
|
|
Array(
|
|
Array(1, 2, 3),
|
|
Array(4, 5, 6),
|
|
Array(7, 8, 9)
|
|
).mkNDArray(ordering)
|
|
val extracted = ndArray(->, ->)
|
|
assert(ndArray == extracted)
|
|
|
|
val ellipsised = ndArray(--->)
|
|
assert(ellipsised == ndArray)
|
|
}
|
|
|
|
it should "return original NDArray if indexRange is all in 3d matrix" in {
|
|
val ndArray = (1f to 8f by 1).mkNDArray(Array(2, 2, 2), ordering)
|
|
val extracted = ndArray(->, ->, ->)
|
|
assert(ndArray == extracted)
|
|
|
|
val ellipsised = ndArray(--->)
|
|
assert(ellipsised == ndArray)
|
|
}
|
|
|
|
it should "accept partially ellipsis indices" in {
|
|
val ndArray = (1f to 8f by 1).mkNDArray(Array(2, 2, 2), ordering)
|
|
|
|
val ellipsised = ndArray(--->, 0)
|
|
val notEllipsised = ndArray(->, ->, 0)
|
|
assert(ellipsised == notEllipsised)
|
|
|
|
val ellipsisedAtEnd = ndArray(0, --->)
|
|
val notEllipsisedAtEnd = ndArray(0, ->, ->)
|
|
assert(ellipsisedAtEnd == notEllipsisedAtEnd)
|
|
|
|
val ellipsisedOneHand = ndArray(0 ->, ->, ->)
|
|
val notEllipsisedOneHand = ndArray(->, ->, ->)
|
|
assert(ellipsisedOneHand == notEllipsisedOneHand)
|
|
}
|
|
|
|
// TODO: fix me. This is about INDArray having to be sliced by LONG indices
|
|
// can't find the correct way to fix implicits without breaking other stuff.
|
|
it should "be able to extract sub-matrix with index range by step" in {
|
|
val ndArray =
|
|
Array(
|
|
Array(1, 2, 3),
|
|
Array(4, 5, 6),
|
|
Array(7, 8, 9)
|
|
).mkNDArray(ordering).reshape(3, 3)
|
|
|
|
val extracted = ndArray(0 -> 3 by 2, ->)
|
|
val extractedWithRange = ndArray(0 until 3 by 2, ->)
|
|
val extractedWithInclusiveRange = ndArray(0 to 2 by 2, ->)
|
|
|
|
val expected =
|
|
Array(
|
|
Array(1, 2, 3),
|
|
Array(7, 8, 9)
|
|
).mkNDArray(ordering)
|
|
|
|
assert(extracted == expected)
|
|
assert(extractedWithRange == expected)
|
|
assert(extractedWithInclusiveRange == expected)
|
|
|
|
/*
|
|
Equivalent with NumPy document examples.
|
|
@see http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#basic-slicing-and-indexing
|
|
*/
|
|
val list = (0 to 9).toNDArray
|
|
val step = list(1 -> 7 by 2).reshape(-1)
|
|
assert(step.length() == 3)
|
|
assert(step.getFloat(0) == 1)
|
|
assert(step(0) == 1)
|
|
assert(step(0, 0) == 1)
|
|
assert(step.getFloat(1) == 3)
|
|
assert(step.getFloat(2) == 5)
|
|
|
|
val filtered = list(-2 -> 10).reshape(-1)
|
|
assert(filtered.length() == 2)
|
|
assert(filtered.getFloat(0) == 8)
|
|
assert(filtered.getFloat(1) == 9)
|
|
|
|
val nStep = list(-3 -> 3 by -1).reshape(-1)
|
|
assert(nStep.length() == 4)
|
|
assert(nStep.getFloat(0) == 7)
|
|
assert(nStep.getFloat(1) == 6)
|
|
assert(nStep.getFloat(2) == 5)
|
|
assert(nStep.getFloat(3) == 4)
|
|
}
|
|
|
|
it should "be able to update value with specified indices" in {
|
|
val ndArray =
|
|
Array(
|
|
Array(1, 2, 3),
|
|
Array(4, 5, 6),
|
|
Array(7, 8, 9)
|
|
).mkNDArray(ordering)
|
|
|
|
ndArray(0 -> 3 by 2, ->) = 0
|
|
|
|
assert(
|
|
ndArray == Array(
|
|
Array(0, 0, 0),
|
|
Array(4, 5, 6),
|
|
Array(0, 0, 0)
|
|
).mkNDArray(ordering)
|
|
)
|
|
}
|
|
|
|
it should "be able to update INDArray with specified indices" in {
|
|
val ndArray =
|
|
Array(
|
|
Array(1, 2, 3),
|
|
Array(4, 5, 6),
|
|
Array(7, 8, 9)
|
|
).mkNDArray(ordering)
|
|
|
|
ndArray(0 -> 2, 0 -> 2) = Array(Array(0, 1), Array(2, 3)).mkNDArray(ordering)
|
|
|
|
assert(
|
|
ndArray == Array(
|
|
Array(0, 1, 3),
|
|
Array(2, 3, 6),
|
|
Array(7, 8, 9)
|
|
).mkNDArray(ordering)
|
|
)
|
|
}
|
|
|
|
"num2Scalar" should "convert number to Scalar INDArray" in {
|
|
|
|
assert(1.toScalar.data() == List(1).toNDArray.data())
|
|
assert(2f.toScalar.data() == List(2).toNDArray.data())
|
|
assert(3d.toScalar.data() == List(3).toNDArray.data())
|
|
}
|
|
}
|