/// <summary> /// Open any datasets that were used by the input layer. /// </summary> private void OpenDataSet() { // clear out any data sets already there _readDataSet.Clear(); _dataSetFieldMap.Clear(); _dataSetIteratorMap.Clear(); // only add each iterator once IDictionary <IMLDataSet, MLDataFieldHolder> uniqueSets = new Dictionary <IMLDataSet, MLDataFieldHolder>(); // find the unique files foreach (IInputField field in _inputFields) { if (field is InputFieldMLDataSet) { var dataSetField = (InputFieldMLDataSet)field; IMLDataSet dataSet = dataSetField.NeuralDataSet; if (!uniqueSets.ContainsKey(dataSet)) { IEnumerator <IMLDataPair> iterator = dataSet .GetEnumerator(); var holder = new MLDataFieldHolder( iterator, dataSetField); uniqueSets[dataSet] = holder; _readDataSet.Add(iterator); } MLDataFieldHolder holder2 = uniqueSets[dataSet]; _dataSetFieldMap[dataSetField] = holder2; _dataSetIteratorMap[holder2.GetEnumerator()] = holder2; } } }
/// <summary> /// Called internally to obtain the current value for an input field. /// </summary> /// <param name="field">The input field to determine.</param> /// <param name="index">The current index.</param> /// <returns>The value for this input field.</returns> private void DetermineInputFieldValue(IInputField field, int index) { double result; if (field is InputFieldCSV) { var fieldCSV = (InputFieldCSV)field; ReadCSV csv = _csvMap[field]; result = csv.GetDouble(fieldCSV.Offset); } else if (field is InputFieldMLDataSet) { var mlField = (InputFieldMLDataSet)field; MLDataFieldHolder holder = _dataSetFieldMap [field]; IMLDataPair pair = holder.Pair; int offset = mlField.Offset; if (offset < pair.Input.Count) { result = pair.Input[offset]; } else { offset -= pair.Input.Count; result = pair.Ideal[offset]; } } else { result = field.GetValue(index); } field.CurrentValue = result; return; }
/// <summary> /// Called internally to advance to the next row. /// </summary> /// <returns>True if there are more rows to reed.</returns> private bool Next() { // see if any of the CSV readers want to stop if (_readCSV.Any(csv => !csv.Next())) { return(false); } // see if any of the data sets want to stop foreach (var iterator in _readDataSet) { if (!iterator.MoveNext()) // are we sure that we intended for every other item here? an explanation would be helpful { return(false); } MLDataFieldHolder holder = _dataSetIteratorMap [iterator]; IMLDataPair pair = iterator.Current; holder.Pair = pair; } // see if any of the arrays want to stop if (_inputFields.OfType <IHasFixedLength>().Any(fl => (_currentIndex + 1) >= fl.Length)) { return(false); } _currentIndex++; return(true); }
private void DetermineInputFieldValue(IInputField field, int index, bool headers) { if (field is InputFieldCSV) { var fieldCSV = (InputFieldCSV)field; ReadCSV csv = _csvMap[field]; field.CurrentValueRaw = csv.Get(fieldCSV.ColumnName); try { field.CurrentValue = CSVFormatUsed.Parse((string)field.CurrentValueRaw); } catch (FormatException) { field.CurrentValue = double.NaN; } } else if (field is InputFieldMLDataSet) { var mlField = (InputFieldMLDataSet)field; MLDataFieldHolder holder = _dataSetFieldMap [field]; IMLDataPair pair = holder.Pair; int offset = mlField.Offset; if (offset < pair.Input.Count) { field.CurrentValue = pair.Input[offset]; field.CurrentValueRaw = pair.Input[offset]; } else { offset -= pair.Input.Count; field.CurrentValue = pair.Ideal[offset]; field.CurrentValueRaw = pair.Ideal[offset]; } } else { field.CurrentValueRaw = field.GetValue(index); field.CurrentValue = (double)field.CurrentValueRaw; } }