Reformat code and change some name

This commit is contained in:
Mikhail Zelenyy 2019-01-23 11:52:09 +03:00
parent f0e380304e
commit 1b411872ef

@ -1,11 +1,10 @@
package scientifik.kmath.structures package scientifik.kmath.structures
import scientifik.kmath.operations.RealField
import scientifik.kmath.operations.RealField.power import scientifik.kmath.operations.RealField.power
import kotlin.math.* import kotlin.math.*
object RealFactories{ object RealFactory {
/** /**
* Create a NDArray filled with ones * Create a NDArray filled with ones
*/ */
@ -16,7 +15,8 @@ object RealFactories{
* *
* @param offset Index of the diagonal: 0 (the default) refers to the main diagonal, a positive value refers to an upper diagonal, and a negative value to a lower diagonal. * @param offset Index of the diagonal: 0 (the default) refers to the main diagonal, a positive value refers to an upper diagonal, and a negative value to a lower diagonal.
*/ */
fun eye(dim1: Int, dim2: Int, offset : Int = 0) = NDElement.real2D(dim1, dim2){i, j -> if (i == j + offset) 1.0 else 0.0} fun eye(dim1: Int, dim2: Int, offset: Int = 0) =
NDElement.real2D(dim1, dim2) { i, j -> if (i == j + offset) 1.0 else 0.0 }
/** /**
* An array with ones at and below the given diagonal and zeros elsewhere. * An array with ones at and below the given diagonal and zeros elsewhere.
@ -24,7 +24,8 @@ object RealFactories{
* *
* @param offset Index of the diagonal: 0 (the default) refers to the main diagonal, a positive value refers to an upper diagonal, and a negative value to a lower diagonal. * @param offset Index of the diagonal: 0 (the default) refers to the main diagonal, a positive value refers to an upper diagonal, and a negative value to a lower diagonal.
*/ */
fun triangle(dim1: Int, dim2: Int, offset : Int = 0) = NDElement.real2D(dim1, dim2){i, j -> if (i <= j + offset) 1.0 else 0.0} fun triangle(dim1: Int, dim2: Int, offset: Int = 0) =
NDElement.real2D(dim1, dim2) { i, j -> if (i <= j + offset) 1.0 else 0.0 }
/** /**
* Return evenly spaced values within a given interval. * Return evenly spaced values within a given interval.
@ -33,7 +34,8 @@ object RealFactories{
* @param range use it like: * @param range use it like:
* (start..stop) to step * (start..stop) to step
*/ */
fun range(range : Pair<ClosedFloatingPointRange<Double>,Double>) = NDElement.real1D(ceil((range.first.endInclusive - range.first.start)/range.second).toInt()){i-> range.first.start + i*range.second} fun range(range: Pair<ClosedFloatingPointRange<Double>, Double>) =
NDElement.real1D(ceil((range.first.endInclusive - range.first.start) / range.second).toInt()) { i -> range.first.start + i * range.second }
/** /**
* Return evenly spaced numbers over a specified interval. * Return evenly spaced numbers over a specified interval.
@ -42,19 +44,25 @@ object RealFactories{
* start is starting value, finaly value depend from endPoint parameter * start is starting value, finaly value depend from endPoint parameter
* @param endPoint If True, right boundary of range is the last sample. Otherwise, it is not included. * @param endPoint If True, right boundary of range is the last sample. Otherwise, it is not included.
*/ */
fun linspace(range : Pair<ClosedFloatingPointRange<Double>,Int>, endPoint: Boolean = true): Pair<RealNDElement, Double> { fun linSpace(
range: Pair<ClosedFloatingPointRange<Double>, Int>,
endPoint: Boolean = true
): Pair<RealNDElement, Double> {
val div = if (endPoint) (range.second - 1) else range.second val div = if (endPoint) (range.second - 1) else range.second
val delta = range.first.start - range.first.endInclusive val delta = range.first.start - range.first.endInclusive
if (range.second > 1) { if (range.second > 1) {
val step = delta / div val step = delta / div
if (step == 0.0){ error("Bad ranges: step = $step")} if (step == 0.0) {
error("Bad ranges: step = $step")
}
val result = NDElement.real1D(range.second) { val result = NDElement.real1D(range.second) {
if ( endPoint and (it == range.second - 1) ){ range.first.endInclusive} if (endPoint and (it == range.second - 1)) {
range.first.endInclusive
}
range.first.start + it * step range.first.start + it * step
} }
return result to step return result to step
} } else {
else{
val step = Double.NaN val step = Double.NaN
return NDElement.real1D(1) { range.first.start } to step return NDElement.real1D(1) { range.first.start } to step
} }
@ -69,21 +77,26 @@ object RealFactories{
* @param endPoint If True, power(base,stop) is the last sample. Otherwise, it is not included. * @param endPoint If True, power(base,stop) is the last sample. Otherwise, it is not included.
* @param base - The base of the log space. * @param base - The base of the log space.
*/ */
fun logspace(range : Pair<ClosedFloatingPointRange<Double>,Int>, endPoint: Boolean = true, base : Double = 10.0) : RealNDElement { fun logSpace(
val lin = linspace(range, endPoint).first range: Pair<ClosedFloatingPointRange<Double>, Int>,
val fun_ = {x: Double -> power(base, x)} endPoint: Boolean = true,
return fun_(lin) // FIXME: RealNDElement.map return not suitable type ( `linspace(range, endPoint).first.map{power(base, it}`) base: Double = 10.0
): RealNDElement {
val lin = linSpace(range, endPoint).first
val tempFun = { x: Double -> power(base, x) }
return tempFun(lin) // FIXME: RealNDElement.map return not suitable type ( `linSpace(range, endPoint).first.map{power(base, it}`)
} }
/** /**
* Return numbers spaced evenly on a log scale (a geometric progression). * Return numbers spaced evenly on a log scale (a geometric progression).
* *
* This is similar to [logspace], but with endpoints specified directly. Each output sample is a constant multiple of the previous. * This is similar to [logSpace], but with endpoints specified directly. Each output sample is a constant multiple of the previous.
* @param range use it like: * @param range use it like:
* (start..stop) to number * (start..stop) to number
* start is starting value, finaly value depend from endPoint parameter * start is starting value, finaly value depend from endPoint parameter
* @param endPoint If True, right boundary of range is the last sample. Otherwise, it is not included. * @param endPoint If True, right boundary of range is the last sample. Otherwise, it is not included.
*/ */
fun geomspace(range : Pair<ClosedFloatingPointRange<Double>,Int>, endPoint: Boolean = true) : RealNDElement{ fun geomSpace(range: Pair<ClosedFloatingPointRange<Double>, Int>, endPoint: Boolean = true): RealNDElement {
var start = range.first.start var start = range.first.start
var stop = range.first.endInclusive var stop = range.first.endInclusive
val num = range.second val num = range.second
@ -97,9 +110,9 @@ object RealFactories{
outSign = -outSign outSign = -outSign
} }
val log_ = logspace((log(start, 10.0)..log(stop, 10.0) to num), endPoint=endPoint) val logRange = logSpace((log(start, 10.0)..log(stop, 10.0) to num), endPoint = endPoint)
val fun_ = {x:Double -> outSign*x} val function = { x: Double -> outSign * x }
return fun_(log_) // FIXME: `outSign*log_` --- don't define times operator return function(logRange) // FIXME: `outSign*log_` --- don't define times operator
} }
@ -110,12 +123,12 @@ object RealFactories{
*/ */
fun extractDiagonal(array: RealNDElement, offset: Int = 0): RealNDElement { fun extractDiagonal(array: RealNDElement, offset: Int = 0): RealNDElement {
if (array.dimension != 2) { if (array.dimension != 2) {
error("Input must be 2D NDArray")} error("Input must be 2D NDArray")
}
val size = min(array.shape[0], array.shape[0]) val size = min(array.shape[0], array.shape[0])
if (offset >= 0) { if (offset >= 0) {
return NDElement.real1D(size) { i -> array[i, i + offset] } return NDElement.real1D(size) { i -> array[i, i + offset] }
} } else {
else{
return NDElement.real1D(size) { i -> array[i - offset, i] } return NDElement.real1D(size) { i -> array[i - offset, i] }
} }
@ -128,16 +141,16 @@ object RealFactories{
*/ */
fun fromDiagonal(array: RealNDElement, offset: Int = 0): RealNDElement { fun fromDiagonal(array: RealNDElement, offset: Int = 0): RealNDElement {
if (array.dimension != 1) { if (array.dimension != 1) {
error("Input must be 1D NDArray")} error("Input must be 1D NDArray")
}
val size = array.shape[0] val size = array.shape[0]
if (offset >= 0) { if (offset >= 0) {
return NDElement.real2D(size, size+offset){ return NDElement.real2D(size, size + offset) { i, j ->
i, j -> if (i == j+offset) array[i] else 0.0 if (i == j + offset) array[i] else 0.0
} }
} } else {
else{ return NDElement.real2D(size - offset, size) { i, j ->
return NDElement.real2D(size-offset, size){ if (i - offset == j) array[j] else 0.0
i, j -> if (i-offset == j) array[j] else 0.0
} }
} }
} }
@ -150,15 +163,16 @@ object RealFactories{
*/ */
fun vandermonde(array: RealNDElement, nCols: Int = 0, increasing: Boolean = false): RealNDElement { fun vandermonde(array: RealNDElement, nCols: Int = 0, increasing: Boolean = false): RealNDElement {
if (array.dimension != 1) { if (array.dimension != 1) {
error("Input must be 1D NDArray")} error("Input must be 1D NDArray")
var size = if (nCols ==0) array.shape[0] else nCols }
val size = if (nCols == 0) array.shape[0] else nCols
if (increasing) { if (increasing) {
return NDElement.real2D(array.shape[0], size){ return NDElement.real2D(array.shape[0], size) { i, j ->
i, j -> power(array[i], j) power(array[i], j)
} }
} else { } else {
return NDElement.real2D(array.shape[0], size){ return NDElement.real2D(array.shape[0], size) { i, j ->
i, j -> power(array[i], size - j - 1) power(array[i], size - j - 1)
} }
} }