Initial commit

This commit is contained in:
Alex Vanin 2019-01-14 13:10:56 +03:00
commit 148cd266e3
10 changed files with 1261 additions and 0 deletions

108
model/model.go Normal file
View file

@ -0,0 +1,108 @@
package model
import (
"math/rand"
"time"
)
type (
Node struct {
IR []int
}
ExperimentResult struct {
ViolatedCounter int
}
)
func getRandomN(n, max, seed int, r *rand.Rand) []int {
r.Seed(time.Now().UnixNano() + int64(seed))
if n > max/2 {
return r.Perm(max)[:n]
} else {
result := make([]int, 0, n)
re := make(map[int]struct{}, max)
for len(result) < n {
num := r.Intn(max)
if _, ok := re[num]; !ok {
result = append(result, num)
re[num] = struct{}{}
}
}
return result
}
}
func ExecuteModelA(ircount, containers, badcount, choose int) *ExperimentResult {
var (
nodes = make([]Node, containers)
badring = make(map[int]struct{})
result = new(ExperimentResult)
)
r := rand.New(rand.NewSource(time.Now().UnixNano()))
for len(badring) < badcount {
n := r.Intn(ircount)
if _, ok := badring[n]; !ok {
badring[n] = struct{}{}
}
}
for i := 0; i < ircount; i++ {
if _, ok := badring[i]; ok {
continue
}
rands := getRandomN(choose, containers, i+1, r)
for _, host := range rands {
nodes[host].IR = append(nodes[host].IR, i)
}
}
for _, node := range nodes {
if len(node.IR) == 0 {
result.ViolatedCounter++
}
}
return result
}
func ExecuteModelB(ircount, containers, badcount, choose int) *ExperimentResult {
var (
nodes = make([]Node, containers)
badring = make(map[int]struct{})
result = new(ExperimentResult)
)
r := rand.New(rand.NewSource(time.Now().UnixNano()))
for len(badring) < badcount {
n := r.Intn(ircount)
if _, ok := badring[n]; !ok {
badring[n] = struct{}{}
}
}
for i := 0; i < ircount; i++ {
if _, ok := badring[i]; ok {
continue
}
ind := (i * choose) % containers
for j := 0; j < choose; j++ {
nodes[ind].IR = append(nodes[ind].IR, i)
ind++
if ind == containers {
ind = 0
}
}
}
for _, node := range nodes {
if len(node.IR) == 0 {
result.ViolatedCounter++
}
}
return result
}

52
model/model_test.go Normal file
View file

@ -0,0 +1,52 @@
package model
import (
"fmt"
"math/rand"
"testing"
)
func TestGetRandom_A(t *testing.T) {
src := rand.NewSource(0)
t.Log(getRandomN(1, 10, 1, rand.New(src)))
t.Log(getRandomN(1, 10, 1, rand.New(src)))
t.Log(getRandomN(1, 10, 2, rand.New(src)))
}
func TestExecuteModelA(t *testing.T) {
var (
avg float32
nExperiments = 10000
results = make([]*ExperimentResult, nExperiments)
totalNodes = 10
tasks = 100
badNodes = 3
taskPoolSize = 33
)
for i := 0; i < nExperiments; i++ {
results[i] = ExecuteModelA(totalNodes, tasks, badNodes, taskPoolSize)
avg += float32(results[i].ViolatedCounter)
}
avg = avg / float32(nExperiments)
fmt.Printf("(%d) V=%d N=%d/%d AvgFailedV = %f (%.2f%%)\n", nExperiments, tasks, totalNodes, badNodes, avg, avg/float32(tasks)*100.00)
}
func TestExecuteModelB(t *testing.T) {
var (
avg float32
nExperiments = 10000
results = make([]*ExperimentResult, nExperiments)
totalNodes = 10
tasks = 100
badNodes = 3
taskPoolSize = 33
)
for i := 0; i < nExperiments; i++ {
results[i] = ExecuteModelB(totalNodes, tasks, badNodes, taskPoolSize)
avg += float32(results[i].ViolatedCounter)
}
avg = avg / float32(nExperiments)
fmt.Printf("(%d) V=%d N=%d/%d AvgFailedV = %f (%.2f%%)\n", nExperiments, tasks, totalNodes, badNodes, avg, avg/float32(tasks)*100.00)
}