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  )