utils.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package pb
  2. import "sort"
  3. func ToBurndownSparseMatrix(matrix [][]int64, name string) *BurndownSparseMatrix {
  4. if len(matrix) == 0 {
  5. panic("matrix may not be nil or empty")
  6. }
  7. r := BurndownSparseMatrix{
  8. Name: name,
  9. NumberOfRows: int32(len(matrix)),
  10. NumberOfColumns: int32(len(matrix[len(matrix)-1])),
  11. Rows: make([]*BurndownSparseMatrixRow, len(matrix)),
  12. }
  13. for i, status := range matrix {
  14. nnz := make([]uint32, 0, len(status))
  15. changed := false
  16. for j := range status {
  17. v := status[len(status)-1-j]
  18. if v < 0 {
  19. v = 0
  20. }
  21. if !changed {
  22. changed = v != 0
  23. }
  24. if changed {
  25. nnz = append(nnz, uint32(v))
  26. }
  27. }
  28. r.Rows[i] = &BurndownSparseMatrixRow{
  29. Columns: make([]uint32, len(nnz)),
  30. }
  31. for j := range nnz {
  32. r.Rows[i].Columns[j] = nnz[len(nnz)-1-j]
  33. }
  34. }
  35. return &r
  36. }
  37. func DenseToCompressedSparseRowMatrix(matrix [][]int64) *CompressedSparseRowMatrix {
  38. r := CompressedSparseRowMatrix{
  39. NumberOfRows: int32(len(matrix)),
  40. NumberOfColumns: int32(len(matrix[0])),
  41. Data: make([]int64, 0),
  42. Indices: make([]int32, 0),
  43. Indptr: make([]int64, 1),
  44. }
  45. r.Indptr[0] = 0
  46. for _, row := range matrix {
  47. nnz := 0
  48. for x, col := range row {
  49. if col != 0 {
  50. r.Data = append(r.Data, col)
  51. r.Indices = append(r.Indices, int32(x))
  52. nnz += 1
  53. }
  54. }
  55. r.Indptr = append(r.Indptr, r.Indptr[len(r.Indptr)-1]+int64(nnz))
  56. }
  57. return &r
  58. }
  59. func MapToCompressedSparseRowMatrix(matrix []map[int]int64) *CompressedSparseRowMatrix {
  60. r := CompressedSparseRowMatrix{
  61. NumberOfRows: int32(len(matrix)),
  62. NumberOfColumns: int32(len(matrix)),
  63. Data: make([]int64, 0),
  64. Indices: make([]int32, 0),
  65. Indptr: make([]int64, 1),
  66. }
  67. r.Indptr[0] = 0
  68. for _, row := range matrix {
  69. order := make([]int, len(row))
  70. i := 0
  71. for col := range row {
  72. order[i] = col
  73. i++
  74. }
  75. sort.Ints(order)
  76. for _, col := range order {
  77. val := row[col]
  78. r.Data = append(r.Data, val)
  79. r.Indices = append(r.Indices, int32(col))
  80. }
  81. r.Indptr = append(r.Indptr, r.Indptr[len(r.Indptr)-1]+int64(len(row)))
  82. }
  83. return &r
  84. }