utils.go 2.0 KB

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