code: func (f *Flow) AddOneToOneStep(input *Dataset, output *Dataset) (step *Step) {
  	step = f.NewStep()
  	step.NetworkType = OneShardToOneShard
  	fromStepToDataset(step, output)
  	fromDatasetToStep(input, step)
  
  	if input == nil {
  		task := step.NewTask()
  		if output != nil && output.Shards != nil {
  			fromTaskToDatasetShard(task, output.GetShards()[0])
  		}
  		return
  	}
  
  	// setup the network
  	for i, shard := range input.GetShards() {
  		task := step.NewTask()
  		if output != nil && output.Shards != nil {
  			fromTaskToDatasetShard(task, output.GetShards()[i])
  		}
  		fromDatasetShardToTask(shard, task)
  	}
  	return
  }
docs: // the tasks should run on the source dataset shard