go-hep.org/x/hep@v0.38.1/fwk/internal/fwktest/reducer.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 fwktest
     6  
     7  import (
     8  	"fmt"
     9  	"reflect"
    10  	"sync"
    11  
    12  	"go-hep.org/x/hep/fwk"
    13  )
    14  
    15  type reducer struct {
    16  	fwk.TaskBase
    17  
    18  	input string
    19  	exp   int64
    20  	sum   int64
    21  	nevts int
    22  	mux   sync.RWMutex
    23  }
    24  
    25  func (tsk *reducer) Configure(ctx fwk.Context) error {
    26  	err := tsk.DeclInPort(tsk.input, reflect.TypeOf(int64(0)))
    27  	if err != nil {
    28  		return err
    29  	}
    30  
    31  	return err
    32  }
    33  
    34  func (tsk *reducer) StartTask(ctx fwk.Context) error {
    35  	var err error
    36  	return err
    37  }
    38  
    39  func (tsk *reducer) StopTask(ctx fwk.Context) error {
    40  	var err error
    41  
    42  	tsk.mux.RLock()
    43  	sum := tsk.sum
    44  	nevts := tsk.nevts
    45  	tsk.mux.RUnlock()
    46  
    47  	msg := ctx.Msg()
    48  	if sum != tsk.exp {
    49  		msg.Errorf("expected sum=%v. got=%v (nevts=%d)\n", tsk.exp, sum, nevts)
    50  		return fmt.Errorf("%s: expected sum=%v. got=%v (nevts=%d)", tsk.Name(), tsk.exp, sum, nevts)
    51  	}
    52  	msg.Debugf("expected sum=%v. got=%v (all GOOD) (nevts=%d)\n", tsk.exp, sum, nevts)
    53  
    54  	return err
    55  }
    56  
    57  func (tsk *reducer) Process(ctx fwk.Context) error {
    58  	var err error
    59  
    60  	tsk.mux.Lock()
    61  	tsk.nevts += 1
    62  	tsk.mux.Unlock()
    63  
    64  	store := ctx.Store()
    65  	v, err := store.Get(tsk.input)
    66  	if err != nil {
    67  		return err
    68  	}
    69  
    70  	val := v.(int64)
    71  	tsk.mux.Lock()
    72  	tsk.sum += val
    73  	sum := tsk.sum
    74  	tsk.mux.Unlock()
    75  
    76  	msg := ctx.Msg()
    77  	msg.Infof("sum=%d (id=%d|%d)\n", sum, ctx.ID(), ctx.Slot())
    78  	return err
    79  }
    80  
    81  func newreducer(typ, name string, mgr fwk.App) (fwk.Component, error) {
    82  	var err error
    83  
    84  	tsk := &reducer{
    85  		TaskBase: fwk.NewTask(typ, name, mgr),
    86  		input:    "Input",
    87  		sum:      0,
    88  		exp:      0,
    89  		nevts:    0,
    90  	}
    91  
    92  	err = tsk.DeclProp("Input", &tsk.input)
    93  	if err != nil {
    94  		return nil, err
    95  	}
    96  
    97  	err = tsk.DeclProp("Sum", &tsk.exp)
    98  	if err != nil {
    99  		return nil, err
   100  	}
   101  
   102  	return tsk, err
   103  }
   104  
   105  func init() {
   106  	fwk.Register(reflect.TypeOf(reducer{}), newreducer)
   107  }