first simple test for positive aspects
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -16,3 +16,4 @@
|
|||||||
# vendor/
|
# vendor/
|
||||||
|
|
||||||
.~lock.*.ods#
|
.~lock.*.ods#
|
||||||
|
out.txt
|
||||||
|
|||||||
Binary file not shown.
47
matrix.go
47
matrix.go
@@ -1,5 +1,10 @@
|
|||||||
package goodcalc
|
package goodcalc
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"math"
|
||||||
|
)
|
||||||
|
|
||||||
// Matrix contains the stakeholders and the maximal
|
// Matrix contains the stakeholders and the maximal
|
||||||
// allowed points of the calculation. The calculation
|
// allowed points of the calculation. The calculation
|
||||||
// is pretty simple. Inside each aspect ValuationPoints
|
// is pretty simple. Inside each aspect ValuationPoints
|
||||||
@@ -16,7 +21,38 @@ type Matrix struct {
|
|||||||
MaxNegValuationPoints int `json:"max_neg_valuation_points"` // -200
|
MaxNegValuationPoints int `json:"max_neg_valuation_points"` // -200
|
||||||
NegPointsFactor int `json:"neg_points_factor"` // 50
|
NegPointsFactor int `json:"neg_points_factor"` // 50
|
||||||
Stakeholders []*Stakeholder `json:"stakeholders"`
|
Stakeholders []*Stakeholder `json:"stakeholders"`
|
||||||
Calculation MatrixCalc `json:"calculation"`
|
Calculation *MatrixCalc `json:"calculation"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Matrix) String() string {
|
||||||
|
if m == nil {
|
||||||
|
return "<nil>"
|
||||||
|
}
|
||||||
|
var s string
|
||||||
|
s += fmt.Sprintf("MaxPoints: %d\n", m.MaxPoints)
|
||||||
|
s += fmt.Sprintf("MaxValuationPoints: %d\n", m.MaxValuationPoints)
|
||||||
|
s += fmt.Sprintf("MaxNegValuationPoints: %d\n", m.MaxNegValuationPoints)
|
||||||
|
s += fmt.Sprintf("NegPointsFactor: %d\n", m.NegPointsFactor)
|
||||||
|
s += fmt.Sprintf("Calculation: %#v\n", m.Calculation)
|
||||||
|
s += fmt.Sprintf("Stakeholders: {\n%s\n}\n", m.Stakeholders)
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Matrix) BalancePoints() int {
|
||||||
|
var balancePoints float64
|
||||||
|
m.calcWeightFactor()
|
||||||
|
m.setMaxValuationPoints()
|
||||||
|
m.forall(func(t *Theme) {
|
||||||
|
t.Calc.calcMaxPoints()
|
||||||
|
t.calcNrPosAspects()
|
||||||
|
t.calcValPoints()
|
||||||
|
t.calcEstPercentage()
|
||||||
|
t.calcBalancePoints()
|
||||||
|
balancePoints += float64(t.Calc.BalancePoints)
|
||||||
|
balancePoints += float64(t.Calc.NegativeBlancePoints)
|
||||||
|
})
|
||||||
|
balancePoints = math.Round(balancePoints)
|
||||||
|
return int(balancePoints)
|
||||||
}
|
}
|
||||||
|
|
||||||
// MatrixCalc contains calculated values
|
// MatrixCalc contains calculated values
|
||||||
@@ -34,7 +70,14 @@ func (m *Matrix) forall(f func(t *Theme)) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// sumCalcWeight sums all the calculated weights of
|
||||||
|
// the matrix.
|
||||||
func (m *Matrix) sumCalcWeight() {
|
func (m *Matrix) sumCalcWeight() {
|
||||||
|
// calculate the stakeholder weight to each
|
||||||
|
// theme
|
||||||
|
for _, s := range m.Stakeholders {
|
||||||
|
s.calcWeight()
|
||||||
|
}
|
||||||
m.Calculation.SumCalcWeight = 0
|
m.Calculation.SumCalcWeight = 0
|
||||||
m.forall(func(t *Theme) {
|
m.forall(func(t *Theme) {
|
||||||
m.Calculation.SumCalcWeight += t.Calc.CalcWeight
|
m.Calculation.SumCalcWeight += t.Calc.CalcWeight
|
||||||
@@ -63,7 +106,7 @@ func (m *Matrix) setMaxValuationPoints() {
|
|||||||
maxThemeValPoints := 0
|
maxThemeValPoints := 0
|
||||||
for _, a := range t.Aspects {
|
for _, a := range t.Aspects {
|
||||||
a.MaxValuationPoints = m.MaxValuationPoints * int(a.Weight)
|
a.MaxValuationPoints = m.MaxValuationPoints * int(a.Weight)
|
||||||
maxThemeValPoints += m.MaxNegValuationPoints * int(a.Weight)
|
maxThemeValPoints += m.MaxValuationPoints * int(a.Weight)
|
||||||
}
|
}
|
||||||
t.Calc.MaxValuationPoints = maxThemeValPoints
|
t.Calc.MaxValuationPoints = maxThemeValPoints
|
||||||
for _, na := range t.NegativeAspects {
|
for _, na := range t.NegativeAspects {
|
||||||
|
|||||||
76
matrix_test.go
Normal file
76
matrix_test.go
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
package goodcalc
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func emptyMatrix() *Matrix {
|
||||||
|
m := Matrix{
|
||||||
|
MaxPoints: 1000,
|
||||||
|
MaxValuationPoints: 10,
|
||||||
|
MaxNegValuationPoints: -200,
|
||||||
|
NegPointsFactor: 50,
|
||||||
|
Stakeholders: []*Stakeholder{},
|
||||||
|
Calculation: &MatrixCalc{
|
||||||
|
SumCalcWeight: 0,
|
||||||
|
WeightFactor: 0,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
stakeholderDefault := []Stakeholder{
|
||||||
|
{"A", 1.5, []*Theme{}},
|
||||||
|
{"B", 0.5, []*Theme{}},
|
||||||
|
{"C", 0.5, []*Theme{}},
|
||||||
|
{"D", 1, []*Theme{}},
|
||||||
|
{"E", 1, []*Theme{}},
|
||||||
|
}
|
||||||
|
|
||||||
|
themeDefault := []string{"1", "2", "3", "4"}
|
||||||
|
for _, st := range stakeholderDefault {
|
||||||
|
s := st
|
||||||
|
for _, th := range themeDefault {
|
||||||
|
t := Theme{
|
||||||
|
No: st.No + th,
|
||||||
|
Weight: 1,
|
||||||
|
Aspects: []Aspect{},
|
||||||
|
NegativeAspects: []NegativeAspect{},
|
||||||
|
NegPointsFactor: 0,
|
||||||
|
Calc: &ThemeCalc{},
|
||||||
|
}
|
||||||
|
for i := 1; i <= 2; i++ {
|
||||||
|
a := Aspect{
|
||||||
|
No: fmt.Sprintf("%s.%d", t.No, i),
|
||||||
|
Weight: 1,
|
||||||
|
ValuationPoints: 5,
|
||||||
|
}
|
||||||
|
t.Aspects = append(t.Aspects, a)
|
||||||
|
}
|
||||||
|
s.Themes = append(s.Themes, &t)
|
||||||
|
}
|
||||||
|
m.Stakeholders = append(m.Stakeholders, &s)
|
||||||
|
}
|
||||||
|
return &m
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMatrix_BalancePoints(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
m *Matrix
|
||||||
|
want int
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
"",
|
||||||
|
emptyMatrix(),
|
||||||
|
500,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if got := tt.m.BalancePoints(); got != tt.want {
|
||||||
|
t.Errorf("Matrix.BalancePoints() = %v, want %v", got, tt.want)
|
||||||
|
}
|
||||||
|
//fmt.Printf("%s", tt.m)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
package goodcalc
|
package goodcalc
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
// Stakeholder can define a weight, which is calculated to
|
// Stakeholder can define a weight, which is calculated to
|
||||||
// all containing themes.
|
// all containing themes.
|
||||||
// No is the id like in the excel
|
// No is the id like in the excel
|
||||||
@@ -10,6 +12,17 @@ type Stakeholder struct {
|
|||||||
Themes []*Theme `json:"themes"`
|
Themes []*Theme `json:"themes"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *Stakeholder) String() string {
|
||||||
|
var str string
|
||||||
|
str += fmt.Sprintf("\n No: %s\n", s.No)
|
||||||
|
str += fmt.Sprintf(" Weight: %.1f\n", s.Weight)
|
||||||
|
str += fmt.Sprintf(" Themes: %v\n", s.Themes)
|
||||||
|
return str
|
||||||
|
}
|
||||||
|
|
||||||
|
// calcWeight takes the weight of the stakeholder level
|
||||||
|
// and calculates that weight for each theme
|
||||||
|
// iteration 1 inside the example table
|
||||||
func (s *Stakeholder) calcWeight() {
|
func (s *Stakeholder) calcWeight() {
|
||||||
for _, t := range s.Themes {
|
for _, t := range s.Themes {
|
||||||
t.Calc.CalcWeight = s.Weight * t.Weight
|
t.Calc.CalcWeight = s.Weight * t.Weight
|
||||||
|
|||||||
35
theme.go
35
theme.go
@@ -1,5 +1,7 @@
|
|||||||
package goodcalc
|
package goodcalc
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
// Theme is the basic element of the matrix.
|
// Theme is the basic element of the matrix.
|
||||||
// No defines the id of the excel balance.
|
// No defines the id of the excel balance.
|
||||||
// A1 for Human dignity in the supply chain
|
// A1 for Human dignity in the supply chain
|
||||||
@@ -12,6 +14,17 @@ type Theme struct {
|
|||||||
Calc *ThemeCalc `json:"calculation"`
|
Calc *ThemeCalc `json:"calculation"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *Theme) String() string {
|
||||||
|
var s string
|
||||||
|
s += fmt.Sprintf(" No: %s\n", t.No)
|
||||||
|
s += fmt.Sprintf(" Weight: %.1f\n", t.Weight)
|
||||||
|
s += fmt.Sprintf(" Aspects: %v\n", t.Aspects)
|
||||||
|
s += fmt.Sprintf(" NegativeAspects: %v\n", t.NegativeAspects)
|
||||||
|
s += fmt.Sprintf(" NegPointsFactor: %v\n", t.NegPointsFactor)
|
||||||
|
s += fmt.Sprintf(" Calc: %s\n", t.Calc)
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
func (t *Theme) calcNrPosAspects() {
|
func (t *Theme) calcNrPosAspects() {
|
||||||
t.Calc.NrPositiveAspects = len(t.Aspects)
|
t.Calc.NrPositiveAspects = len(t.Aspects)
|
||||||
}
|
}
|
||||||
@@ -28,10 +41,10 @@ func (t *Theme) calcValPoints() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (t *Theme) calcEstPercentage() {
|
func (t *Theme) calcEstPercentage() {
|
||||||
t.Calc.EstPercentage = 0
|
t.Calc.EstPercentage = 1
|
||||||
if t.Calc.MaxValuationPoints != 0 {
|
if t.Calc.MaxValuationPoints != 0 {
|
||||||
t.Calc.EstPercentage =
|
t.Calc.EstPercentage =
|
||||||
float32(t.Calc.ValuationPoints / t.Calc.MaxValuationPoints)
|
float32(t.Calc.ValuationPoints) / float32(t.Calc.MaxValuationPoints)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,6 +70,24 @@ type ThemeCalc struct {
|
|||||||
NegativeBlancePoints float32 `json:"negative_blance_points"`
|
NegativeBlancePoints float32 `json:"negative_blance_points"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (tc *ThemeCalc) String() string {
|
||||||
|
if tc == nil {
|
||||||
|
return "<nil>"
|
||||||
|
}
|
||||||
|
var s string
|
||||||
|
s += fmt.Sprintf("\t\tCalcWeight: %.1f\n", tc.CalcWeight)
|
||||||
|
s += fmt.Sprintf("\t\tWeightFactor: %.1f\n", tc.WeightFactor)
|
||||||
|
s += fmt.Sprintf("\t\tMaxBalancePoints: %.1f\n", tc.MaxBalancePoints)
|
||||||
|
s += fmt.Sprintf("\t\tNrPositiveAspects: %d\n", tc.NrPositiveAspects)
|
||||||
|
s += fmt.Sprintf("\t\tValuationPoints: %d\n", tc.ValuationPoints)
|
||||||
|
s += fmt.Sprintf("\t\tMaxValuationPoints: %d\n", tc.MaxValuationPoints)
|
||||||
|
s += fmt.Sprintf("\t\tEstPercentage: %.1f\n", tc.EstPercentage)
|
||||||
|
s += fmt.Sprintf("\t\tBalancePoints: %.1f\n", tc.BalancePoints)
|
||||||
|
s += fmt.Sprintf("\t\tNegativeValuationPoints: %d\n", tc.NegativeValuationPoints)
|
||||||
|
s += fmt.Sprintf("\t\tNegativeBlancePoints: %.1f\n", tc.NegativeBlancePoints)
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
// calcMaxPoints
|
// calcMaxPoints
|
||||||
// Stakeholder.calcWeight needs to run first
|
// Stakeholder.calcWeight needs to run first
|
||||||
func (c *ThemeCalc) calcMaxPoints() {
|
func (c *ThemeCalc) calcMaxPoints() {
|
||||||
|
|||||||
Reference in New Issue
Block a user