code: def execute(self, time_interval):
          
          # TODO: What if the leaf nodes have different time intervals?
  
          # if not self._hyperstream:
          #     raise ValueError("")
          with WorkflowMonitor(self):
              # First look for asset writers
              for factor in self.factors[::-1]:
                  if factor.tool.name == "asset_writer":
                      factor.execute(time_interval)
  
              for factor in self.factors[::-1]:
                  if factor.sink is None or factor.sink.is_leaf and factor.tool.name != "asset_writer":
                      factor.execute(time_interval)
docs: Here we execute the factors over the streams in the workflow
          Execute the factors in reverse order. We can't just execute the last factor because there may be multiple
          "leaf" factors that aren't triggered by upstream computations.
  
          :param time_interval: The time interval to execute this workflow over