Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HW7 #15

Open
wants to merge 10 commits into
base: main
Choose a base branch
from
Open

HW7 #15

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
12 changes: 7 additions & 5 deletions FsharpSln.sln
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "LibHw2", "src\LibHw2\LibHw2
EndProject
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Test", "Test\Test.fsproj", "{363D4F3B-6E01-4E01-9616-7C95DFB0F5B6}"
EndProject
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "LibHw7", "src\LibHw7\LibHw7.fsproj", "{50335321-2C50-43C0-8F8F-436AAEDF2D43}"
EndProject
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "ImageProcessing", "src\ImageProcessing\ImageProcessing.fsproj", "{3C564DE7-3B68-4DAE-AD09-F1987066BA36}"
EndProject
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "LibHw3", "src\LibHw3\LibHw3.fsproj", "{E63C1F63-167B-47D5-A94C-6C00CDAC9104}"
Expand All @@ -32,13 +34,13 @@ Global
{363D4F3B-6E01-4E01-9616-7C95DFB0F5B6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{363D4F3B-6E01-4E01-9616-7C95DFB0F5B6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{363D4F3B-6E01-4E01-9616-7C95DFB0F5B6}.Release|Any CPU.Build.0 = Release|Any CPU
{3C564DE7-3B68-4DAE-AD09-F1987066BA36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3C564DE7-3B68-4DAE-AD09-F1987066BA36}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3C564DE7-3B68-4DAE-AD09-F1987066BA36}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3C564DE7-3B68-4DAE-AD09-F1987066BA36}.Release|Any CPU.Build.0 = Release|Any CPU
{50335321-2C50-43C0-8F8F-436AAEDF2D43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{50335321-2C50-43C0-8F8F-436AAEDF2D43}.Debug|Any CPU.Build.0 = Debug|Any CPU
{50335321-2C50-43C0-8F8F-436AAEDF2D43}.Release|Any CPU.ActiveCfg = Release|Any CPU
{50335321-2C50-43C0-8F8F-436AAEDF2D43}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{07D1365E-068B-4B9D-999D-4F9C3B544697} = {C3F2792A-709B-4169-ADE4-3D55DC717452}
{EEDB2603-0992-464E-B575-A9A5E31DFA3B} = {C3F2792A-709B-4169-ADE4-3D55DC717452}
EndGlobalSection
EndGlobal
EndGlobal
9 changes: 2 additions & 7 deletions Test/Test.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,7 @@
</PropertyGroup>

<ItemGroup>
<Compile Include="TestsImageProc.fs" />
<Compile Include="TestsHw3.fs" />
<Compile Include="TestHw1.fs" />
<Compile Include="TestsHw7.fs" />
<Compile Include="Program.fs" />
</ItemGroup>

Expand All @@ -31,10 +29,7 @@
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\src\LibHw2\LibHw2.fsproj" />
<ProjectReference Include="..\src\ImageProcessing\ImageProcessing.fsproj" />
<ProjectReference Include="..\src\LibHw3\LibHw3.fsproj" />
<ProjectReference Include="..\src\LibHw1\LibHw1.fsproj" />
<ProjectReference Include="..\src\LibHw7\LibHw7.fsproj" />
</ItemGroup>

</Project>
164 changes: 164 additions & 0 deletions Test/TestsHw7.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
namespace tests

open System
open Xunit
open FsCheck
open FsCheck.Xunit
open QuattroMatrix
open QuattroMatrix.Matrix

module PropertyQtreeTest =

let toArray (mat: 'T array2d) : 'T array =
let height = Array2D.length1 mat
let width = Array2D.length2 mat
Array.init (height * width) (fun i ->
let row = i / width
let col = i % width
mat.[row, col]
)

let multMatr mulFunc addFunc mat1 mat2 =
if Array2D.length1 mat1 <> Array2D.length2 mat2
then failwith "Matrices have different sizes"
else
let multedMat = Array2D.zeroCreate (Array2D.length1 mat1) (Array2D.length2 mat2)
for i in 0 .. Array2D.length1 mat1 - 1 do
for j in 0 .. Array2D.length2 mat1 - 1 do
for k in 0 .. Array2D.length2 mat2 - 1 do
multedMat[i,j] <- addFunc multedMat[i,j] (mulFunc mat1[i,k] mat2[k,j])
multedMat

let createMaped2Matr func matr1 matr2 =
let rmatr1 = toArray matr1
let rmatr2 = toArray matr2
let resMatr = Array.map2 func rmatr1 rmatr2
resMatr

let createQtree matr =
let sqmatr = createSquareMatrix matr
let qmatr = createQuadMatrix sqmatr 0 0 (Array2D.length1 sqmatr)
qmatr, Array2D.length1 sqmatr

let createFinalMatrix (qtree: QuadMatrix<'T>) qsize heigth wide =
let qmatr2d = toArray2d qtree qsize
let actmatr = Array2D.create heigth wide Unchecked.defaultof<'T>
for i in 0 .. heigth - 1 do
for j in 0 .. wide - 1 do
actmatr[i, j] <- qmatr2d[i, j]
actmatr

let matrixGenerator rows cols (elementGen: Gen<'T>) : Gen<'T[,]> =
let genMatrix =
gen {
let! elements = Gen.array2DOfDim (rows, cols) elementGen
return elements
}
genMatrix

let testMap matr size func =
let heigth = Array2D.length1 matr
let wide = Array2D.length2 matr
let expmatr = Array2D.map func matr
let qmatr, qsize = createQtree matr
let mapedMatr = map func qmatr
let actmatr = createFinalMatrix mapedMatr qsize heigth wide
expmatr, actmatr

let testMap2 matr1 matr2 size func =
let expmatr = createMaped2Matr func matr1 matr2
let qmatr1, qsize1 = createQtree matr1
let qmatr2, qsize2 = createQtree matr2
let actqmatr = map2 func qmatr1 qmatr2
let actmatr2d = createFinalMatrix actqmatr qsize1 size size
let actmatr = toArray actmatr2d
let fequal = Array.forall2 (=) actmatr expmatr
fequal

let testMult matr1 matr2 size mulFunc addFunc =
let expmatr= multMatr mulFunc addFunc matr1 matr2
let qmatr1, qsize1 = createQtree matr1
let qmatr2, qsize2 = createQtree matr2
let actqmatr = multiplyMatrix mulFunc addFunc qmatr1 qsize1 qmatr2 qsize2
let actmatr = createFinalMatrix actqmatr qsize1 size size
expmatr, actmatr

[<Properties(MaxTest = 100)>]
type idTests() =

[<Property>]
member _.intTest (matr: int array2d) =
let qmatr, qsize = PropertyQtreeTest.createQtree matr
let mapedMatr = map id qmatr
Assert.Equal(qmatr, mapedMatr)

[<Property>]
member _.floatTest (matr: float32 array2d) =
let qmatr, qsize = PropertyQtreeTest.createQtree matr
let mapedMatr = map id qmatr
Assert.Equal(qmatr, mapedMatr)

[<Property>]
member _.charTest (matr: char array2d) =
let qmatr, qsize = PropertyQtreeTest.createQtree matr
let mapedMatr = map id qmatr
Assert.Equal(qmatr, mapedMatr)

type mapTest() =

[<Property>]
member _.intTest (size: uint) =
let matr = Gen.sample (int size) 1 (PropertyQtreeTest.matrixGenerator (int size) (int size) (Gen.elements {-100000..100000}))
let expmatr, actmatr = PropertyQtreeTest.testMap matr.[0] (int size) ((+) 1)
Assert.Equal(expmatr, actmatr)

[<Property>]
member _.charTest (size: uint) =
let matr = Gen.sample (int size) 1 (PropertyQtreeTest.matrixGenerator (int size) (int size) (Gen.elements {' '..'~'}))
let expmatr, actmatr = PropertyQtreeTest.testMap matr.[0] (int size) ((+) '1')
Assert.Equal(expmatr, actmatr)

[<Property>]
member _.floatTest (size: uint) =
let matr = Gen.sample (int size) 1 (PropertyQtreeTest.matrixGenerator (int size) (int size) (Gen.elements {-infinityf..infinityf}))
let expmatr, actmatr = PropertyQtreeTest.testMap matr.[0] (int size) ((+) 1f)
Assert.Equal(expmatr, actmatr)

type map2Test()=

[<Property>]
member _.intTest (size: uint) =
let matr = Gen.sample (int size) 2 (PropertyQtreeTest.matrixGenerator (int size) (int size) (Gen.elements {-100000..100000}))
let fequal = PropertyQtreeTest.testMap2 matr.[0] matr.[1] (int (int size))(+)
Assert.True(fequal)

[<Property>]
member _.charTest (size: uint) =
let matr = Gen.sample (int size) 2 (PropertyQtreeTest.matrixGenerator (int size) (int size) (Gen.elements {' '..'~'}))
let fequal = PropertyQtreeTest.testMap2 matr.[0] matr.[1] (int (int size))(+)
Assert.True(fequal)

[<Property>]
member _.floatTest (size: uint) =
let matr = Gen.sample (int size) 2 (PropertyQtreeTest.matrixGenerator (int size) (int size) (Gen.elements{-infinityf..infinityf}))
let fequal = PropertyQtreeTest.testMap2 matr.[0] matr.[1] (int (int size))(+)
Assert.True(fequal)

type multTest() =

[<Property>]
member _.intTest (size: uint) =
let matr = Gen.sample (int size) 2 (PropertyQtreeTest.matrixGenerator (int size) (int size) (Gen.elements {-100000..100000}))
let expmatr, actmatr = PropertyQtreeTest.testMult matr.[0] matr.[1] (int (int size)) ( * ) (+)
Assert.Equal(expmatr, actmatr)

[<Property>]
member _.charTest (size: uint) =
let matr = Gen.sample (int size) 2 (PropertyQtreeTest.matrixGenerator (int size) (int size) (Gen.elements {' ' .. '~'}))
let expmatr, actmatr = PropertyQtreeTest.testMult matr.[0] matr.[1] (int (int size)) (fun x y -> char (int x * int y)) (+)
Assert.Equal(expmatr, actmatr)
[<Property>]
member _.floatTest (size: uint) =
let matr = Gen.sample (int size) 2 (PropertyQtreeTest.matrixGenerator (int size) (int size) (Gen.elements {-infinityf .. infinityf}))
let expmatr, actmatr = PropertyQtreeTest.testMult matr.[0] matr.[1] (int (int size)) ( * ) (+)
Assert.Equal(expmatr, actmatr)
12 changes: 12 additions & 0 deletions src/LibHw7/LibHw7.fsproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>

<ItemGroup>
<Compile Include="Library.fs" />
</ItemGroup>

</Project>
Loading