utils.go 1.8 KB

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