go-hep.org/x/hep@v0.38.1/lcio/collections.go (about) 1 // Copyright ©2017 The go-hep Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package lcio 6 7 import ( 8 "fmt" 9 "reflect" 10 "strings" 11 12 "go-hep.org/x/hep/sio" 13 ) 14 15 // ID returns a unique identifier for ptr. 16 func ID(ptr any) uint32 { 17 rptr := reflect.ValueOf(ptr) 18 if !rptr.IsValid() || rptr.IsNil() { 19 return 0 20 } 21 rv := rptr.Elem() 22 return uint32(rv.UnsafeAddr()) 23 } 24 25 type FloatVec struct { 26 Flags Flags 27 Params Params 28 Elements [][]float32 29 } 30 31 func (vec FloatVec) String() string { 32 o := new(strings.Builder) 33 fmt.Fprintf(o, "%[1]s print out of LCFloatVec collection %[1]s\n\n", strings.Repeat("-", 15)) 34 fmt.Fprintf(o, " flag: 0x%x\n%v", vec.Flags, vec.Params) 35 fmt.Fprintf(o, "\n") 36 37 const ( 38 head = " [ id ] | val0, val1, ...\n" 39 tail = "------------|----------------\n" 40 ) 41 o.WriteString(head) 42 o.WriteString(tail) 43 for i, slice := range vec.Elements { 44 fmt.Fprintf(o, "[%09d] |", 45 ID(&vec.Elements[i]), 46 ) 47 for i, v := range slice { 48 if i > 0 { 49 fmt.Fprintf(o, ", ") 50 } 51 if i+1%10 == 0 { 52 fmt.Fprintf(o, "\n ") 53 } 54 fmt.Fprintf(o, "%8f", v) 55 } 56 fmt.Fprintf(o, "\n") 57 } 58 o.WriteString(tail) 59 return o.String() 60 } 61 62 func (*FloatVec) VersionSio() uint32 { 63 return Version 64 } 65 66 func (vec *FloatVec) MarshalSio(w sio.Writer) error { 67 enc := sio.NewEncoder(w) 68 enc.Encode(&vec.Flags) 69 enc.Encode(&vec.Params) 70 enc.Encode(vec.Elements) 71 enc.Encode(int32(len(vec.Elements))) 72 for i := range vec.Elements { 73 enc.Encode(int32(len(vec.Elements[i]))) 74 for _, v := range vec.Elements[i] { 75 enc.Encode(v) 76 } 77 if w.VersionSio() > 1002 { 78 enc.Tag(&vec.Elements[i]) 79 } 80 } 81 return enc.Err() 82 } 83 84 func (vec *FloatVec) UnmarshalSio(r sio.Reader) error { 85 dec := sio.NewDecoder(r) 86 dec.Decode(&vec.Flags) 87 dec.Decode(&vec.Params) 88 var nvecs int32 89 dec.Decode(&nvecs) 90 vec.Elements = make([][]float32, int(nvecs)) 91 for i := range vec.Elements { 92 var n int32 93 dec.Decode(&n) 94 vec.Elements[i] = make([]float32, int(n)) 95 for j := range vec.Elements[i] { 96 dec.Decode(&vec.Elements[i][j]) 97 } 98 if r.VersionSio() > 1002 { 99 dec.Tag(&vec.Elements[i]) 100 } 101 } 102 return dec.Err() 103 } 104 105 type IntVec struct { 106 Flags Flags 107 Params Params 108 Elements [][]int32 109 } 110 111 func (vec IntVec) String() string { 112 o := new(strings.Builder) 113 fmt.Fprintf(o, "%[1]s print out of LCIntVec collection %[1]s\n\n", strings.Repeat("-", 15)) 114 fmt.Fprintf(o, " flag: 0x%x\n%v", vec.Flags, vec.Params) 115 fmt.Fprintf(o, "\n") 116 117 const ( 118 head = " [ id ] | val0, val1, ...\n" 119 tail = "------------|----------------\n" 120 ) 121 o.WriteString(head) 122 o.WriteString(tail) 123 for i, slice := range vec.Elements { 124 fmt.Fprintf(o, "[%09d] |", 125 ID(&vec.Elements[i]), 126 ) 127 for i, v := range slice { 128 if i > 0 { 129 fmt.Fprintf(o, ", ") 130 } 131 if i+1%10 == 0 { 132 fmt.Fprintf(o, "\n ") 133 } 134 fmt.Fprintf(o, "%8d", v) 135 } 136 fmt.Fprintf(o, "\n") 137 } 138 o.WriteString(tail) 139 return o.String() 140 } 141 142 func (*IntVec) VersionSio() uint32 { 143 return Version 144 } 145 146 func (vec *IntVec) MarshalSio(w sio.Writer) error { 147 enc := sio.NewEncoder(w) 148 enc.Encode(&vec.Flags) 149 enc.Encode(&vec.Params) 150 enc.Encode(vec.Elements) 151 enc.Encode(int32(len(vec.Elements))) 152 for i := range vec.Elements { 153 enc.Encode(int32(len(vec.Elements[i]))) 154 for _, v := range vec.Elements[i] { 155 enc.Encode(v) 156 } 157 if w.VersionSio() > 1002 { 158 enc.Tag(&vec.Elements[i]) 159 } 160 } 161 return enc.Err() 162 } 163 164 func (vec *IntVec) UnmarshalSio(r sio.Reader) error { 165 dec := sio.NewDecoder(r) 166 dec.Decode(&vec.Flags) 167 dec.Decode(&vec.Params) 168 var nvecs int32 169 dec.Decode(&nvecs) 170 vec.Elements = make([][]int32, int(nvecs)) 171 for i := range vec.Elements { 172 var n int32 173 dec.Decode(&n) 174 vec.Elements[i] = make([]int32, int(n)) 175 for j := range vec.Elements[i] { 176 dec.Decode(&vec.Elements[i][j]) 177 } 178 if r.VersionSio() > 1002 { 179 dec.Tag(&vec.Elements[i]) 180 } 181 } 182 return dec.Err() 183 } 184 185 type StrVec struct { 186 Flags Flags 187 Params Params 188 Elements [][]string 189 } 190 191 func (vec StrVec) String() string { 192 o := new(strings.Builder) 193 fmt.Fprintf(o, "%[1]s print out of LCStrVec collection %[1]s\n\n", strings.Repeat("-", 15)) 194 fmt.Fprintf(o, " flag: 0x%x\n%v", vec.Flags, vec.Params) 195 fmt.Fprintf(o, "\n") 196 197 const ( 198 head = " [ id ] | val0, val1, ...\n" 199 tail = "------------|----------------\n" 200 ) 201 o.WriteString(head) 202 o.WriteString(tail) 203 for i, slice := range vec.Elements { 204 fmt.Fprintf(o, "[%09d] |", 205 ID(&vec.Elements[i]), 206 ) 207 for i, v := range slice { 208 if i > 0 { 209 fmt.Fprintf(o, ", ") 210 } 211 if i+1%10 == 0 { 212 fmt.Fprintf(o, "\n ") 213 } 214 fmt.Fprintf(o, "%s", v) 215 } 216 fmt.Fprintf(o, "\n") 217 } 218 o.WriteString(tail) 219 return o.String() 220 } 221 222 func (*StrVec) VersionSio() uint32 { 223 return Version 224 } 225 226 func (vec *StrVec) MarshalSio(w sio.Writer) error { 227 enc := sio.NewEncoder(w) 228 enc.Encode(&vec.Flags) 229 enc.Encode(&vec.Params) 230 enc.Encode(vec.Elements) 231 enc.Encode(int32(len(vec.Elements))) 232 for i := range vec.Elements { 233 enc.Encode(int32(len(vec.Elements[i]))) 234 for _, v := range vec.Elements[i] { 235 enc.Encode(v) 236 } 237 if w.VersionSio() > 1002 { 238 enc.Tag(&vec.Elements[i]) 239 } 240 } 241 return enc.Err() 242 } 243 244 func (vec *StrVec) UnmarshalSio(r sio.Reader) error { 245 dec := sio.NewDecoder(r) 246 dec.Decode(&vec.Flags) 247 dec.Decode(&vec.Params) 248 var nvecs int32 249 dec.Decode(&nvecs) 250 vec.Elements = make([][]string, int(nvecs)) 251 for i := range vec.Elements { 252 var n int32 253 dec.Decode(&n) 254 vec.Elements[i] = make([]string, int(n)) 255 for j := range vec.Elements[i] { 256 dec.Decode(&vec.Elements[i][j]) 257 } 258 if r.VersionSio() > 1002 { 259 dec.Tag(&vec.Elements[i]) 260 } 261 } 262 return dec.Err() 263 } 264 265 type GenericObject struct { 266 Flag Flags 267 Params Params 268 Data []GenericObjectData 269 } 270 271 type GenericObjectData struct { 272 I32s []int32 273 F32s []float32 274 F64s []float64 275 } 276 277 func (obj GenericObject) String() string { 278 o := new(strings.Builder) 279 fmt.Fprintf(o, "%[1]s print out of LCGenericObject collection %[1]s\n\n", strings.Repeat("-", 15)) 280 fmt.Fprintf(o, " flag: 0x%x\n%v\n", obj.Flag, obj.Params) 281 fmt.Fprintf(o, " [ id ] ") 282 if obj.Data != nil { 283 descr := "" 284 if v := obj.Params.Strings["DataDescription"]; len(v) > 0 { 285 descr = v[0] 286 } 287 fmt.Fprintf(o, 288 "%s - isFixedSize: %v\n", 289 descr, 290 obj.Flag.Test(BitsGOFixed), 291 ) 292 } else { 293 fmt.Fprintf(o, " Data.... \n") 294 } 295 296 tail := fmt.Sprintf(" %s", strings.Repeat("-", 55)) 297 298 fmt.Fprintf(o, "%s\n", tail) 299 for i := range obj.Data { 300 data := &obj.Data[i] 301 fmt.Fprintf(o, "%v\n", data) 302 fmt.Fprintf(o, "%s\n", tail) 303 } 304 return o.String() 305 } 306 307 func (obj *GenericObjectData) String() string { 308 o := new(strings.Builder) 309 fmt.Fprintf(o, "[%09d] ", ID(obj)) 310 for _, v := range obj.I32s { 311 fmt.Fprintf(o, "i:%d; ", v) 312 } 313 for _, v := range obj.F32s { 314 fmt.Fprintf(o, "f:%f; ", v) 315 } 316 for _, v := range obj.F64s { 317 fmt.Fprintf(o, "d:%f; ", v) 318 } 319 return o.String() 320 } 321 322 func (*GenericObject) VersionSio() uint32 { 323 return Version 324 } 325 326 func (obj *GenericObject) MarshalSio(w sio.Writer) error { 327 enc := sio.NewEncoder(w) 328 enc.Encode(&obj.Flag) 329 enc.Encode(&obj.Params) 330 331 if obj.Flag.Test(BitsGOFixed) { 332 var ( 333 ni32 int32 334 nf32 int32 335 nf64 int32 336 ) 337 338 if len(obj.Data) > 0 { 339 data := obj.Data[0] 340 ni32 = int32(len(data.I32s)) 341 nf32 = int32(len(data.F32s)) 342 nf64 = int32(len(data.F64s)) 343 } 344 enc.Encode(&ni32) 345 enc.Encode(&nf32) 346 enc.Encode(&nf64) 347 } 348 enc.Encode(int32(len(obj.Data))) 349 for iobj := range obj.Data { 350 data := &obj.Data[iobj] 351 if !obj.Flag.Test(BitsGOFixed) { 352 enc.Encode(int32(len(data.I32s))) 353 enc.Encode(int32(len(data.F32s))) 354 enc.Encode(int32(len(data.F64s))) 355 } 356 for i := range data.I32s { 357 enc.Encode(&data.I32s[i]) 358 } 359 for i := range data.F32s { 360 enc.Encode(&data.F32s[i]) 361 } 362 for i := range data.F64s { 363 enc.Encode(&data.F64s[i]) 364 } 365 enc.Tag(data) 366 } 367 368 return enc.Err() 369 } 370 371 func (obj *GenericObject) UnmarshalSio(r sio.Reader) error { 372 dec := sio.NewDecoder(r) 373 dec.Decode(&obj.Flag) 374 dec.Decode(&obj.Params) 375 376 var ( 377 ni32 int32 378 nf32 int32 379 nf64 int32 380 nobjs int32 381 ) 382 383 if obj.Flag.Test(BitsGOFixed) { 384 dec.Decode(&ni32) 385 dec.Decode(&nf32) 386 dec.Decode(&nf64) 387 } 388 dec.Decode(&nobjs) 389 obj.Data = make([]GenericObjectData, int(nobjs)) 390 for iobj := range obj.Data { 391 data := &obj.Data[iobj] 392 if !obj.Flag.Test(BitsGOFixed) { 393 dec.Decode(&ni32) 394 dec.Decode(&nf32) 395 dec.Decode(&nf64) 396 } 397 data.I32s = make([]int32, int(ni32)) 398 for i := range data.I32s { 399 dec.Decode(&data.I32s[i]) 400 } 401 data.F32s = make([]float32, int(nf32)) 402 for i := range data.F32s { 403 dec.Decode(&data.F32s[i]) 404 } 405 data.F64s = make([]float64, int(nf64)) 406 for i := range data.F64s { 407 dec.Decode(&data.F64s[i]) 408 } 409 410 dec.Tag(data) 411 } 412 413 return dec.Err() 414 } 415 416 type RelationContainer struct { 417 Flags Flags 418 Params Params 419 Rels []Relation 420 } 421 422 type Relation struct { 423 From any 424 To any 425 Weight float32 426 } 427 428 func (rc RelationContainer) String() string { 429 o := new(strings.Builder) 430 fmt.Fprintf(o, "%[1]s print out of LCRelation collection %[1]s\n\n", strings.Repeat("-", 15)) 431 fmt.Fprintf(o, " flag: 0x%x\n%v\n", rc.Flags, rc.Params) 432 433 const ( 434 header = " [from_id ] | [ to_id ] | Weight \n" 435 tail = "-------------|-------------|---------\n" 436 ) 437 438 o.WriteString(header) 439 o.WriteString(tail) 440 for _, rel := range rc.Rels { 441 fmt.Fprintf(o, 442 " [%09d] | [%09d] | %.2e\n", 443 ID(rel.From), 444 ID(rel.To), 445 rel.Weight, 446 ) 447 } 448 return o.String() 449 } 450 451 func (*RelationContainer) VersionSio() uint32 { 452 return Version 453 } 454 455 func (rc *RelationContainer) MarshalSio(w sio.Writer) error { 456 enc := sio.NewEncoder(w) 457 enc.Encode(&rc.Flags) 458 enc.Encode(&rc.Params) 459 enc.Encode(int32(len(rc.Rels))) 460 for i := range rc.Rels { 461 rel := &rc.Rels[i] 462 enc.Pointer(&rel.From) 463 enc.Pointer(&rel.To) 464 if rc.Flags.Test(BitsRelWeighted) { 465 enc.Encode(&rel.Weight) 466 } 467 } 468 return enc.Err() 469 } 470 471 func (rc *RelationContainer) UnmarshalSio(r sio.Reader) error { 472 dec := sio.NewDecoder(r) 473 dec.Decode(&rc.Flags) 474 dec.Decode(&rc.Params) 475 var n int32 476 dec.Decode(&n) 477 rc.Rels = make([]Relation, int(n)) 478 for i := range rc.Rels { 479 rel := &rc.Rels[i] 480 dec.Pointer(&rel.From) 481 dec.Pointer(&rel.To) 482 if rc.Flags.Test(BitsRelWeighted) { 483 dec.Decode(&rel.Weight) 484 } 485 } 486 return dec.Err() 487 } 488 489 type References struct { 490 Flags Flags 491 Params Params 492 Refs []any 493 } 494 495 func (*References) VersionSio() uint32 { 496 return Version 497 } 498 499 func (refs *References) MarshalSio(w sio.Writer) error { 500 enc := sio.NewEncoder(w) 501 enc.Encode(&refs.Flags) 502 enc.Encode(&refs.Params) 503 enc.Encode(int32(len(refs.Refs))) 504 for i := range refs.Refs { 505 ref := &refs.Refs[i] 506 enc.Pointer(ref) 507 } 508 return enc.Err() 509 } 510 511 func (refs *References) UnmarshalSio(r sio.Reader) error { 512 dec := sio.NewDecoder(r) 513 dec.Decode(&refs.Flags) 514 dec.Decode(&refs.Params) 515 var n int32 516 dec.Decode(&n) 517 refs.Refs = make([]any, int(n)) 518 for i := range refs.Refs { 519 ref := &refs.Refs[i] 520 dec.Pointer(ref) 521 } 522 return dec.Err() 523 } 524 525 var ( 526 _ sio.Versioner = (*FloatVec)(nil) 527 _ sio.Codec = (*FloatVec)(nil) 528 _ sio.Versioner = (*IntVec)(nil) 529 _ sio.Codec = (*IntVec)(nil) 530 _ sio.Versioner = (*StrVec)(nil) 531 _ sio.Codec = (*StrVec)(nil) 532 _ sio.Versioner = (*GenericObject)(nil) 533 _ sio.Codec = (*GenericObject)(nil) 534 _ sio.Versioner = (*RelationContainer)(nil) 535 _ sio.Codec = (*RelationContainer)(nil) 536 _ sio.Versioner = (*References)(nil) 537 _ sio.Codec = (*References)(nil) 538 )