Inside the Cloud you have lots of bandwidth, but going to the Cloud you may not have enough bandwidth. If you have to send bits to the Cloud for streaming applications, you have to do that. Then you have to know what the bandwidth availability is and be able to dynamically adjust what you do in terms of using that bandwidth efficiently. So I'm going to give you an example of that Jetstream as a system. What Jetstream system is trying to do is, it's saying, well, it's not so much focused on fog computing per se, but it is focused on the fact that streaming application, you are continuously streaming bits to the Cloud. You want to make sure that the application dynamics changes or the infrastructure capacity changes, you're able to take advantage of that or react to that. So what you may want to do is, for instance, if there is limited bandwidth, then one thing that you can do is aggregate stuff and send as opposed to sending the raw bits. So aggregation is one thing you can do and similarly, if there is insufficient bandwidth, you can degrade the quality. So for instance, if I have a high-fidelity image, instead of sending the high-fidelity image, can I send a low-fidelity image so that I reduce the bandwidth requirement. So what they've done in Jetstream is they've provided both aggregation and degradation as first-class primitives that are manipulable from an application point of view. So then application has control over that. Ultimately, what they want to do is the storage processing at the edge is done in a way that makes sure that there's, a terminology that is used in telecom all the time, goodput, not just throughput, but throughput actually that is resulting in quality of service. That is what is goodput and you want to increase goodput by both these aggregation and using these aggregation and degradation primitives. What that would let you do is you can dynamically tune the analytics commensurate with the available backhaul bandwidth because you are streaming and your streaming requirements if you can have a knob over that, then you can make sure that these analytics are done in a timely manner. Because there is, again, a dataflow graph between taking the bits, getting into the compute, doing the processing, and getting the results. That's the analytics. Now, if you don't have enough bandwidth, the pipe is constricted, then the analytics are not going to be delivered in time for you to react. Therefore, what you want to do is, depending on the available bandwidth, you want to use these aggregation and degradation primitives to do that and aggregate when you can at the edge. So for instance, if it is stock market indices, then what you can do is you can aggregate those and send rather than individual bits. But on the other hand, certain things may not be possible to aggregate. If you take a camera images, how do you aggregate multiple camera images? Every camera image you have to send it. You cannot aggregate it in that case, but you can degrade the data quality. So these are two different ways by which you can reduce the bandwidth requirement going into the backhaul. So those are things that you want to do depending on the nature of the data. That's why you want these primitives to be available as programming hints to the application so that it can judiciously use this to tune the backhaul bandwidth requirement and ensure that analytics are performed in a timely manner. The storage abstraction that Jetstream provides is, one, a storage abstraction is to make the stored data that is at the edge. So think of this as the edge and there's the Cloud. So the storage abstraction that you're going to provide at the edge here, you want it to be updateable, meaning it's almost like a programming primitives that says that "I can keep accumulating data at the edge." The second thing that you want to do is you want data to be shrunk. So you have big data, you shrink it into a smaller data, and you're going to have a predictable loss of fidelity that the application can infer by shrinking it this much what the loss of fidelity is going to be. So that's another thing that is available as a primitive and data is mergeable meaning that you can take disparate pieces of data and produce a merged data out of that. Data is degradable, meaning that you can take the data and run it through a dataflow operator and get approximate data, which you can then send through the network to the Cloud for further processing. Depending on the state of the network, you have feedback that tells the edge processing what the dataflow operator should do in terms of adaptation. So this is another primitives that's available in Jetstream. So these are the things that allows you to control what the backhaul bandwidth is so that I can have deterministic time for analytics. So the goal is that when I'm doing this streaming analytics, I want to have deterministic time for that. The variable in that is this backhaul bandwidth. When the backhaul bandwidth is not fixed, inside the Cloud it is fixed, but going from the edge to the Cloud it is not. So how can I adapt what is going on in terms of the data so that you can have deterministic analytics. That's the focus of this thing.