initial commit
This commit is contained in:
183
matrix_test.nim
Normal file
183
matrix_test.nim
Normal file
@@ -0,0 +1,183 @@
|
||||
from random import randomize, random
|
||||
from utils import `...`
|
||||
import matrix
|
||||
from matrix import det
|
||||
from vector import createVector, newVector, `-`, abs, norm
|
||||
import unittest
|
||||
|
||||
suite "Nim linear algebra library":
|
||||
echo "suite setup: run once before the tests"
|
||||
randomize()
|
||||
var mtx : Matrix[float64]
|
||||
|
||||
setup:
|
||||
echo "run before each test"
|
||||
let DIM = 100
|
||||
var numbers = newSeq[float64](DIM * DIM)
|
||||
for i in 0...len(numbers):
|
||||
numbers[i] = float64(random(-DIM..DIM))
|
||||
mtx = newMatrix[float64](DIM,DIM,numbers)
|
||||
|
||||
teardown:
|
||||
echo "run after each test"
|
||||
|
||||
test "LU decomposition":
|
||||
var lu = mtx.clone()
|
||||
let pivot = lu.lu()
|
||||
|
||||
test "Linear system solve":
|
||||
# let nums = [2.0,1.0,3.0,2.0,6.0,8.0,6.0,8.0,18.0]
|
||||
# let nums = [-3.0, -1.0, 0.0, -2.0, 0.0, 2.0, -3.0, -1.0, 0.0]
|
||||
let DIM = 100
|
||||
var numbers = newSeq[float64](DIM * DIM)
|
||||
for i in 0...len(numbers):
|
||||
numbers[i] = float64(random(-DIM..DIM))
|
||||
|
||||
var mtx = newMatrix[float64](DIM,DIM,numbers)
|
||||
var lu = mtx.clone()
|
||||
let pivot = lu.lu()
|
||||
var b = newVector[float64](DIM)
|
||||
for i in 0...len(b):
|
||||
b[i] = float64(random(DIM))
|
||||
|
||||
let x = lu.lu_solve(b, pivot)
|
||||
let error = (mtx * x) - b
|
||||
|
||||
check(error.norm() < 1e-5)
|
||||
# var mtx2 = mtx.clone
|
||||
# for i in 0...10000:
|
||||
# var add = random(-DIM..DIM).float64()
|
||||
# discard mtx2 += add
|
||||
|
||||
# echo mtx
|
||||
# mtx[1,1] += 10000.0
|
||||
# echo mtx
|
||||
# echo mtx.det()
|
||||
|
||||
# echo lu
|
||||
|
||||
# give up and stop if this fails
|
||||
|
||||
echo "suite teardown: run once after the tests"
|
||||
|
||||
# let m1 = newMatrix[float](3,3,[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0])
|
||||
# var m2 = m1.clone()
|
||||
# let m3 = m2.clone()
|
||||
# m2[2,1] = -25
|
||||
# echo m1 + m2
|
||||
# echo m2
|
||||
# echo m1.det()
|
||||
|
||||
# let nums = [-63, 3, 70, -23, 55,
|
||||
# -100, -37, 81, -98, 84,
|
||||
# -36, -45, -70, 98, -18,
|
||||
# -15, 92, 82, 85, -2,
|
||||
# 45, 54, -22, 27, 0
|
||||
# ]
|
||||
|
||||
# let s = nums.map(proc(n : int) : float = float(n))
|
||||
# let s2 = nums.map(n => float(n))
|
||||
|
||||
# let m4 = newMatrix[float](5,5,s)
|
||||
# echo m4
|
||||
# echo m4.det
|
||||
|
||||
# var m5 = m4.clone()
|
||||
# var pivot = m5.lu()
|
||||
# let b = createVector[float](1.0,2.0,3.0,4.0,5.0)
|
||||
# let x = m5.lu_solve(b, pivot)
|
||||
# echo x
|
||||
# proc new(T: typedesc): ref T =
|
||||
# echo "allocating "
|
||||
# new(result)
|
||||
|
||||
# var n = new Vector[int]
|
||||
|
||||
# type
|
||||
# Index = distinct int
|
||||
|
||||
# proc `==` (a, b: Index): bool {.borrow.}
|
||||
|
||||
# var af = (0, 0.Index)
|
||||
# var b = (0, 0.Index)
|
||||
|
||||
# echo af == b # works!
|
||||
|
||||
|
||||
# type Person = ref object of RootObj
|
||||
# name : string
|
||||
# age : int
|
||||
|
||||
# type Employee = ref object of Person
|
||||
# salary: int
|
||||
|
||||
|
||||
# type RecordType = tuple or object
|
||||
|
||||
# proc printFields(rec: RecordType) =
|
||||
# for key, value in fieldPairs(rec):
|
||||
# echo key, " = ", value
|
||||
|
||||
# proc printFields(rec: ref[RecordType]) =
|
||||
# for key, value in fieldPairs(rec[]):
|
||||
# echo key, " = ", value
|
||||
|
||||
|
||||
# let p = Person(name : "Walter", age : 28)
|
||||
# let e = Employee(name : "Walter", age : 28, salary: 45000)
|
||||
|
||||
# let people : seq[Person] = @[p, e]
|
||||
|
||||
# for person in people:
|
||||
# printFields person
|
||||
|
||||
# let DIM = 5
|
||||
# var numbers = newSeq[float](DIM * DIM)
|
||||
# for i in 0...len(numbers):
|
||||
# numbers[i] = float(random(DIM))
|
||||
|
||||
# let m = newMatrix[float](DIM,DIM, numbers)
|
||||
|
||||
# var m2 = new(Matrix[float])
|
||||
# m2[] = m.clone()
|
||||
# echo m2[]
|
||||
# m2[][0,0] = 300
|
||||
# echo m2[]
|
||||
|
||||
# let inverse = m2[].invert()
|
||||
|
||||
# echo m
|
||||
# echo m.det
|
||||
# echo m * inverse
|
||||
# echo inverse * m
|
||||
|
||||
# let nums = [2.0,1.0,3.0,2.0,6.0,8.0,6.0,8.0,18.0]
|
||||
# let nums = [-3.0, -1.0, 0.0, -2.0, 0.0, 2.0, -3.0, -1.0, 0.0]
|
||||
# let DIM = 600
|
||||
# var numbers = newSeq[float64](DIM * DIM)
|
||||
# for i in 0...len(numbers):
|
||||
# numbers[i] = float64(random(-DIM..DIM))
|
||||
|
||||
# var mtx = newMatrix[float64](DIM,DIM,numbers)
|
||||
# var mtx2 = mtx.clone
|
||||
# for i in 0...10000:
|
||||
# var add = random(-DIM..DIM).float64()
|
||||
# discard mtx2 += add
|
||||
|
||||
# echo mtx
|
||||
# mtx[1,1] += 10000.0
|
||||
# echo mtx
|
||||
# echo mtx.det()
|
||||
|
||||
# var lu = mtx.clone()
|
||||
# let pivot = lu.lu()
|
||||
# # echo lu
|
||||
|
||||
# var b = newVector[float64](DIM)
|
||||
# for i in 0...len(b):
|
||||
# b[i] = float64(random(DIM))
|
||||
|
||||
# let x = lu.lu_solve(b, pivot)
|
||||
# let error = (mtx * x) - b
|
||||
|
||||
# echo abs(error)
|
Reference in New Issue
Block a user