Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion src/arraymancer/linear_algebra/special_matrices.nim
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

import ../tensor
import ./helpers/triangular
import std / [sequtils, bitops]
import std / [sequtils, bitops, strformat]

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

To avoid repeating bind &`` in the diagonal, `set_diagonal`, and `tri` procedures, you can declare it once at the module level here. This improves maintainability by removing code duplication. The `bind` statement at the module level will ensure the `&` operator is available for all procedures in this file, including within generics.

import std / [sequtils, bitops, strformat]
bind `&`


proc hilbert*(n: int, T: typedesc[SomeFloat]): Tensor[T] =
## Generates an Hilbert matrix of shape [N, N]
Expand Down Expand Up @@ -129,6 +129,7 @@ proc diagonal*[T](a: Tensor[T], k = 0, anti = false): Tensor[T] {.noInit.} =
## - anti: If true, get the k-th "anti-diagonal" instead of the k-th regular diagonal.
## Result:
## - A copy of the diagonal elements as a rank-1 tensor
bind `&`

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

With bind &`` declared at the module scope (as suggested in another comment), this redundant declaration can be removed.

assert a.rank == 2, "diagonal() only works on matrices"
assert k < a.shape[0], &"Diagonal index ({k=}) exceeds the output matrix height ({a.shape[0]})"
assert k < a.shape[1], &"Diagonal index ({k=}) exceeds the output matrix width ({a.shape[1]})"
Expand Down Expand Up @@ -167,6 +168,7 @@ proc set_diagonal*[T](a: var Tensor[T], d: Tensor[T], k = 0, anti = false) =
## - k: The index k of the diagonal that will be changed. The default is 0 (i.e. the main diagonal).
## Use k>0 for diagonals above the main diagonal, and k<0 for diagonals below the main diagonal.
## - anti: If true, set the k-th "anti-diagonal" instead of the k-th regular diagonal.
bind `&`

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

This bind statement is also redundant if it's declared once at the module level. It can be removed to improve code clarity and reduce duplication.

assert a.rank == 2, "set_diagonal() only works on matrices"
assert d.rank == 1, "The diagonal passed to set_diagonal() must be a rank-1 tensor"
assert k < a.shape[0], &"Diagonal index ({k=}) exceeds input matrix height ({a.shape[0]})"
Expand Down Expand Up @@ -259,6 +261,7 @@ proc tri*[T](shape: Metadata, k: static int = 0, upper: static bool = false): Te
## diagonal. The default is false.
## Result:
## - The constructed, rank-2 triangular tensor.
bind `&`

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

This is another duplicated bind statement that can be removed by declaring it once at the module scope.

assert shape.len == 2, &"tri() requires a rank-2 shape as it's input but a shape of rank {shape.len} was passed"
assert k < shape[0], &"tri() received a diagonal index ({k=}) which exceeds the output matrix height ({shape[0]})"
assert k < shape[1], &"tri() received a diagonal index ({k=}) which exceeds the output matrix width ({shape[1]})"
Expand Down
2 changes: 1 addition & 1 deletion tests/linear_algebra/test_linear_algebra.nim
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# Distributed under the Apache v2 License (license terms are at http://www.apache.org/licenses/LICENSE-2.0).

import ../../src/arraymancer
import std / [unittest, strformat]
import std / [unittest]

proc main() =
suite "Linear algebra":
Expand Down
2 changes: 1 addition & 1 deletion tests/linear_algebra/test_special_matrices.nim
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# Distributed under the Apache v2 License (license terms are at http://www.apache.org/licenses/LICENSE-2.0).

import ../../src/arraymancer
import std / [unittest, strformat]
import std / [unittest]

proc main() =
suite "Diagonals":
Expand Down
Loading