Thank you. I am so delighted at this invitation to show you my recent work. This is a joint project with Xinyu Hua, a former graduate student of mine from Northwestern. And he's now currently in Hong Kong. So although platforms create significant benefits for really all of us, we also are exposed to potential harms when we're participants on the platform. These harms include misinformation, unwanted advertising, cyber bullying, and the purchase of dangerous or defective products. In the United States, as you most are well aware, Section 230 of the Communications Decency Act largely immunizes platforms from liability for the content that's created by participants. And then in the marketplace setting, many courts have held that marketplace platforms are not liable for the harms and injuries of the products that are sold through their platforms, arguing that they're not traditional sellers. But these types of issues are at play in the legislatures and in the courts here in the United States. And I know that they're also in play in the EU and in other countries as well.  This is a picture of a hoverboard and I've personally never written on one, but I understand that they can be a lot of fun for the whole family. But they also can cause harms and there have been literally hundreds of fires that have been caused from defective chargers of these hoverboards.  And a couple of these lawsuits have actually been won. This is a quote at the bottom of the slide from a judge in California. And this was an interesting case. Amazon did not produce the hoverboard. The hoverboard was produced by a Chinese manufacturer and indeed the hoverboard was shipped directly from the manufacturer to the customer in the United States. It did not go through Amazon's fulfillment center. And nevertheless, the court held that Amazon was strictly liable for the injuries. And the judge opined that Amazon is well situated to take cost effective measures to minimize the social costs of accidents. So evidently the judge was an economically inclined judge. So this is one of several cases that have gotten some traction in this direction. The paper that I'm going to present to you asks the very broad question about whether platforms should be held liable when participants suffer harms that are caused by other participants on the platform. So this is the literature. This is a paper that fits within the law and economics literature of liability. So this is just a very kind of brief overview of the law and economics literature. You know within law and economics are focused on liability. It's a liability is a mechanism for forcing actors to internalize negative externalities that they have on others. If victims are bystanders. So if we imagine, say a chemical manufacturer that leaks toxic substances and harms neighbors or imposes, you know harms in the environment. Then we would imagine that holding that chemical manufacturer liable and in particular strict liability with compensatory damages for the victims can lead to efficient penalties and effort levels on the part of that company. So this is a standard result in the economics law and economics literature that strict liability with compensatory damages can get incentives right. If the victims are themselves consumers, the models become a bit more subtle, because when the victims are consumers, then they're in a contractual relationship with the manufacturer or the seller. So the argument for holding companies liable for injuries to customers. That's a trickier argument to make and the and the argument for liabilities weaker. So the idea here is that since customers are voluntarily entering into these transactions, consumers can kind of look out for themselves. Customers will demand appropriate safety features on the products that they purchase, and manufacturers have a financial incentive to deliver safer product features because customers are willing to pay more for those features. In order to set up models where products liability is desirable one needs to have market frictions. Economists have tended to look at a couple of different types of frictions one asymmetric information can sometimes necessitate products liability or divergent prior beliefs so going back to Spence in 1977 it's been observed that if the victims, consumer victims don't understand the harms that can be caused to them. Then it makes sense to shift responsibility away from the consumer and towards the firm who is in the best position to evaluate those harms and mitigate them through taking greater precautions in the design of the product. Second bullet point the judgment proof problem. So, going back many years, it's been observed that liability rules may not work as effectively if the injures do not have sufficient resources to pay for the harms that they cause to others, or more generally if injures are immune from liability. You know if they could have scond and not be held accountable, then there's more of a problem with with effort levels and with activity levels. Just to take a step back, I think the judgment proof problem is particularly relevant in the online world. When we're thinking about Amazon. Dealing with millions of vendors, many of those vendors are not going to have sufficiently deep pockets to pay for the harms that they're causing. Or if we're thinking about cyber bullying or misinformation being spread. The perpetrators of those activities may be hard to identify. And so they may be immune from being held liable. Second bullet point there's a branch of the literature that looks at rationales for extending liability to third parties. So the question is, you know, why not hold the injure responsible why should you hold the platform responsible. Well within the literature, people have looked at this kind of general question. It may be clear work with Bruce Hey, I've argued that it may be, it may be helpful to hold say gun manufacturers responsible for the deaths and injuries coming from gun usage. Others like Rowan Schwerd have argued that it may make sense to extend liability to the lenders of companies to the banks, and piercing the corporate veil. And if we have companies that are engaging in socially harmful activities. Other topics would include vicarious liability for employers, when their employees are engaging in misdeeds. So our paper really does fit into this general literature, the law and economics literature of liability and we're asking the question should a platform, like Google or Facebook or Amazon be how liable, when participants on the platform are causing violence to others. Okay, I'm going to skip over the platforms literature I know that so many of you here in the audience have have written seminal works in this area and in particular I'm so grateful to my discussant yes scene and as co author for their very broad writing in this area in the policy area. What I'm going to do in this in this talk is present a formal model that allows us to underscore some of the reasons for holding platforms liable. It's not going to be exhaustive. I think that this is a framework that is is tractable and simple enough that it can be extended in many directions and I hope that others will be picking up on this topic as well doing more formal work on the economics of platform liability. So I have two slides here I'm going to show you two slides with an overview of the model. And after I do that I'll jump in and show you the mechanics of the model. So here's here's just a synopsis. Our paper has one baseline model, and then two main extensions model. So the baseline model has a lot of characteristics that will be common to the extensions as well. So we're looking at a platform a two sided platform that's providing a quasi public good to users, and will facilitate interactions between two sides one side being the firms and the other side being the users. So it's going to be private information, the firms are of two types, harmful and safe, where the harmful types are going to enjoy higher interaction benefits with the users, but they also have the potential to impose larger harms on the users than the safe firms. The way that the platform monetizes these activities is by charging an interaction price to the firms, not to the consumers, the users get to use the platform for free. In our baseline model, we're going to treat the users as by standards. And so, if they choose to participate on the platform which they will in our model, then they will not be able to decline interactions with the with the clients, interactions do not require consent. The platform in our model is able to prevent harmful interactions that is prevent the participation of the harmful firms in two ways. First, they may be able to price them out of the market by raising the interaction price, then potentially they could get the harmful firms to leave. Secondly, our platform may be able to engage in activities to detect and remove the harmful firms so they can engage in audits or curation or screening activities to get rid of the harmful firms. The third bullet point, and this is I think a really important point. If the harmful firms can be held accountable for the harms that they're causing to the users, if there's no judgment proof problem, then we don't need platform liability. We can simply hold the responsible parties that is the harmful firms accountable for the harms that they're causing to the users. And that will get incentives aligned. The reason why platform liability is going to be important in our models is because the plat because the, the firms are judgment proof, they're not going to be able to fully compensate the users for the harms. The firms may be immune from liability. And so in this case, extending liability to the platform can make sense. And so on the bottom of the slide, if the margin if the harmful firms are marginal. So if they're on the cusp of engaging in the platform and not, then platform liability will have the benefit of getting the platform to raise the price interaction price, and that will deter the harmful firms from joining. If the harmful firms are in from marginal, then raising the price will not get rid of them without also getting rid of the good firms. In this case, platform liability makes sense as well, because it encourages the platform to put in the costly auditing effort required to detect and remove those harmful firms. Interestingly, we show that the optimal degree of platform liability is less than full. So in other words, you want to hold the firm responsible for as much as you can, and then impose residual liability on the platform, but not full residual liability. You want it to be less than full. If the platform was held fully responsible for the residual damage that would lead to overzealous auditing, you can get an over auditing problem. The platform is held fully responsible for the residual. So this is an argument for, for having some platform liability, but not making it fully compensatory. Okay, so that's the baseline model where the victims are bystanders. We then extend it to think about retail platforms where the consent of the users is necessary in order for these interactions to take place. So this would be an example, our model fit situations where we have two types of firms, you know, harmful products and safe products where the harmful products have lower costs of production than the safe products. And so the harmful firms get bigger profit margins than the safe firms. What we're doing in this type of a setting is that the platform will have stronger incentives to deter and remove harmful firms is because of the consumer's willingness to pay. If consumers know that the products are safer they're going to be willing to pay more for those products, and the platform can then benefit from that by charging a higher interaction price to the firms. So if the harmful firms are marginal we're going to show that platform liability is completely unnecessary, the market takes care of the, of the situation. But if the harmful firms are in for marginal, we do need the platform to audit, and platform liability will encourage that. The optimal degree of liability will be lower than in the baseline model. And then finally we extend the model to platform competition, very simple model platform competition where we have a duopoly, and the two firms are symmetric the platforms are symmetric. Interestingly we show that the competitive platforms may have either stronger or weaker incentives to deter and remove harmful firms. If the harmful firms are on the margin, then we show that the optimal platform liability is is higher than in the baseline model. Essentially when the harmful firms are on the margin we need more liability to get the competitive firms to raise those competitive prices to a higher level to screen out the harmful firms. If the harmful firms on the other hand are in for marginal, then the optimal platform liability will be lower than in the baseline model, we don't need as much platform liability. This is because the price is lower under competition, meaning that the firms naturally have an incentive to invest more resources to kick form firms off, because their profit margins are lower from retaining those firms. And so it's interesting with platform competition so very simple example we do but we show that the degree of platform liability really should be linked to how competitive. This market is in terms of competing platforms. So changes in policy that introduce more competition among platforms should be complemented by changes in the in the legal liability rules for platforms as well. That's the basic overview of what I'm going to do. And now I'm going to kind of dive in and highlight the model and going to outline the basic structure of the model and then then show you some results in a simple form and provide intuition for what's going on within this model. Okay. I'm going to start with the baseline model. And again this is a model of by standards so the users who are harmed are not going to consent to each of the interactions. I can imagine that this is a world of potentially fake news where people on social media platforms may be harmed by by fake news being provided by malicious actors or by fraudulent or harmful or nuisance advertisements that are popping up. This model could also be a marketplace platform where the users are themselves consumers. If the consumers are myopic and misperceive the risks and don't understand that there are harmful actors on the platform. So there are various interpretations of the setup that I'm going to show you. Okay, we have three sets of players we have a monopoly platform, we have a unit mass of firms in that they're called s and users, I'm going to call them be will have a unit mass of users as well. Our platform is going to provide two goods, a quasi public good that gives users a benefit of being on the platform V, and also opportunities for firm user interactions. Each of the active firms will interact with all of the users on this platform. We're going to join the platform for free while the firms are going to pay a price P per interaction. So the platform is only going to get paid if there is an interaction between a firm and a user. We can talk more about what other types of pricing structures would do what do in the model and in particular when we move on to retail platforms will have flows of prices going from the users to the firms. In our baseline the users are bystanders and so their consent is not required for interactions in this model. By the way you don't even though I'm thinking about these users as being members of the platform, we could think about them more broadly as being parties outside the platform as well. I mean certainly the spread of fake news doesn't just, you know harm platform participants, you know, it's there's going to be contagion where those who are not participants on the platform can be harmed as well. So, we can think about the users here actually very broadly. The firms are of two types, high and low. Hi, so the harmful firms. Yes, Catherine and just actually on that point, just a clarification. The, the user market size is a fixed. The user market size is fixed. Yes. We're not, we're not going to be operating on the margin of, of how many users are joining the firm. You know we could put in heterogeneous users where we find a threshold where certain users join the platform and others do not. And then we could think about the effect of liability on that margin of who joins and who does not. The reason I asked this is exactly what you just said right I mean, so if it's fixed I think it makes sense like that basically the harm to users of the platform versus the harm to outsiders, it's, I mean you can think about them as not making a big difference but obviously if, if there was a marginal user I mean that then it becomes a little bit more interesting that actually matters if the harm is on the platform or off the platform. I absolutely agree. And this is a dimension that you know when we started modeling this we we actually were working along that dimension. But there was so much nuance and richness, even without considering that dimension that we decided to just go for the simplest possible model as the first step, but yes, that is correct. Okay, so we have heterogeneous firms firms are going to privately observe their types harmful. Those are the H types and say for the L types, and Lambda is the fraction of the harmful types in this firm population. We're going to assume that the harmful types cause accidents more frequently. And that's the theta theta is the probability of harm. And the marginal user, and D is the level of damages or the harm level conditional on an accident. Okay so harmful types cause more harms. We're also going to assume that the harmful types enjoy higher interaction benefits than the safer firms alpha H is bigger than alpha L. And that would be crucial for our results we could allow alpha H to be smaller than alpha L that would limit the, the interest of the model that would put us into a special case, where the harmful firms are always on the margin, and we would never get any auditing equilibrium there. And so to kind of span out all of the interesting cases. We assume here that alpha H is bigger than alpha L in the, in the, in the retail platform context if we wanted to think about the firms as being sellers. You know this would make sense in that harmful firms probably are chiseling their costs of production, their costs are lower. And so their profit margins would be larger. And so I think this is, you know, sensible in other settings, besides the bystander setting. We have three main assumptions. The first and the third assumption are simply assumptions to make sure that our platform will be active under all liability rules. The first assumption a not. That's an assumption that will guarantee that our, our, our users will want to join the platform, even if there's no liability. So V being the users benefit from joining the platform, and then the longer expression that's the expected harm if all of these firms are participating, and all of the damages are being borne by the user directly. The last assumption a to that's simply saying that the platform even if the platform was held fully liable. The platform would agree to be an operation as well. The middle assumption is a really important one. This is an assumption that says that safe firms are socially valuable. The net benefit of a safe firms alpha L the interaction benefit minus the expected harm theta LD. That's positive, but harmful firms, those are really socially harmful. The net interaction benefit is negative for them. And so ideally we would like to prevent those interactions from taking place. Okay, society would like to keep those harmful actors from being on the platform at all. Let's talk about the liability rule. We're going to be imagining a liability rule that's strict liability. It's not going to ask about negligence. And in fact we're going to imagine that the effort level of the platform is, is private information it's not discoverable. So if the user suffers harm, then the responsible firm and the platform will have to pay damages to the user. The platform is going to pay WS. And the platform is going to pay WP. And we're going to assume that W is the sum of those two, the platform and the firm's liability together. And they, they may be under compensatory it could be equal to zero or they could go as high as deep making it fully compensatory. That's the liability rule. We're interested in situations where the firms are judgment proof and indeed in our model if the firms could pay in full for the damages D. If WS was equal to D we wouldn't have any problem, and we wouldn't need to have platform liability at all. Okay, so we're going to be in situations where WS is limited you cannot force the firms to pay in full for the harms that they cause. When there's an interaction, there's going to be an interaction surplus, and I've written it there alpha I minus theta ID it could be positive or negative. As we just discussed it's going to be negative for the harmful firms. The way that that surplus will be allocated among the three players will depend upon the liability rule. So the platform is going to get the price P for interaction and then they're going to have to pay in probabilistic terms the damages WP. The firm, the firm of type I is going to get their interaction benefit, but they're going to have to pay the victims WS if the accident occurs and they're going to have to pay P to the platform. And the user is going to be suffering potential losses from these interactions. And insofar as the liability rule is under compensatory, you know these users may be suffering a lot of losses here. Okay, finally and really importantly we're going to give the platform the ability to audit and block harmful firms from participating. We're letting E be the probability that you can detect an H type, and then you will subsequently kick them off the platform. There's a cost though of raising the probability of catching each type and that's CV. The CV is going to fulfill, you know the standard assumptions, it's going to be an increasing and convex function. And the first unit of effort is going to be equal to zero. And so it's easy to put in a little effort to detect, but you're never going to get all the way to perfect detection. Okay, the timing. Okay, the timing of the model. The platform is going to set the interaction price then the firms decide whether to join the platform or not platform will choose whether to audit, then there'll be interactions, and then the harm users sue and the damages are paid. In terms of social welfare benchmarks first ideally we would like to have the high types the harmful types not participating at all. That would be the first best no participation. It's impossible to prevent them from participating and so if those harmful types try to join the platform auditing is necessary. So what we see here at the very bottom of the slide this is the socially optimal audit effort. If a social planner could choose how much to audit, they would trade off the social benefit of an audit and the social cost. The social benefit of auditing is that you can detect a harmful type and prevent that harmful interaction from occurring. So alpha h minus data hg that's a negative number. That's the social loss when you have an interaction between a harmful firm and a user. And so the social planner will trade off social loss and the social cost of auditing. Okay, now let's think about what what the market is going to do in this case. Catherine Catherine just a quick question from luish is the rule of under compensatory damages based on empirical evidence. And is it an important assumption. Um, so, uh, you know empirically actually platforms are hardly ever how liable. So, I think compensatory damages is a very standard way of assessing damages in other areas like an antitrust and then some types of products liability one does have damage multipliers like treble damages. Oftentimes that's to compensate for the probability of non detection. So, so, actually the reason why worse, we don't really need to make this assumption here in the model that they're under compensatory. In fact, our ideal liability rule is going to have under compensatory damages we would never want to have them go above D. So we could relax, we could relax this assumption. Okay. So, um, okay, so how is this model going to play out and I'm going to try I know I only have about eight minutes left so I'm going to kind of give you the highlights here. This is a really important part of the story here, you know, will these firms want to join the platform. Well a firm will seek to join the platform when they get a positive surplus from from joining. So I surplus at the top of the slide, the surplus from joining the platform assuming that they're not kicked off of the platform. Something you can notice here if the firm is not held liable so if w s is equal to zero. Then the harmful firm is going to have higher surplus than the safe firm, the safe firm is going to be the marginal firm. Okay. On the other hand, imagine that w s, the firm liabilities equal to D. Suppose that the firm is not judgment proof and they're whole fully liable for the harms to users. Okay, well in that case actually the high type firm harmful firm will be the marginal firm and indeed they wouldn't participate for any price. And so in fact holding the firm fully responsible is going to get these harmful types not even participate in the market, because it'll just be too expensive in terms of their liability costs. So this just a little discussion that I had suggests that our h type may either have higher or lower rents than the L type. The rents of the two types the high and the low types will be equal, when the firm's level of liability is equal to this w hat that threshold is really important because it determines who the marginal firm is. So when the firm liability is smaller than w hat the low type firms are marginal and this the harmful firms are in for marginal. In that case auditing will be necessary to remove the harmful types. On the other hand when firm liability is above the threshold and the h type firms are marginal. And in that case, the platform could deter those harmful types by just raising the price p and pricing them out of the market. Okay, we're going to divide this into two parts, and this is the most important, I think idea in the paper, our first case where the firms are very judgment proof so in case one w s is small. Okay, so now the L type firms the safe firms are marginal. The platform is going to set a price equal to the willingness to pay of the of the L type firm. Now the question is, would the platform engage in auditing to remove the harmful firms. Well, it's going to depend I've written out the platforms profit function there. Will the platform audit at all. Well, maybe they will and maybe they won't they're going to think about the profit margin from the high type firm, when they let a high type firm participate they get the price p star. And they also have to pay some liability this is the platform liability. We already see there's a problem with the platform liability WP is equal to zero, our platform won't audit they're not going to want to get rid of those harmful firms. They're going to be like partners in crime with these harmful firms they're going to embrace them they're going to say come and join on our network. We want to have you on the platform, because they can monetize it. On the other hand, when this p star mine state HWP when that profit margin is negative. So if the platform is held liable. Well then platform will engage in auditing because they're losing money on those harmful firms. We see very clearly in this model how the private and social incentives for auditing diverge from each other. We can rewrite the profit function and look at the first order condition for the platform's auditing decision. So the platform's choice of effort E star. It is partially aligned with social welfare that s prime, but there are two differences first the platform does not take into account the positive effect that their auditing has on the users, the users have an uncompensated loss D minus W. That's going to suggest that our platform will under invest in auditing. The last term here, these are the information rents that are captured by the harmful firms harmful firms being inframarginal. So those inframarginal harmful firms are getting rents information rents. And as a consequence, the platform then has an incentive to engage in too much auditing, because they're not taking into account the harms that are being caused to the firms that they're kicking off of the platform. And so in general the firms, the platforms incentives could be either too high or too low relative to what is socially optimal. Another thing that we can see right away from from this from this expression here this first order condition is that if the damages were fully compensatory. So W was equal to date. So imagine the platform is fully liable for the residual damage so the consumers are fully compensated this thing is equal to zero private and social incentives would still diverge. They would diverge because of these harmful firms getting information rents. So what this implies is that the platform would be overzealous and it's auditing incentives they're going to kick off too many firms. And this is the reason why in our model we get platform liability being desirable, but you don't want to make it too large, you want to have partial platform liability for the residual harms. We also consider the case where the, where the, where the firms. WS is bigger than the threshold. And so the harmful firms are marginal. In this case, platform liability can be very important also platform liability will give the platform the incentive to raise the interaction price p star to get rid of those harmful firms. So you know combined, this is what we have we have the social desirable level of platform liability. When you have very judgment proof firms, you want to have partial platform liability. And interestingly the platform liability and the firm liability these are substitutes for each other in terms of the social objectives. Okay, and I know I only have a couple of minutes left let me just tell you the retail platform model is a. There's other issues because now we're dealing with consumers who are Bayesian updaters and they need to be convinced to engage in these interactions. And so it's more subtle we need to think about prices going and flowing from the consumers to the to the firms, but the, the ideas extend from our baseline model what we can show is and look at the middle of the slide. The auditing effort of the platform diverges from the social incentive. It's in a modified form, however, there's now less of an externality on the users, the users are now consumers and they're being compensated for harms at least in part. And so the externality that we see in this expression for the consumers is the harm that's occurring beyond their equilibrium expectations data star. The upshot is going to be that the optimal platform liability is going to be positive but smaller than before, because the platform and the firms are jointly internalizing a lot of the harm to the consumers. There will be a new twist that the levels of liability for the firm and the platform or no longer substitutes for each other. They end up being compliments for each other. We also then extend the model to think about platform competition, where we have two symmetric competitors who are competing for the firms. We assume that the users are multi homing. The platform competition the prices are going to be driven down interaction prices. And as a consequence, we're going to find that when the firms are very judgment proof, the optimal platform liabilities actually going to be smaller than before. Because the profit margins for the platforms are smaller they're going to be even more zealous and they're auditing activities to get rid of harmful firms. And so you don't need as much product liabilities before. On the other hand, in the other case when WS is large, then, in fact, the optimal platform liability is higher than before, you want more liability, because you wanted them to raise their prices to kick those harmful firms off of the platform. And so this is my last slide, my concluding thoughts what we've explored is the big question should platforms be held liable for the injuries and harms arising on their platforms. We're showing in a model that platform liability can serve a really important role. When the perpetrators of the harms are judgment proof. We want to extend liability to platforms and so far as it gives platforms the incentive to raise the price to screen out harmful firms, or to engage in auditing to detect and remove harmful firms. But the level of platform liability depends on whether the victims are best looked at as its bystanders or consumers we've looked at the role of, of competition. You know, although our model, it could be applied to bricks and mortar and traditional media. We believe that these problems are even more severe online for platforms. You know for platforms, many of these perpetrators are fly by night, they are judgment proof it's hard to identify who those actors are and to bring them to justice. And so the importance of holding platforms liable I think it's even stronger than what would have what one would have in bricks and mortar types of settings. I think the model is simple and streamlined and it can be extended many, many different directions.  So I'm going to end there and stop my sharing. Thank you Catherine. Yes, in everyone and thanks to the organizers for the opportunities to discuss this great paper. Thank you for a very nice presentation. I enjoyed reading the paper very much the model is very simple, but to generate surprisingly powerful insights regarding the social data ability and the optimal design platform liability. So you probably know this is a very timely topic that is of substantial interest to policy makers and the paper is very useful in that it provides key factors that policy makers should keep in mind while thinking about about platform liability. What I very much like about the paper is that the framework that is built by the authors seems sufficiently flexible and tractable to be used to explore richer sets of issues that the ones that have been examined in this paper and I'm going to discuss some of those issues. So what I want to start with is relates to the to the to the assumption the model that the type of the firm that is whether it is safe or harmful is an exogenous and is not affected by that from liability. One could argue that platform liability may actually affect not only platforms incentives but also further incentives to take actions that would reduce the expected harm to users. I'm wondering how the endogenization of the firm side with the fact the main results of the paper and whether it would make sense to have an extension or at least a short discussion of this issue. My next comment is about the interaction between firm liability that is primary and platform. So one of the results regarding this interaction extremely interesting in particular, I like to find in that platform liability can be either substitutes or compliment for my ability depending on whether users are my standards or customers. The approach in the paper is to take the level of firm liability aspects, and to study how optimal platform liability is affected by the level of firm liability. So this approach makes perfect sense from a policy perspective as current policy discussions about platform liability tend to take primary liability as completely exogenous. I'm wondering whether it would be interesting at least from a theoretical perspective to indigenize firm liability, and this might provide additional useful insights about the optimal allocation of liability between the platform and the firms that operates on the platform an issue that cannot be studied if you fix firm liability. My next comment is about the observability or rather not observability of the auditing. So you assume throughout the paper that the platform's auditing effort is not observable. And I was wondering what would happen if to your results if the auditing efforts was instead observable which would be the case, for instance, if platforms are subject to transparency requirements regarding auditing efforts that would be imposed by by regulator. So this is for instance, going to be the case when the digital services act towards into force in your own. So obviously some of your results would be affected. So if you take for instance, the somewhat surprising results and very interesting result that optimal platform liability increases with the extent of primary liability when users are customers of the platform. Then this relies on the assumption that the auditing efforts is not observable. And it's likely not to own if the auditing efforts is instead, so that's my understanding, but that's more of a, that's more of a question there. Again, related to this non observability of the auditing efforts in the paper you focus on strict liability which makes sense in the office of efforts is not observable. But if this assumption does not work, then the question of whether an execution space liability regime would be better than a strict liability regime arises. That's, that's the question that is relevant from a policy perspective because in some countries, such as the US policy discussions about platform liability seem to focus mostly on strict liability while in other countries such as the UK. They seem to focus more negligence based liability so any insights about about that would be extremely useful. So the welfare effects of higher prices in the paper. So in your model increases in platform prices that are induced by platform liability are socially desirable. This is somewhat at odds with the traditional concern that liability may adversely affect social welfare because it may lead to higher prices. So there is a food note in the paper that mentions that there is no social losses from monopoly pricing in the model, but I think that to this passion that explains the contrast between the standard concern about adverse effects of liability to increasing prices, and your clear catch result that goes in the opposite direction would be would be right. And also to touch upon the objective function of the social planner. One of the key findings of the paper namely the result that assigning full residual liability to the platform, maybe socially suboptimal relies on the fact that the social planner takes account of harmful firms profits. Including the profits of harmful firms in the objective function of the social planner is quite standard in the literature, but real world policy makers meeting that the adverse effects of platform liability on these profits should not be accounted for. And given this, I would suggest to have a short discussion that's clarifies how the key findings of the paper will be affected if harmful firms profits were not included in the social planner's objective function. And of course this has also to do with with the assumption that we assume that the type is exogenous. If the type becomes endogenous then it's it's less of a problem conceptual need to, to include harmful profits because example first and finally I wanted to conclude with the with comparison between liability for social media platforms and media platforms. The nice insights of the paper is that the private and social incentives for audits are in greater alignment for retail platforms and for social media platforms, and therefore the optimal level of platform liability smaller for the former. So this seems to suggest that the case for platform liability is stronger for social media platforms than for retail platforms and you're probably aware of this discussion policy discussions whether whether business model should be taken into account when discussing some of that from my ability. So if you think that this is a robust insight that I would suggest to make it to make it more prominent. And I will leave it there. Thank you again for for a very nice presentation and raise papers.


Welcome how many of us are already doing functional programming have played with functional programming Awesome any objects oriented practitioners who are looking to switch to functional programming cool. If you're awesome excellent So today we'll talk about loom and functional graphs, but specifically how we implement them in closure however, even though I spoke a focus on closure implementation of functional graphs a lot of these ideas are easily translatable to other functional languages So a little about me. I work at Google on a distributed build system. So in my day job, I write C++ Why am I here at a functional programming conference? Well, I write closure on weekends and weeknights And I'm the maintainer of library code loom, which is graph algorithms and visualization library So I got into closure about maybe two years ago first starting out with just you know some little hobby projects exercises and then I wanted to work on graph algorithms because my background is some of my background is in compiler research and In compilers you represent programs as graphs. So I wanted to do more of graph manipulations So I started looking around for existing graph Algorithms libraries because you know, it's always better to pick up something that is already written well and I came across loom, which was initially written by Justin Kramer and Then Justin moved on to other projects and I really liked the way was designed and I liked a lot of things that it already had in it So I decided to pick it up add more algorithms to it and make it as usable as possible for other People and if you're wondering, yes, I did make that logo. I'm very proud of it Okay, so this talk will be in four parts first. We'll talk about graph Theory in general how many of us have taken graph theory class or have dealt with graphs in general Okay, a few of us So those will be a good point for us to get on the same page And then we'll talk about graph API design, which in my opinion is one of the most fascinating things to think about How do you represent graphs such that they're flexible but also are efficient? Then we'll talk about graph algorithms and how we would implement them functionally Specifically would look at the object-oriented implementation and then side-by-side compared to the functional implementation And at last we will do an overview of loom and what loom does for you And if you're interested in how you can jump into using graph algorithms library So let's take a moment of graph theory first. So graphs are collections of nodes and edges And the nodes are connected by edges. So on this graph we see which are connected by some edges and Graphs are all over in real life. So we have you know subway maps or Transportation maps where it tells us how to get from point A to point B. We can calculate distances. We can calculate the cost There are social network graphs so you can figure out how information gets propagated from one person to another What types of clicks get formed how people get to know each other and so on and Since I work on build systems for me dependency graphs are something that I deal with in day-to-day life. So When you have a source code and you specify In your say make file how to pull other dependencies and how to link libraries Then you'll create something like this where on the bottom You'll start out with all the different files the header files and the C files And then you know create a final race and then link them up and so on and there are also network graphs programs that are presented as graphs as I mentioned and compilers and Three data structures are probably all of you are dealing with in your everyday Jobs are also structured as graphs They're just you know more Specific example of graphs. So what kinds of graphs are there? Well, there is just simple graphs undirected graphs Were no there connected by edges. There's also weight of graphs where now each edge has some weight associated with it There are director graphs also known as Diagraphs where now the edge has a specific direction. So in this case, there is an edge a director edge between a to be So there's a way to get from a to be and you can also send weights to those edges now more Exotic types of graphs, but still a very commonly used are Multigraphs where you can have multiple edges between two nodes so they're usually used for suppose you want to figure out whether you should drive from Boulder to New York or you want to fly from Boulder to New York It will tell you how many hours you will take you to drive or how many hours will take you to fly and you can associate the cost With traversing that distance and so on Another cool type of graph is mixed graphs where you have Undirected edges and directed edges in the same graph So those are commonly used to represent job shop scheduling problems. So those are the problems where you have big job and then you can Separate it out into multiple tasks and now the directed edge specifies the precedence of tasks So which task in this case task B has to be executed after task A and Undirected edge specifies which task cannot be executed concurrently for in this case C and D For some reason cannot be executed concurrently For instance, we may know that they are using a lot of resources and our system may not be able to support that amount of your resources Okay, so now that we looked a little bit on Graph theory, let's talk about graph API design Also in object-oriented languages will have you know something where like it's a class node object node has some data associated with it and we have object edge which has Two nodes that it actually connects and we have a class graph which has collections of nodes and edges and You know, of course, but you can also have some attributes associated with it and so on So But let's talk about more abstractly how we can represent graphs first So same graph as we saw earlier. We have five nodes ABC and D ABC D and E and we will label the edges So now there are four general types of graph representations. You can represent graphs using adjacency lists Each node is mapped to a list of its adjacent successor nodes. In this case A is mapped to B because there's an edge between A and B and B actually has two edges To nodes C and D and so on You could use incidents list to represent in which each vertex stores its incident edges and each edge Stores its incident vertices You can also use adjacency metrics where The rows are the source nodes and the columns are the destination nodes And now this intersection in the cell you would put zero if it's the From the node to itself and then one if there is a sense of we have an unweighted graph we'll say that the cost is one for if there is exist an edge and The cost is infinity if there's no edge between two nodes and we can also use incidence matrices We're now rows a still nodes and then columns are edges and at the intersection We'll basically put whether the node is a source a destination or non-existence in the edge So adjacency matrices are best at most efficient at representing dense graphs and a distance a list I'm most efficient at representing sports graphs my experience has been that most graphs that we deal with in a day-to-day life are Sports graphs so loom users actually adjacency lists to represent graphs internally So now let's talk about how represented graphs Um, yes, sorry, so dance graphs are So You have we have nodes and edges and there is suppose we have n number of nodes and m number of edges The maximum number of connectivity that we can have is n times m So dance graph approaches n times m number of edges the more edges between the nodes the more edge The more densities and the fewer edges there are the the more sparse it is So so what about graphs in functional programming world? So what we have is More abstract we have structs which represent data, you know, there are your classes Let's store some data Then we have interfaces. What kinds of functionality does the graph provide? What kinds of functions can we call on them and then we have implementations which connect the two So they provide how do you access this data this tract with this API? This allows us for more flexible Representation we're now graphs don't assume anything about your graph So as the author of the graph you have all the power to specify what kind of graph you're dealing with and Graphs are generally irritable. So anytime you do modification you add nodes remove edges you get yet a new graph and a lot of Functional programming languages closure specifically I actually use co algorithms to enable you to keep references to every version That you need so you can backtrack easily so you can do you know time travel to previous version of your graph, which is pretty cool So now what we're going to do is we're going to see graph Implementing enclosure. How many of you have written closure? Okay, wow quite a fair number. Okay. Awesome. So for those of you not familiar don't worry about it I'll walk you through and I'll point out the major features of the language so you can follow along But the syntax is pretty minimal because we're dealing with a list so So So we define a protocol which is an interface like in Java I'm not familiar with Haskell that much, but I think it's more similar to type classes I'll let the Haskell experts clarify that part so We define a protocol graph and we specify which functions you can call on a graph so you can crawl in nodes Function which which you just provide the graph to it and then it's able to retrieve the nodes you can Retrieve edges you can specify whether the nodes or the edge is Existence in the graph You can retrieve successors of the node you can calculate the number of Edges coming out of the node and you can enumerate all the edges coming out of the node. This is to support the multigraphs Now we have a protocol for directed graph also known as that graph So we have a way to retrieve predecessors given a node in the graph We have a way to retrieve in degree. So how many edges are actually going into the node and What are the edges going into the given node and we also have the function transpose which basically returns the graph with all the edges reversed Now we also have a protocol with a graph Which defines just one function, which is a custom with function which allows it for way to be derived from other attributes So if your weight Depends on the airplane distance and maybe on the cost and so on you can specify how to actually retrieve that data and how to compute that weight And there's also editable graph which allows you to edit graphs as Persistent data structures so you're able to add nodes add edges Remove them and remove everything from the graph and remember that that will return to you a new graph after each operation So suppose we wanted to create a more complex graph Like for instance basic editable a digraph. How would we go about it? So in closure will diff def record defines a type basic editable digraph and We'll provide three functions to it nodes Successors and predecessors Now what you see here is extend basic editable digraph So this is not a single for inheritance like you would do in Java. This is just a pattern for Specifying implementation for those protocols So it would implements three protocols graph digraph and editable graph and what we'll do is Will so remember the graph is all this functions and this is just a protocol definition. That's not actually valid code so now if we wanted to Implement the protocol functions the API then what we'll do is we'll actually provide a map. This is a method map so It's the map of the implementation where keys are function names and values of the functions So let's see how it looks So we have a key which is edges function, which will specify how exactly we implement the Edges function and then it provides the implementation which is the value the function itself Where for each node in the graph what it's going to do is going to pull out all the edges coming out of that node and Then it's going to return them and then we'll do similar things to extract the nodes and so on Now for directed graph We will provide a different method default graph input which was be a map with where the key is transpose function Which will basically takes the successes and the predecessors function that we provided and just swap them and return a new graph for us and And The other functions to implement a much more trivial to implement so when I can look at those and then you know, similarly Implement the edit ball graph protocol. You get the idea. The rest is implementation details So this actually can be found in loom that graphing space if you're curious to look through the implementation details and try to understand all of it okay, so So how is how is it different implementing graphs representing graphs and functional programming work from object oriented? So we have our data our API and our implementation separately and our implementation Specifies how API can be called on our data. We'll have flexible representation We're in this case. I was the author of the graph that decided that I have a basic editable digraph So I was able to specify exactly which protocols you need to implement and provide the implementations for them and Finally, we'll have immutable graphs. So anytime we Add a node or add an edge mutate in any way it produces yet a new graph for us Now let's talk about how to implement graph algorithms functionally Specifically, we will look at the example of Bellman Ford's algorithm. Is anyone here familiar with the Bellman Ford? It's similar to dexter algorithm in that it finds a path between a single source to all their other vertices in the graph With one caveat. It's actually able to detect negative weight cycle So negative weight cycle is when some of weight of all edges are negative. What does this matter? Well, there's a negative weight cycle between BD and E The total weight of it is negative one. So when we're traversing in our algorithm the edges What we're going to think is that every time we traverse the negative weight cycle We found yet a shorter path and yet a shorter path We will never actually converge on a fixed point and we'll run infinitely So we'd like to detect this as early as possible and quit and say we couldn't we can't possibly find the shortest path from the source To all the other nodes because you have negative weight cycle So this is the description of the Bellman Ford algorithm in the introduction to algorithms book also known as CILRS It's common that a lot of algorithms implemented use Assuming procedural object oriented languages. So this is, you know, perfect example for us to see how to map that to functional world Okay, so let's take a look one by one because there are a couple functions definitions, which we actually don't see here So initialize single source tells us that for each vertex We want to specify that the distance to it is right now infinity because we haven't computed anything and then the Parents pointer is now so parent pointer is the vertex that comes before the given vertex when you're finding the path And now we'll initialize our for start note the distance to be zero because it's just the distance to itself Okay, so the way we're to implement this is we'll call the innate estimates function the definite Minus thing that you see here is actually just a way to specify enclosure This is a private select not accessible publicly method because we're just using that as a helper So now it takes a graph and a start note and Now we'll specify the node data structure Which is all the nodes except for the start note and we'll use the disjoint send to get the Disjoint set to get all the nodes without the start note Now we'll initialize cost which is our pathcast from the start vertex to all the other vertices and What intro leave does is it basically gives us the? mapping from the nodes to infinity it turns out that Infinity words itself is long it's too long to put on the slides given this font so they This could listen both the infinity symbol that you see here And so we will also define paths because we want to figure out how to get We want to Store the parent pointers in our case So we'll provide the mapping from no to no because we haven't computed its parent pointers yet Okay, and now basically we want to initialize our cost With start nodes map to zero as a cost and start node will not ever have the parent pointers So we'll just map it to no Okay, so so far so good Now online for we define function code relax The way you can think about the function without bothering with implementation is Given the two vertices you and V and the cost between them, which is w if we have a current path to node V from the start note and We have a path to the unit and there is an edge between you and V Is there shorter path to node V from the start node traversing the you so in this case on on the right-hand side? So from the start node to know V because so far we've computed is for now to get to you know It's on the cost us to and to get to Know the three node you it has a three So we would like to relax the edge because we'll find shorter path through that note now Notice that on line six and online one of relax function. We have exact same condition So let's pull that out into its own function So we'll define can relax edge function where we'll specify three arguments Which can also be referred to as By its elements you and V and then the edge cost and they cost map They the hope of the infrastructure that we created at the beginning So now we will pull out the V distance to be by Getting that from the map of cost that we computed so far and their distance to you and now we will also compute the sum So this the path going through node you to node V And now we will just return the result of comparing them Okay, so now to implement the whole thing for relax Function, but we'll do is again. We'll take the edge which we can also refer to its vertices as UV. This is called The structuring enclosure, which is pretty cool feature of it And now we will take the UV cost which is basically our W and it will take our internal data structure That we've been keeping around estimates which encapsulates costs and paths So now we'll get the cost to you function Now it costs to you vertex and we'll compute the sum and then if we can relax the edge Then we would like to update our cost and parent pointers So we will update the costs map and the past map and otherwise We'll just return the estimates the hope of data structure as is without modifying it Okay, so now let's do this for each edge in the graph. We'll relax it So we'll specify functions relax edges, which takes a graph start node and our estimates help a data structure and We will reuse reduce function for each training over all elements. So we would specify reduced function which on the bottom we see goes over each Edge and What we will do is for each edge. It will take the initial the initialized estimates function and It's going to try to relax each edge and update the estimate data structure as we go along Okay, so now we're actually very close to being done tying this all together But you probably can't see it. So don't worry. We'll actually take a look step by step But before we do that let's take a Short break to reflect on what we know so far. So we used function composition We define functions. We pulled out a separate function for defining the condition. We Compose that with relax edge. We use that inside the relax edge Now we defined it that a different function for relax edges which code internally relax edge and so on and functions operated on a lot of different help a data structure So we actually had to costs and paths which and which were we referred to it as estimates overall and We use higher order functions such as reduce to help us with that so reduce what helped us to iterate over elements and Reduce actually is a very interesting function, but I'm not going to talk about all its algebraic properties It's probably deserves a talk on its own, but if you're interested I highly recommend you look into that how it works So now going going back to the Bellman Ford function so tying it all together So we'll define a bowman for it function We take the graph and the start node and now we will initialize the So we'll initialize the estimates By calling the function in it estimate And now we will relax edges. So online to you see we do this for we do this V minus one time so what we'll do is we will code a reduce function on edges and This is the trick to do the V minus one times If this doesn't quite make sense to you I'll post the slides online and you can verify to yourself that it actually works trust me It does but the cool thing about is that now you take the reduce function You pull out the end you specify how to operate over edges and now you specify how many times to do this by Calling so you count the number of nodes and then so that's V and you document that So that's minus one and then you do that over the range one two V minus one Okay, so now For the part that actually does the section of negative white cycle So so far we computed the path from the start node to all that vertices Now we want to know if there is a negative white cycle Which means that we're just if we keep iterating we're going to keep finding short and shorter paths and The way we do we do this is this So some function enclosure basically returns to you the value itself which is truthy enclosure or returns to you And now which is evaluated to false So here what we want to do is we want to see is there an edge that we can still relax and if we find such edge that Returns to us that we could relax it then we will Exit immediately and return false and otherwise vote that the The algorithms to think here such return true, but that's not really helpful So let's return parent pointers itself and the construction there are pointers you know, it's just mangling more of internal data structures and calling more functions on them, so okay, so What we've seen so far when implementing graph algorithms functionally is that everything was a function and Functions operate on on lots of different internal data structures which put themselves just maps lists infinite sequences and we operating them back and forth and Every function returns to us in your representation so the estimates that we computed initially then we passed it to function and There was actually two data structures custom path. We'll update of them as we went and we got a new copy of it Okay, so Now let's talk about what loom does so as I mentioned loom is a Graph algorithms and visualization library written closure. It's accessible on github and supports a variety of graphs It has undirected graphs directed graphs weighted graphs Multigraphs which we mentioned earlier which you can specify many edges between two different nodes It also supports fly graphs which are read on the ad hoc graphs This is something that we call fly graphs. So what they are able to do is they're able to infer Given a few functions they able to infer other ones that it needs to call For instance, if you give it node and successions functions a ways to retrieve them Then it will figure out a way to retrieve edges And if you give it successors and the start node, then it will figure out how to retrieve nodes and edges So it supports also a variety of algorithms It supports depth for search and breadth for search So on the left-hand side you see the walk of the tree using depth for search where it first tries to go It's deep as they can and then backtrack and expose the rest of the tree Where's breadth for search tries to explore each level of the tree one by one And it also has a bidirectional breadth for search implemented in addition it has topological sorts Where every success of a vertex is guaranteed to come after it in the ordering? It computes a variety of shortest path algorithms including dextra but one for that we looked at earlier a Star which is commonly used in AI's to compute path finding and Johnson's algorithm which instead of computing from single source to all the path it to all the vertices in the graph It computes all pair shortest path So from all the vertices to all the other vertices and it specifically does that on sparse weighted directed graphs They're actually also algorithms to compute clicks using Braun Kerr-Busch For finding maximal clicks in an undirected graph. So clicks are When you have a click what it guarantees is that every vertex is adjacent to every other So there's a direct direct edge between all the other vertices in the click Now as you see is strongly connected components, which slightly relaxes this notion strongly connected components defined by Every vertex is reachable from every other vertex in the strongly connected components So it doesn't have to have an direct edge, but it needs to have a path So we compute strongly connected components using Kassar-Raj algorithm There's also a density function which computes just the ratio of edges to nodes So it's you are able to figure out whether how dense your graph is or how sparse your graph is There's also a loner node way to Way to compute a loner node So on this graph that we see G is a lower node because it's not connected to all their other nodes in the graph There's also greedy coloring and two coloring algorithms So greedy coloring what it does is as soon as it cannot find a color from the currently used set of colors it would just assign a new color and Two coloring is used to figure out whether the graph is bipartite So if you are able to do two coloring on a graph that means your graph is bipartite And there's also max flow Algorithm using Edmunds-Kerp which finds a feasible flow through a single source sink single sink flow network That is maximum. I couldn't put it on the slide, but there's also primes minimum spanning tree So remember I mentioned that your graphs your trees are also graphs So what primes algorithm does is it computes minimum spanning tree for a connected weighted undirected graph so When it traverses and figures out which tree to compute it picks the nodes that have minimal edges So it's guaranteed that they it picks edges that have minimal weight So it's guaranteed that all the wedge all the edges in the minimum spanning tree are minimal from this subset that it could have picked So the previous algorithms I mentioned are in loan that our name space. There's also our generic name space Which basically allows you to run graph algorithms without any knowledge of the graph representation So you don't have to implement looms graph API to use out generic So basically out generic doesn't know anything about underlying representation of the graph so it requires only successors function and it requires a start node for depth for search and breadth for search because you have to start somewhere and Also for topological sorts and extra algorithm and it I also if you want to find a breadth for search path between Two different nodes then it requires an end node as well And as I mentioned loom is a graph visualization library, so it uses graph visit graph vis which is a commonly used graph representation library visualization library so by default it uses Dot algorithm for those of you familiar, but you can also specify other layout algorithms if you wanted to pretty easily so what I wanted to find out for myself is whether loom is actually as Flexible and as an unopinionated about graphs as I claimed it was so I implemented Three different ways to represent three different graphs from three different problem domains and represent to them in loom so one of them was I took a core async single static assignment form function so basically what it does is it takes the they go block and Represents the program in a single static assignment form, which is a common representation that compilers generate for a program. I also represented so titanium is a Closure wrap around Titan DB So I start some data in the in-memory Titan DB and then I specified a way to Have your data represented in loom and run graph algorithms on your data in the titanium database and I also took the Dependency graph of closure get hop repositories and try to figure out what are the most commonly Used libraries are besides the you know the closure core libraries And they're actually infinite number of graphs that can be represented by loom I know that some people use it to represent their workflows. So If you want to figure out Specify a way to build your code and roll it out into staging environment production. You could use loom I There is I think a research group in Berkeley that is used it for some time to represent to do a programmer presentation of their For their compiler and I'm sure there are many more that I don't know if yet But if you're playing with it and let me know what you're doing with your looming integration Okay, so Let's wrap up Functional graphs are very interesting very somewhat new field for a lot of people to think about because They should be represented differently if you want to learn more about how to Represent data structures in a functional world. There's fantastic book by Chris Akasaki called purely functional data structures You may have to learn standard amount. That's the language the Examples are in but many people have found that it was pretty easy to follow without actually understanding standard now So What are some takeaways? Well, when we represent graphs functionally our data and our functions are separate So unlike an object-oriented world where we had Notes and we specify nodes what kind of operations you can do and edges specify the object edge specifies what kind of operations you can do on them and functional FP world Those are separate so you didn't leave somewhere like it lived in my you know titanium database right like the graph database And then I my functionality which was loom had some API and then I specify how exactly to retrieve it from the database Functional graphs have a much more flexible representation because they don't make any assumptions about your graph So it's all up to the graph offer to figure out what kind of graph they want You may actually have a directed unweighted graph and for some problems You may want to treat it as unweighted and for some other problems You want to treat it as weight a graph because you want to compute some properties on it so you're able to do that and The other third takeaway is Graphs are immutable in the FP world So anytime you do mutation to the graph it's yet a different graph unlike an object-oriented world You just you know keep changing things and maybe it's it's never the same graph But as you pass it to your User maybe they'll do something else to it and you know return to and you don't really know what happened to it Well and take it way number four is use loom if you have graph algorithms problems if you have any need for graphs cool Awesome. Well, thanks so much for coming


Hi, I'm Stephen McDonald. I work as a sysadmin for Anchor. What I'm about to show you is something I made a few years ago. I was going through a phase of... I listened to quite a lot of Frank Zappers' and one thing that he used to do when recording live was to... He'd have two guitar amps on stage both mic'd up and when he released those on live albums he'd pan one hard left and one hard right and it creates a very interesting stereo effect. And I was experimenting with doing similar things for my keyboard. I found using guitaric... guitar amp effects worked quite well for electric pianos. It's fairly straightforward to do stuff like that in Arda. What I do is I just route each channel of a stereo track to its own bus and then do effects on that. You might be able to do more sophisticated things with send, receive, with Ladspur plugins, I haven't tried. This particular thing is about a minute and a half that was cut out from a 20-minute jam session. Piano and drums and I later overdubbed bass but this is a draft mix so there's not... You can't hear the bass too well. In any case, what I've done with the piano is the right side has just the raw piano track and the left side actually has the piano passed through a ring modulator which I found resulted in a very interesting effect. I tweaked the ring modulator settings. I found that it seemed that depending on the ring modulator settings the piano would shift from side to side depending on the pitch of the note at the time which I found curious. I guess I'll play it. That doesn't want to be coming out. I'm not sure if that could be an issue with the laptop. I don't know if it's actually playing to the audio port. Pretty much it. I don't know how well the stereo image came out these speakers but if you'd like to download it you can get it at music.sjm.so along with a bunch of other... Okay, yeah sure I can email it to you. All right so next up I'm going to play something that I set up so for the streaming guys we need to cut the streaming for this one. The stream in AVB and the answer was what is AVB and so as my punishment for asking that question I'm up here to provide a little bit of enlightenment so presentations really as you can see up there you can go and read it yourself on Wikipedia. There's a pretty good page on Wikipedia so AVB stands for audio video bridging and it's a suite of network protocols to do with getting audio and video across a local area network with low latency or constant latency, low delay and guaranteed bandwidth between endpoints. So it's not particularly Linux related at this point. I'll kind of touch on that a little bit later. So there are really three standards of the main ones that involve the first one they call, let's see where should I stand, 802.1 AS it's here okay yes I can read it's right in front of me which is like IEEE 1588 if you've heard of that which is also known as PTP, precision time protocol and it was supposed to be interoperable but it's turned out that the way they've written the standard it's not quite the same so that's a way of distributing accurate time to kind of a nanosecond resolution across the network so that every endpoint knows what the time is and that is cool if you want to display or render your audio at the same time it's meant to be accurate enough so that each speaker can be off a different network port and they'll be properly synchronized or you can do that so what this requires it doesn't work with ordinary network hardware it needs enhancements to the low level network hardware to do with to allow it to time stamp the packets as they go in and out and the bridges are able to measure the time delay of the bridging of the packets so that's the first part as you can send stuff around and know exactly how long it's taken to get across the network second part is you see where are we qav traffic shaping so it operates so it doesn't send giant packets across the network thank you the audio is sent across in very small packets I think maximum is 512 bytes and they're sent out at an 8 kilohertz rate so that's one packet every 125 microseconds and you have to be able to send that accurately so I'm not sure what kind of a challenge that is for the Linux networking stack to be able to do that typically it requires some support in the hardware to have hardware queues that operate to cause that to happen with the right priority and the third major part of the standard is emission controls which allows you to reserve bandwidth through a network including the switches from end to end and so that you are absolved from having congestion from other stuff happening in the network and get your audio across there so here we go this diagram here t the t in the red square up there torca is wanting to send something to the listener somewhere I don't know why it's called d here but I'm thinking the green circle advertises it stream says how much bandwidth it wants all the switches will reply and say yes I can give you your bandwidth and you're guaranteed to have that to get through so that's you know means that once you happen once that happens someone else doing a big file download is not going to disrupt your audio and video stream let's see I have here why is always render okay that's the that's a big version of the so there there is a kind of commercial organization called avenue which is kind of promoting and providing standardization work so so you can go and get your stuff certified at a price of course and so it's being driven by these guys founders Intel so Intel is incorporating the technology into their hardware Xilinx Cisco into their switches I'm pretty sure Apple is putting it into some of their gear and so it'll become you know it's been around for the standards were finalized in about 2011 so it's been around for a little while but still is no you know full open source implementation so that's kind of where it might be interesting so there's a number of people using it in the pro audio arena and in your automotive and here we are github open AVB they're building up slowly the pieces of the system which includes a protocol for discovery and control of the mixing elements so there's a brief introduction to AVB yeah sure thank you yes if you want to if you want to kind of wag from the conference from a bit there's an interesting show at the art gallery just down across albert park unfortunately it only is open from 10 to 5 p.m so you'll have to be shirking from your conference responsibilities if you want to see it but thanks for that yeah that open AVB thing is interesting because it's sort of conceptually in competition with a couple of proprietary things that have been set up to do the same sort of general thing and it's going to be very interesting to see if the standard AVB stuff can actually supplant the proprietary stuff the biggest problem I think might end up happening is mirroring the firewire situation where the firewire audio standards and they're very good but other but most manufacturers decided they could do key control things better than the standard and so they use hooks to add vendor specific extensions and themselves which makes the standard the standard gives you a good foundation for it but it then key key things like mixer control and stuff you need to do proprietary packet formats to get get things to go so yeah but it's same in same in firewire it was in the standard but everyone decided the standard didn't apply to them so they wrote their own so yes it's it's fun Jeremy all right that'll do amazing kyora my name is Jeremy and I'm a boring sysadmin but I also play the bassoon and I'm into music specifically classical music um put up your yes I know I I really liked your talk earlier who here put up your hand if you know what a floppy drive is put up your hand if you've ever used a floppy drive okay and you know they make sounds right well what if you could control the sounds that a floppy drive makes uh who here has heard of making music with a floppy drive oh there you go quite a few who here has ever made such a rig okay did you know that is actually incredibly easy um so a floppy drive if you've ever pulled a piece of your part and looked at the back of the floppy drive you'll notice there's a plug for the power and there's also a plug where a ribbon cable goes into the back and it's got a number of pins those pins all do various things but there's actually only three pins that we're interested in one is ground you always need ground the other is direction the other is step so what you do is you I'm not even talking about software here I'm talking about using crocodile clips on the back of your floppy drive if you touch ground to the step pin on the back of your floppy drive the motor uh that goes along which which normally controls the head that reads the floppy drive it will actually click and you tap it again it goes click you tap it again it goes click you keep tapping it like that and that's called a stepper motor um as opposed to a motor that might drive a wheel or something so a stepper motor means it just does one click at a time and then of course you can only step so many times and then the motor gets to the end and then you have to touch the direction why and then it starts going in the other direction and you know that music is fundamentally made of frequencies right so a low note is a low frequency a high note is a high frequency so if you have the motor going faster or slower then um uh then you can control the pitch so um that's uh so uh that is a very easy rig to build so there are uh a few main components uh are not a live demo with real floppy drives I do have a recording if anyone wants to hear it so first of all you have floppy drives uh what I have uh six floppy drives here uh each with ribbon cables out the back yes this is not safe well I mean it is safe it's only three five volts something like that but it's uh yes is prone to shorting out um so these are floppy drives here and what this is here this is an Arduino Leo stick so I received this in my conference swag bag at Ballarat uh it sat unused for a year but I finally put it to some good use um so each floppy drive occupies two pins on the Arduino one is for the step one is for the direction um the software running on the Arduino I did not write I'm probably not clever enough to do that there's actually software already out there called Moppy M O W P Y it's available on Github and that software that runs on your Arduino and it also runs on your laptop so uh on your laptop it's a Java program that reads a midi file converts that midi file to a format that the Arduino can understand that the companion program on the Arduino then controls the pins going to the floppy drive as appropriate so here's a close-up of me doing some testing so you can literally without an Arduino without a computer with only electricity you can you can play with the floppy drives like this and makes make some noises uh this is just getting it all wired up here and um and this is a little circuit board that I made um I know nothing about electronics but I knew how to connect wires from one hole to the other along here this is the ground and then I'm just connecting them to the various pins on the Arduino the reason why I did this was so that I could plug in the floppy drives directly into the circuit board without needing all these wires sticking out everywhere and yeah that's pretty much all that you need to to make your own floppy drive rig um does anyone want to hear what it sounds like well you I'll only play a short amount of it because it uh this goes you probably don't want to hear the whole lot I've only done that movement so so what you were listening to was the queen of the night area from Mozart's magic flute uh it's actually an ironic piece to do for the floppy drives because what the floppy drives have only a range of by the way let me know if I'm running out of time or anything okay so the the floppy drives have only a range of about an octave so what I do uh is uh when I get to the top of the octave I tend to just sort of wrap back down so it's really like having an an integer that that overflows after after it gets to eight uh but yeah and and what I tend to do is the floppy drives are really soft up high really loud down low so what I do is I tend to have two floppy drives sort of an octave apart just to get the extra volume for the tune um the music is done using rose garden which is just a you know midi program you could use any midi program it's really fairly simple and if you're interested in building your own rig um I'm probably completely useless to talk to but feel free to talk to me afterwards so thank you all right so the last one is uh daniel sobie who's going to give us a brief overview I believe or something about music brands stick this in or what is it called um music brains is a online music database um it's all cross-referencing different facts about everything um it sort of started from cddb um cdb went proprietary and became grace note so these this group of people that used to contribute to cddb went on their own and started music brains so that could keep on taking their own music um it's all licensed cc0 for most of it and cc by ncsa for the rest the gpl license server the gpl license client tools um if you want to you can run your own database copy of the database if you want to play around with um and then it's the basis for quite a few other websites so Spotify use it for keeping track of artists and whatever else and bbc use it um so bbc music reviews use the same ids for everything so and they've got a twitter bot that when um someone plays this song gets played on music they tweet the artist say your song was just played on bbc4 or whatever so it's something that you can just hack and do things with it um so it's it's cross-linked information so we've got releases which is um so it might be a cd it might contain multiple mediums so you might have two cds in it so that's one release you got each track so a recording um recordings have one or more artists so if you've got this artist featuring this other artist everything all sorts together and you can have stage names so if they just use their first name on one recording and their full name on other things it all all gets managed um there's works which is sort of the song itself or the book or whatever so if someone does a cover it all links this is this is who wrote it originally and this is just a cover of this original song um there's labels um the series so some compilations and things have a compilation every year so you can link this release is the tenth of the series um there's it keeps track of areas so people were born in this country they mainly work in southern country um there's places so you can have recording studio that things were made out of or a venue where a live concert was happened um uh they've just added events to so you can start tracking who which artist performed at events and this live cd or live recording event recording was made at this place so you can start um mapping that together and then there's URLs so links to wikipedia wiki data all sorts of other things so so the whole things relationship so this thing relates to this so you have a group so you might have a group and might link to who all the members in the group and then that might have their twitter handles and whatever else um so yeah artists together artists write works um you can add more data as you go so you can have such and such played the trombone on this recording you can just add more data as you feel like so and for the things like dance music you'll have such and such remix this so you've got the original people that wrote the song and these people created a remix of this song so everything all joins together so quick screen screenshot um so this one you've got cover art you've got the barcode um you've got each track on the cd you've got who played the guitar drums keyboard synthesizer um what the song the reference to the song you've got the reference to the label and when in each country it was released so it depends on how much time everyone puts into it but you can end up with something like this just keep on adding more information as you feel see fit um it's a public database um you just need to create a count it's a web-based thing um there's a voting system to help stop people making bad edits and improving good edits so occasionally there's some people that just spam or whatever so hopefully it goes through the editing system and gets caught before too much damage was done and also helps encourage people that do the right thing make improvements to get it be applied straight away okay so um what you want to do when you get home is download a program called music brains pick hard and you throw it at your music connect collection and it should pick up should search the music brains database and just start adding tags so if there's any if you've downloaded a random thing on the internet you might actually be able to find out more information and as people update things you do it next year and someone might have fixed things so and yeah so add tags add cover art if someone's added it and when I use sound juicers my audio CD ripper and that all automatically adds the tags to the database um so they've expanded a little bit um so the cover art archives um a collaboration with archive.org so because the licensing of cover arts probably bit fishy they've sort of outsourced that and archive.org's happy to have it um acoustic ID is sort of a fingerprinting system that they've got uh critic brains which is um you can submit reviews on on leases and acoustic brains which is um automatic metadata so you can find it can sort of predict uh the the um if something's danceable what's um how many beats per minute and what the probable um yeah just probable factors of all these random things that they've automatically found out. Anything else? Okay, thank you.


Welcome to the Fandall hurry up. I'm Ariel Epstein joining us today, Ryan Williams. We are talking some NFL never too early. I cannot wait to talk some NFL stacks today, Ryan. Oh yeah, this is, this is that time of the season. We're about a month away from training camp opening up. I guess a little, a little over a month for some teams, but I mean, football is right around the corner and what better way to get us there than to talk about some best ball stacks that people can be targeting to use on their best ball teams? Your first of three of your top best ball stacks has to do with the Los Angeles Rams. Why are you targeting this team and who are you going to put in your best ball stack? Oh, I'm so happy you brought this up first, Ariel. Yeah, the Rams, okay. So they just shipped away Jared Goff. Their number one pick. They bring in Matthew Stafford heads of the farm for him. I mean, these guys don't have a first round draft pick. I don't think until 2024. It seems like five years down the road almost, but they're saying that they think that Matthew Stafford could be the Drew Brees for them. They got a seven, eight year window. So let's factor that into best ball and talk about this year. Obviously they've invested a lot in Matthew Stafford and this guy is still going outside of being a QB one this year. I don't know why because Sean McVeigh has been doing stuff with Jared Goff who people, you know, want to throw under the bus. Now we get a Matthew Stafford who's consistently throwing for 4,000 yards when he's healthy. He's got two weapons on the outside and Marvin Jones and my gosh, you used that Marvin Jones to get the guy that he's got two weapons on the outside and Robert Woods and Cooper Cup who I think are better arguably than those two guys. I think this offense is going to be explosive. Everybody's loving on the Rams. If you go to the fan fan dual sportsbook and look at their odds, even even his odds, Matthew Stafford's odds for MVP is up there, but people don't want to target this team and best ball and I get it the wide receivers. They're going around the range of 30 in ADP or 40. If you're looking at Robert Woods specifically, Cooper Cup, even going closer to 50 in some leagues, these guys are going to pay that off. I think if you attack this and draft Matthew Stafford with one, if not both of his past catchers, I think you're really within a treat. I think you could get possibly a QB1 payoff for Matthew Stafford and then two top 24 wide receivers at the position as well too. I love this by low value on Matt Stafford. You're talking about a quarterback that's been top 10 in the league in passing yards in addition to passing touchdowns used to having to throw the ball as well as you mentioned in Detroit. I love Stafford with his wide receivers in LA. As you could see behind me, I have this Baltimore Ravens helmet. That means I must be aligned with them in some way. I am loving that you are going back to this Lamar Jackson, Mark Andrews, quarterback to tight end set as part of your best ball lineup. Why is this a great best ball stack for year three of this duo? Yeah, gotta love that Ravens helmet there in the background. And I don't think we've done a hit without talking about the Ravens there, Ariel. And this is crazy. I'm gonna need to invest in this team in some way, shape, or form. And I have in best balls. Getting to Lamar Jackson, getting to Mark Andrews this year, I think is going to pay off dividends. Look, Lamar Jackson, everybody wants to talk about 2020, how much he struggled to downfill pass. Okay, who was he passing the ball to? Mark Andrews had his worst year arguably of his past three in his career. The drops were there. He wasn't, you know, catching as many red zone targets as there was before. But even when you look at Mark Andrews numbers with the seven touchdowns and really having a down year, obviously better for standard there with the touchdowns but looking at even in PPR formats when he finished as the tight end six, I believe he was only six points behind Robert Tanya who finished as the wide risk or as the tight end three. So when you're looking at that discrepancy there of only six points and Mark Andrews catches, you know, what we're used to seeing close to double digit touchdowns. He can definitely pay off there. Look, I get it, it's down but you got to love what the offense is doing here with Greg Roman, the offensive coordinator and John Hubbard is saying they want to invest in the past and that's going to be wheels up for Lamar. We know he has the rushing upside but now you're adding in guys like Rashad Bateman. They brought in Sammy Watkins. They're letting the running backs go out there and catch routes. Gus Edwards and JK Dobbins are going to be getting targets this year. I think it's wheels up for this Ravens offense and I love targeting them at where they're going. I think Lamar Jackson clearly can finish as a top two quarterback in this league and Mark Andrews going behind a guy like Kyle Pitts, the rookie currently right now is the tight end five. I think that's too low for him. I think you can definitely pay off getting this back and you can get this in the mid rounds. You don't have to invest in early pick like you were before in Lamar Jackson. Both Lamar Jackson and Mark Andrews entered the league in 2018. However, Lamar didn't start the season until 2019. Three years now that these two have been starting together for the full season. Last one here. We're going with the Pittsburgh Steelers. You're going with the IFC North Trends. You like Ben Roethlisberger paired up with Johnson and Jujus Micheuster. Jujus Micheuster coming back to the Steelers after a lot of doubt with his future in Pittsburgh. Why is this a stack to target? Yeah, I love getting to the Steelers stack as well. I mean, it's crazy when you're looking at last year and I think people are taking the buy week, what the Steelers did after the buy week. You know, we got to take that with a grain of salt. I mean, they were not themselves. They were undefeated going into that buy. They were passing lights out.  They were scoring over 24 points per game in every game heading into the buy.  I think that had a lot to do with their offensive coordinator, Randy Finchner, who's not there anymore. They promoted the quarterback's coach, Matt Canada, who's known to be a creative guy. This is a guy who's run a lot of college offenses, was at LSU in 2018. He's very creative. And I think that buying into this Steelers offense is going to really pay out dividends. Like Deontay Johnson, this guy has wide receiver, like top 12 potential, potentially even wide receiver one potential that's crazy to say, I know. But look at what he saw last year, 144 targets. He was catching everything until late. And then he had the case of the drop seas. If he can get that together, I think that's going to be nice. He's definitely going to pay off in the wide receiver 50 range on where he's currently going. I mean, Ben Roethlisberger is going outside of the top 24 quarterbacks, which is absolutely ridiculous. When you think about in healthy seasons, he's in the top five of pass attempts every year. I mean, and we talk about this offensive line for the Steelers being banged up. And okay, so they're going to have to throw more. Sign me up for that. I love getting a piece of this offense. And even Juju Smith-Suster, who's going, you know, later than Deontay Johnson and Chase Kalipo, I think makes for a good addition to the stack. As you're looking at him, kind of people were down on him last year, but he still stole nine touchdowns. He had a good red zone share as well on this team. So if we can, you know, get into the Steelers having to, you know, pass a lot even when Najee Harris coming into the mix, she's a pass catching back. I think that the Steelers attack, passing attack, is going to definitely pay off. And I definitely want pieces of it going into the year 2021. Ryan, I love that you brought up the pass attempts for Ben Rothlessberger. Rothlessberger's pass attempts props on the Fandall Sportsbook were my favorite to attack. We pretty much hit every over. That number couldn't get high enough. That's it for us here on the Fandall Hurry Up for Ryan Williams. I'm Ariel Epstein. Good luck to those best ball lineup.