/// <summary> /// Computes the readout units. /// </summary> private CompositeResult[] ComputeReadoutUnits(double[] predictors, out double[] outputVector) { CompositeResult[] unitsResults = new CompositeResult[_readoutUnitCollection.Length]; outputVector = new double[_readoutUnitCollection.Length]; for (int unitIdx = 0; unitIdx < _readoutUnitCollection.Length; unitIdx++) { double[] readoutUnitInputVector = _predictorsMapper.CreateVector(ReadoutLayerCfg.ReadoutUnitsCfg.ReadoutUnitCfgCollection[unitIdx].Name, predictors); CompositeResult unitResult = _readoutUnitCollection[unitIdx].Compute(readoutUnitInputVector); outputVector[unitIdx] = unitResult.Result[0]; unitsResults[unitIdx] = unitResult; } return(unitsResults); }
/// <summary> /// Computes the "One Takes All" group. /// </summary> /// <param name="allReadoutUnitResults">The collection of all readout units composite results.</param> /// <param name="groupResult">The composite result of the group's probabilistic cluster chain.</param> /// <param name="outputVector">The output vector.</param> /// <returns>An index of the winning unit within the "One Takes All" group.</returns> public int Compute(CompositeResult[] allReadoutUnitResults, out CompositeResult groupResult, out double[] outputVector) { int winnerIdx; groupResult = new CompositeResult(); outputVector = new double[MemberReadoutUnitIndexCollection.Count]; if (DecisionMethod == OneTakesAllDecisionMethod.Basic) { for (int i = 0; i < MemberReadoutUnitIndexCollection.Count; i++) { //Store rescaled member units results outputVector[i] = Interval.IntZP1.Rescale(allReadoutUnitResults[MemberReadoutUnitIndexCollection[i]].Result[0], Interval.IntN1P1); } //Make the sum equal to 1 outputVector.ScaleToNewSum(1d); groupResult.Result = new double[outputVector.Length]; outputVector.CopyTo(groupResult.Result, 0); //Rescale output vector back to -1 and 1 for (int i = 0; i < MemberReadoutUnitIndexCollection.Count; i++) { outputVector[i] = Interval.IntN1P1.Rescale(outputVector[i], Interval.IntZP1); } winnerIdx = outputVector.MaxIdx(); } else { double[] inputVector = CreateInputVector(allReadoutUnitResults); outputVector = ProbabilisticClusterChain.Compute(inputVector, out List <Tuple <int, double[]> > memberNetOuputs); groupResult.Result = new double[outputVector.Length]; outputVector.CopyTo(groupResult.Result, 0); groupResult.SubResults = new List <double[]>(); foreach (Tuple <int, double[]> tuple in memberNetOuputs) { groupResult.SubResults.Add(tuple.Item2); } //Rescale output to -1 and 1 for (int i = 0; i < MemberReadoutUnitIndexCollection.Count; i++) { outputVector[i] = Interval.IntN1P1.Rescale(outputVector[i], Interval.IntZP1); } winnerIdx = outputVector.MaxIdx(); } return(winnerIdx); }