def __init__(self): super(SIREnv, self).__init__() self.Nm = str() self.SetTags("Nm", 'desc:"name of this environment"') self.Dsc = str() self.SetTags("Dsc", 'desc:"description of this environment"') self.NStim = int(4) self.SetTags("NStim", 'desc:"number of different stimuli that can be maintained"') self.RewVal = float(1) self.SetTags("RewVal", 'desc:"value for reward, based on whether model output = target"') self.NoRewVal = float(0) self.SetTags("NoRewVal", 'desc:"value for non-reward"') self.Act = Actions.Store self.SetTags("Act", 'desc:"current action"') self.Stim = int() self.SetTags("Stim", 'desc:"current stimulus"') self.Maint = int() self.SetTags("Maint", 'desc:"current stimulus being maintained"') self.Input = etensor.Float64() self.SetTags("Input", 'desc:"input pattern with action + stim"') self.Output = etensor.Float64() self.SetTags("Output", 'desc:"output pattern of what to respond"') self.Reward = etensor.Float64() self.SetTags("Reward", 'desc:"reward value"') self.Run = env.Ctr() self.SetTags("Run", 'view:"inline" desc:"current run of model as provided during Init"') self.Epoch = env.Ctr() self.SetTags("Epoch", 'view:"inline" desc:"number of times through Seq.Max number of sequences"') self.Trial = env.Ctr() self.SetTags("Trial", 'view:"inline" desc:"trial is the step counter within epoch"')
def LogTstQuiz(ss, dt): trl = ss.TstTrlLog epc = ss.TrainEnv.Epoch.Prv # ? nper = 4 # number of paras per quiz question: Q, A, B, C nt = trl.Rows nq = int(nt / nper) pctcor = 0.0 srow = dt.Rows dt.SetNumRows(srow + nq + 1) for qi in range(nq): ri = nper * qi qv = etensor.Float64(trl.CellTensor("Hidden", ri)) mxai = 0 mxcor = 0.0 row = srow + qi for ai in range(nper - 1): av = etensor.Float64(trl.CellTensor("Hidden", ri+ai+1)) cor = metric.Correlation64(qv.Values, av.Values) if cor > mxcor: mxai = ai mxcor = cor dt.SetCellTensorFloat1D("Correls", row, ai, cor) ans = go.Slice_string(["A", "B", "C"])[mxai] err = 1.0 if mxai == 0: # A pctcor += 1 err = 0 # note: this shows how to use agg methods to compute summary data from another # data table, instead of incrementing on the Sim dt.SetCellFloat("Run", row, float(ss.TrainEnv.Run.Cur)) dt.SetCellFloat("Epoch", row, float(epc)) dt.SetCellFloat("QNo", row, float(qi)) dt.SetCellString("Resp", row, ans) dt.SetCellFloat("Err", row, err) pctcor /= float(nq) row = dt.Rows - 1 dt.SetCellFloat("Run", row, float(ss.TrainEnv.Run.Cur)) dt.SetCellFloat("Epoch", row, float(epc)) dt.SetCellFloat("QNo", row, -1) dt.SetCellString("Resp", row, "Total") dt.SetCellFloat("Err", row, pctcor) ss.TstQuizPctCor = pctcor # note: essential to use Go version of update when called from another goroutine ss.TstQuizPlot.GoUpdate()
def __init__(self): super(CondEnv, self).__init__() self.Nm = str() self.SetTags("Nm", 'desc:"name of this environment"') self.Dsc = str() self.SetTags("Dsc", 'desc:"description of this environment"') self.TotTime = int() self.SetTags("TotTime", 'desc:"total time for trial"') self.CSA = OnOff() self.SetTags( "CSA", 'view:"inline" desc:"Conditioned stimulus A (e.g., Tone)"') self.CSB = OnOff() self.SetTags( "CSB", 'view:"inline" desc:"Conditioned stimulus B (e.g., Light)"') self.CSC = OnOff() self.SetTags("CSC", 'view:"inline" desc:"Conditioned stimulus C"') self.US = OnOff() self.SetTags("US", 'view:"inline" desc:"Unconditioned stimulus -- reward"') self.RewVal = float() self.SetTags("RewVal", 'desc:"value for reward"') self.NoRewVal = float() self.SetTags("NoRewVal", 'desc:"value for non-reward"') self.Input = etensor.Float64() self.SetTags("Input", 'desc:"one-hot input representation of current option"') self.Reward = etensor.Float64() self.SetTags("Reward", 'desc:"single reward value"') self.Run = env.Ctr() self.SetTags( "Run", 'view:"inline" desc:"current run of model as provided during Init"' ) self.Epoch = env.Ctr() self.SetTags( "Epoch", 'view:"inline" desc:"number of times through Seq.Max number of sequences"' ) self.Trial = env.Ctr() self.SetTags( "Trial", 'view:"inline" desc:"one trial is a pass through all TotTime Events"' ) self.Event = env.Ctr() self.SetTags( "Event", 'view:"inline" desc:"event is one time step within Trial -- e.g., CS turning on, etc"' )
def LogTstEpc(ss, dt): row = dt.Rows dt.SetNumRows(row + 1) trl = ss.TstTrlLog epc = ss.TrainEnv.Epoch.Prv wr1 = etensor.Float64(trl.CellTensor("Hidden", 0)) wr2 = etensor.Float64(trl.CellTensor("Hidden", 1)) ss.TstWords = ss.WordsLabel() ss.TstWordsCorrel = metric.Correlation64(wr1.Values, wr2.Values) dt.SetCellFloat("Run", row, float(ss.TrainEnv.Run.Cur)) dt.SetCellFloat("Epoch", row, float(epc)) dt.SetCellString("Words", row, ss.TstWords) dt.SetCellFloat("TstWordsCorrel", row, ss.TstWordsCorrel) ss.TstEpcPlot.GoUpdate()
def __init__(self): super(BanditEnv, self).__init__() self.Nm = str() self.SetTags("Nm", 'desc:"name of this environment"') self.Dsc = str() self.SetTags("Dsc", 'desc:"description of this environment"') self.N = int() self.SetTags("N", 'desc:"number of different inputs"') self.P = [] self.SetTags("P", 'desc:"no-inline" desc:"probabilities for each option"') self.RewVal = float(1) self.SetTags("RewVal", 'desc:"value for reward"') self.NoRewVal = float(-1) self.SetTags("NoRewVal", 'desc:"value for non-reward"') self.Option = env.CurPrvInt() self.SetTags("Option", 'desc:"bandit option current / prev"') self.RndOpt = True self.SetTags( "RndOpt", 'desc:"if true, select option at random each Step -- otherwise must be set externally (e.g., by model)"' ) self.Input = etensor.Float64() self.SetTags("Input", 'desc:"one-hot input representation of current option"') self.Reward = etensor.Float64() self.SetTags("Reward", 'desc:"single reward value"') self.Run = env.Ctr() self.SetTags( "Run", 'view:"inline" desc:"current run of model as provided during Init"' ) self.Epoch = env.Ctr() self.SetTags( "Epoch", 'view:"inline" desc:"number of times through Seq.Max number of sequences"' ) self.Trial = env.Ctr() self.SetTags( "Trial", 'view:"inline" desc:"trial is the step counter within epoch"')
def UniquePatStat(ss, dt): """ UniquePatStat analyzes the hidden activity patterns for the single-line test inputs to determine how many such lines have a distinct hidden pattern, as computed from the similarity matrix across patterns """ hc = etensor.Float64(dt.ColByName("Hidden")) norm.Binarize64(hc.Values, .5, 1, 0) ix = etable.NewIdxView(dt) ss.SimMat.TableColStd(ix, "Hidden", "TrialName", False, metric.SumSquares) dm = ss.SimMat.Mat nrow = dm.Dim(0) uniq = 0 for row in range(nrow): tsr = etensor.Float64(dm.SubSpace(go.Slice_int([row]))) nzero = 0 for vl in tsr.Values: if vl == 0: nzero += 1 if nzero == 1: uniq += 1 return float(uniq)
def etensor_to_numpy(et): """ returns a numpy ndarray constructed from the given etensor.Tensor. data is copied into the numpy ndarray -- it is not a view. """ nar = 0 if et.DataType() == etensor.UINT8: nar = np.array(etensor.Uint8(et).Values, dtype=np.uint8) elif et.DataType() == etensor.INT8: nar = np.array(etensor.Int8(et).Values, dtype=np.int8) elif et.DataType() == etensor.UINT16: nar = np.array(etensor.Uint16(et).Values, dtype=np.uint16) elif et.DataType() == etensor.INT16: nar = np.array(etensor.Int16(et).Values, dtype=np.int16) elif et.DataType() == etensor.UINT32: nar = np.array(etensor.Uint32(et).Values, dtype=np.uint32) elif et.DataType() == etensor.INT32: nar = np.array(etensor.Int32(et).Values, dtype=np.int32) elif et.DataType() == etensor.UINT64: nar = np.array(etensor.Uint64(et).Values, dtype=np.uint64) elif et.DataType() == etensor.INT64: nar = np.array(etensor.Int64(et).Values, dtype=np.int64) elif et.DataType() == etensor.FLOAT32: nar = np.array(etensor.Float32(et).Values, dtype=np.float32) elif et.DataType() == etensor.FLOAT64: nar = np.array(etensor.Float64(et).Values, dtype=np.float64) elif et.DataType() == etensor.STRING: nar = np.array(etensor.String(et).Values) elif et.DataType() == etensor.INT: nar = np.array(etensor.Int(et).Values, dtype=np.intc) elif et.DataType() == etensor.BOOL: etb = etensor.Bits(et) sz = etb.Len() nar = np.zeros(sz, dtype=np.bool_) for i in range(sz): nar[i] = etb.Value1D(i) else: raise TypeError("tensor with type %s cannot be converted" % (et.DataType().String())) return 0 # there does not appear to be a way to set the shape at the same time as initializing return nar.reshape(et.Shapes())
def copy_numpy_to_etensor(et, nar): """ copies data from numpy ndarray (nar, source) to existing etensor.Tensor (et, dest) """ narf = np.reshape(nar, -1) etv = et if et.DataType() == etensor.UINT8: etv = etensor.Uint8(et).Values elif et.DataType() == etensor.INT8: etv = etensor.Int8(et).Values elif et.DataType() == etensor.UINT16: etv = etensor.Uint16(et).Values elif et.DataType() == etensor.INT16: etv = etensor.Int16(et).Values elif et.DataType() == etensor.UINT32: etv = etensor.Uint32(et).Values elif et.DataType() == etensor.INT32: etv = etensor.Int32(et).Values elif et.DataType() == etensor.UINT64: etv = etensor.Uint64(et).Values elif et.DataType() == etensor.INT64: etv = etensor.Int64(et).Values elif et.DataType() == etensor.FLOAT32: etv = etensor.Float32(et).Values elif et.DataType() == etensor.FLOAT64: etv = etensor.Float64(et).Values elif et.DataType() == etensor.STRING: etv = etensor.String(et).Values elif et.DataType() == etensor.INT: etv = etensor.Int(et).Values elif et.DataType() == etensor.BOOL: etb = etensor.Bits(et) sz = min(etb.Len(), len(narf)) for i in range(sz): narf[i] = etb.Value1D(i) return else: raise TypeError("tensor with type %s cannot be copied" % (et.DataType().String())) return 0 etv.copy(narf) # go slice copy, not python copy = clone