Files
icicle/wrappers/golang/core/slice_test.go
ChickenLover 7265d18d48 ICICLE V2 Release (#492)
This PR introduces major updates for ICICLE Core, Rust and Golang
bindings

---------

Co-authored-by: Yuval Shekel <yshekel@gmail.com>
Co-authored-by: DmytroTym <dmytrotym1@gmail.com>
Co-authored-by: Otsar <122266060+Otsar-Raikou@users.noreply.github.com>
Co-authored-by: VitaliiH <vhnatyk@gmail.com>
Co-authored-by: release-bot <release-bot@ingonyama.com>
Co-authored-by: Stas <spolonsky@icloud.com>
Co-authored-by: Jeremy Felder <jeremy.felder1@gmail.com>
Co-authored-by: ImmanuelSegol <3ditds@gmail.com>
Co-authored-by: JimmyHongjichuan <45908291+JimmyHongjichuan@users.noreply.github.com>
Co-authored-by: pierre <pierreuu@gmail.com>
Co-authored-by: Leon Hibnik <107353745+LeonHibnik@users.noreply.github.com>
Co-authored-by: nonam3e <timur@ingonyama.com>
Co-authored-by: Vlad <88586482+vladfdp@users.noreply.github.com>
Co-authored-by: LeonHibnik <leon@ingonyama.com>
Co-authored-by: nonam3e <71525212+nonam3e@users.noreply.github.com>
Co-authored-by: vladfdp <vlad.heintz@gmail.com>
2024-04-23 05:26:40 +03:00

225 lines
6.5 KiB
Go

package core
import (
"math/rand"
"testing"
"unsafe"
"github.com/ingonyama-zk/icicle/wrappers/golang/core/internal"
"github.com/stretchr/testify/assert"
)
func randomField(size int) internal.MockBaseField {
limbs := make([]uint32, size)
for i := range limbs {
limbs[i] = rand.Uint32()
}
var field internal.MockBaseField
field.FromLimbs(limbs)
return field
}
func randomFields(numFields, fieldSize int) []internal.MockBaseField {
var randFields []internal.MockBaseField
for i := 0; i < numFields; i++ {
randFields = append(randFields, randomField(fieldSize))
}
return randFields
}
// This function is solely for the purpose of testing HostDeviceSlice
// It can produce invalid points and should not be used to test curve operations
func randomProjectivePoints(numPoints, fieldSize int) []internal.MockProjective {
var randProjectives []internal.MockProjective
for i := 0; i < numPoints; i++ {
projective := internal.MockProjective{
X: randomField(fieldSize),
Y: randomField(fieldSize),
Z: randomField(fieldSize),
}
randProjectives = append(randProjectives, projective)
}
return randProjectives
}
// This function is solely for the purpose of testing HostDeviceSlice
// It can produce invalid points and should not be used to test curve operations
func randomAffinePoints(numPoints, fieldSize int) []internal.MockAffine {
var randAffines []internal.MockAffine
for i := 0; i < numPoints; i++ {
affine := internal.MockAffine{
X: randomField(fieldSize),
Y: randomField(fieldSize),
}
randAffines = append(randAffines, affine)
}
return randAffines
}
const (
numPoints = 4
numFields = 4
fieldSize = 4
fieldBytesSize = fieldSize * 4
)
func TestHostSlice(t *testing.T) {
var emptyHostSlice HostSlice[internal.MockBaseField]
assert.Equal(t, emptyHostSlice.Len(), 0)
assert.Equal(t, emptyHostSlice.Cap(), 0)
randFields := randomFields(numFields, fieldSize)
hostSlice := HostSliceFromElements(randFields)
assert.Equal(t, hostSlice.Len(), 4)
assert.Equal(t, hostSlice.Cap(), 4)
hostSliceCasted := (HostSlice[internal.MockBaseField])(randFields)
assert.Equal(t, hostSliceCasted.Len(), 4)
assert.Equal(t, hostSliceCasted.Cap(), 4)
}
func TestHostSliceIsEmpty(t *testing.T) {
var emptyHostSlice HostSlice[*internal.MockBaseField]
assert.True(t, emptyHostSlice.IsEmpty())
randFields := randomFields(numFields, fieldSize)
hostSlice := HostSliceFromElements(randFields)
assert.False(t, hostSlice.IsEmpty())
}
func TestHostSliceIsOnDevice(t *testing.T) {
var emptyHostSlice HostSlice[*internal.MockBaseField]
assert.False(t, emptyHostSlice.IsOnDevice())
}
func TestHostSliceSizeOf(t *testing.T) {
randFields := randomFields(numFields, fieldSize)
hostSlice := HostSliceFromElements(randFields)
assert.Equal(t, hostSlice.SizeOfElement(), fieldSize*4)
}
func TestDeviceSlice(t *testing.T) {
var emptyDeviceSlice DeviceSlice
assert.Equal(t, 0, emptyDeviceSlice.Len())
assert.Equal(t, 0, emptyDeviceSlice.Cap())
assert.Equal(t, unsafe.Pointer(nil), emptyDeviceSlice.AsUnsafePointer())
emptyDeviceSlice.Malloc(numFields*fieldBytesSize, fieldBytesSize)
assert.Equal(t, numFields, emptyDeviceSlice.Len())
assert.Equal(t, numFields*fieldBytesSize, emptyDeviceSlice.Cap())
assert.NotEqual(t, unsafe.Pointer(nil), emptyDeviceSlice.AsUnsafePointer())
emptyDeviceSlice.Free()
assert.Equal(t, 0, emptyDeviceSlice.Len())
assert.Equal(t, 0, emptyDeviceSlice.Cap())
assert.Equal(t, unsafe.Pointer(nil), emptyDeviceSlice.AsUnsafePointer())
}
func TestDeviceSliceIsEmpty(t *testing.T) {
var emptyDeviceSlice DeviceSlice
assert.True(t, emptyDeviceSlice.IsEmpty())
const bytes = numFields * fieldBytesSize
emptyDeviceSlice.Malloc(bytes, fieldBytesSize)
randFields := randomFields(numFields, fieldSize)
hostSlice := HostSliceFromElements(randFields)
hostSlice.CopyToDevice(&emptyDeviceSlice, false)
assert.False(t, emptyDeviceSlice.IsEmpty())
}
func TestDeviceSliceIsOnDevice(t *testing.T) {
var deviceSlice DeviceSlice
assert.True(t, deviceSlice.IsOnDevice())
}
func TestCopyToFromHostDeviceField(t *testing.T) {
var emptyDeviceSlice DeviceSlice
numFields := 1 << 10
randFields := randomFields(numFields, fieldSize)
hostSlice := HostSliceFromElements(randFields)
hostSlice.CopyToDevice(&emptyDeviceSlice, true)
randFields2 := randomFields(numFields, fieldSize)
hostSlice2 := HostSliceFromElements(randFields2)
assert.NotEqual(t, hostSlice, hostSlice2)
hostSlice2.CopyFromDevice(&emptyDeviceSlice)
assert.Equal(t, hostSlice, hostSlice2)
}
func TestCopyToFromHostDeviceAffinePoints(t *testing.T) {
var emptyDeviceSlice DeviceSlice
numPoints := 1 << 10
randAffines := randomAffinePoints(numPoints, fieldSize)
hostSlice := HostSliceFromElements(randAffines)
hostSlice.CopyToDevice(&emptyDeviceSlice, true)
randAffines2 := randomAffinePoints(numPoints, fieldSize)
hostSlice2 := HostSliceFromElements(randAffines2)
assert.NotEqual(t, hostSlice, hostSlice2)
hostSlice2.CopyFromDevice(&emptyDeviceSlice)
emptyDeviceSlice.Free()
assert.Equal(t, hostSlice, hostSlice2)
}
func TestCopyToFromHostDeviceProjectivePoints(t *testing.T) {
var emptyDeviceSlice DeviceSlice
numPoints := 1 << 15
randProjectives := randomProjectivePoints(numPoints, fieldSize)
hostSlice := HostSliceFromElements(randProjectives)
hostSlice.CopyToDevice(&emptyDeviceSlice, true)
randProjectives2 := randomProjectivePoints(numPoints, fieldSize)
hostSlice2 := HostSliceFromElements(randProjectives2)
assert.NotEqual(t, hostSlice, hostSlice2)
hostSlice2.CopyFromDevice(&emptyDeviceSlice)
assert.Equal(t, hostSlice, hostSlice2)
}
func TestSliceRanges(t *testing.T) {
var deviceSlice DeviceSlice
numPoints := 1 << 3
randProjectives := randomProjectivePoints(numPoints, fieldSize)
hostSlice := (HostSlice[internal.MockProjective])(randProjectives)
hostSlice.CopyToDevice(&deviceSlice, true)
// RangeFrom
var zeroProj internal.MockProjective
hostSliceRet := HostSliceWithValue[internal.MockProjective](zeroProj, numPoints-2)
deviceSliceRangeFrom := deviceSlice.RangeFrom(2)
hostSliceRet.CopyFromDevice(&deviceSliceRangeFrom)
assert.Equal(t, hostSlice[2:], hostSliceRet)
// RangeTo
deviceSliceRangeTo := deviceSlice.RangeTo(numPoints-3, true)
hostSliceRet.CopyFromDevice(&deviceSliceRangeTo)
assert.Equal(t, hostSlice[:6], hostSliceRet)
// Range
hostSliceRange := HostSliceWithValue[internal.MockProjective](zeroProj, numPoints-4)
deviceSliceRange := deviceSlice.Range(2, numPoints-3, true)
hostSliceRange.CopyFromDevice(&deviceSliceRange)
assert.Equal(t, hostSlice[2:6], hostSliceRange)
}