#
# a python generator that returns labels (classes) and data
# it also demonstrates preprocessing data in the generator
# this example uses 4 files, fold1.txt, fold2.txt, fold3.txt, fold4.txt
# each call to load() will return the next fold
# after 4 calls it wraps and starts over returning the first fold

# TensorFlow, keras, numpy
import tensorflow as tf
from tensorflow import keras
import numpy as np

# define a generator function
def load():
 fold=1
 while True:
  filename='fold'+str(fold)+'.txt'
  fpt=open(filename,'r')
  d=[[int(x) for x in line.split()] for line in fpt]
  fpt.close()

  # copy to classes and data
  classes=[]
  data=[]

  for a in range(0,len(d)):
   classes.append(d[a][0])
   row=[]
   for b in range(1,len(d[a])):
    row.append(d[a][b])
   data.append(row)

  # normalize each row of data
  normdata=[]
  for a in range(0,len(data)):
   norm=[]
   s=min(data[a])
   t=max(data[a])
   for b in range(0,len(data[a])):
    norm.append((float(data[a][b])-float(s))/(float(t)-float(s)))
   normdata.append(norm)

  classes=np.array(classes)
  data=np.array(normdata)

  yield data,classes
  fold=fold+1
  if fold > 4:
   fold=1

# create the generator (object)
f=load()

# use the generator in a loop
for i in range(0,10):
  d,l=next(f)	# next() executes the generator function, returns data
  print(l[0],' is ',d[0])

