Fumagalli_Motta_Tarantino_2020.Models.Base

   1from typing import Optional, Union
   2
   3import Fumagalli_Motta_Tarantino_2020.Models.Types as Types
   4import Fumagalli_Motta_Tarantino_2020.Models.Distributions as Distributions
   5
   6
   7class CoreModel:
   8    """
   9    There are three players in our game: an Antitrust Authority (AA), which at the beginning of the game decides its
  10    merger policy; a monopolist $\t{I}$ncumbent; and a $\t{S}$tart-up. The start-up owns a “prototype” (or project)
  11    that, if developed, can give rise to an innovation: for instance a substitute/higher quality product to the
  12    incumbent’s existing product, or a more efficient production process. The start-up does not have enough own
  13    resources to develop the project. It has two options: it can either obtain additional funds from competitive
  14    capital markets, or sell out to the incumbent. The incumbent will have to decide whether and when it wants to
  15    acquire the start-up (and if it does so before product development, it has to decide whether to develop the
  16    prototype or shelve it), conditional on the AA’s approval of the acquisition. We assume that the takeover
  17    involves a negligible but positive transaction cost. The AA commits at the beginning of the game to a merger
  18    policy, in the form of a maximum threshold of “harm”, that it is ready to tolerate. Harm from a proposed merger
  19    consists of the difference between the expected welfare levels if the merger goes ahead, and in the counterfactual
  20    where it does not take place (derived of course by correctly anticipating the continuation equilibrium of the
  21    game). A proposed merger will be prohibited only if the tolerated harm level H is lower than the expected harm
  22    from the merger, if any.
  23
  24    Timing of the game:
  25
  26    | Time | Action                                                                                                                                                 |
  27    |------|--------------------------------------------------------------------------------------------------------------------------------------------------------|
  28    | 0    | The AA commits to the standard for merger approval, $\\bar{H}$.                                                                                        |
  29    | 1(a) | $\t{I}$ can make a takeover offer to $\t{S}$, which can accept or reject.                                                                              |
  30    | 1(b) | The AA approves or blocks the takeover proposal.                                                                                                       |
  31    | 1(c) | The firm ($\t{I}$ or $\t{S}$) that owns the prototype decides whether to develop or shelve it.                                                         |
  32    | 1(d) | The owner of the prototype engages in financial contracting (if needed). After that, uncertainty about the success or failure of the project resolves. |
  33    | 2(a) | $\t{I}$ can make a take-it-or-leave-it offer to $\t{S}$ (if it did not already buy it at t = 1, and if the development of the project was successful). |
  34    | 2(b) | The AA approves or blocks the takeover proposal.                                                                                                       |
  35    | 3    | Active firms sell in the product market, payoffs are realised and contracts are honored.                                                               |
  36    """
  37
  38    def __init__(
  39        self,
  40        merger_policy: Types.MergerPolicies = Types.MergerPolicies.Strict,
  41        development_costs: float = 0.1,
  42        startup_assets: float = 0.05,
  43        success_probability: float = 0.7,
  44        development_success: bool = True,
  45        private_benefit: float = 0.05,
  46        consumer_surplus_without_innovation: float = 0.2,
  47        incumbent_profit_without_innovation: float = 0.4,
  48        consumer_surplus_duopoly: float = 0.5,
  49        incumbent_profit_duopoly: float = 0.2,
  50        startup_profit_duopoly: float = 0.2,
  51        consumer_surplus_with_innovation: float = 0.3,
  52        incumbent_profit_with_innovation: float = 0.5,
  53        asset_distribution: Union[
  54            Distributions.NormalDistribution, Distributions.UniformDistribution
  55        ] = Distributions.NormalDistribution,
  56        **kwargs,
  57    ):
  58        """
  59        Initializes a valid base model according to the assumptions given in the paper.
  60
  61        The following assumptions have to be met:
  62
  63        | Condition                    | Remark                                                                                                                                                                                                                                                                                                                                                        | Page (Assumption) |
  64        |------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------|
  65        | $\\bar{H} \\ge 0$            | The tolerated level of harm has to be bigger than 0.                                                                                                                                                                                                                                                                                                          | p.6               |
  66        | $p \\in (0,1]$               | Probability that the prototype is developed successfully depends on the non-contractible effort exerted by the entrepreneur of the firm that owns the project. In case of no effort the project fails for sure, but the entrepreneur obtains a positive private benefit. In case of failure the project yields no profit.                                     | p.8               |
  67        | $B>0$                        | Private benefit of the entrepreneur in case of failure.                                                                                                                                                                                                                                                                                                       | p.8               |
  68        | $A \\in (0,K)$               | The startup does not hold sufficient assets at the beginning to cover the costs.                                                                                                                                                                                                                                                                              | p.8               |
  69        | $\\pi^m_I>\\pi^d_I$          | Profit of the incumbent has to be bigger without the innovation than in the duopoly.                                                                                                                                                                                                                                                                          | p.7               |
  70        | $\\pi^M_I>\\pi^m_I$          | Industry profits are higher with a multi-product monopolist than a single product monopolist (otherwise, the incumbent would always shelve).                                                                                                                                                                                                                                                                 | p.7               |
  71        | $CS^M \\ge CS^m$             | Consumer surplus with the innovation has to weakly bigger than without the innovation (consumers like variety).                                                                                                                                                                                                                                                                        | p.7               |
  72        | $\\pi^M_I>\\pi^d_I+\\pi^d_S$ | Industry profits are higher under monopoly than under duopoly. If this assumption did not hold, the takeover would not take place.                                                                                                                                                                                                                            | p.7 (A1)          |
  73        | $\\pi^d_S>\\pi^M_I-\\pi^m_I$ | An incumbent has less incentive to innovate (in a new/better product or a more efficient production process) than a potential entrant because the innovation would cannibalise the incumbent’s current profits. (Corresponds to Arrow's replacement effect)                                                                                                   | p.7 (A2)          |
  74        | $p\\pi^d_S>K$                | In case of effort it is efficient to develop the prototype, i.e., development has a positive net present value (NPV) for the start-up                                                                                                                                                                                                                         | p.8 (A3)          |
  75        | $p(W^M-W^m)>K$               | The development of the project is not only privately beneficial for the start-up, but also for society as a whole, whether undertaken by the incumbent or the start-up (implies $\\;p(W^d-W^m)>K\\;$).                                                                                                                                                                                       | p.8 (A4)          |
  76        | $B-K<0$$B-(p\\pi^d_S-K)>0$   | The first inequality implies that if S shirks the project has negative value; thus, no financial contract could be signed unless the startup makes effort. The second implies that the start-up may be financially constrained, that is, it may hold insufficient assets to fund the development of the prototype even though the project has a positive NPV. | p.8 (A5)          |
  77
  78        Parameters
  79        ----------
  80        development_costs : float
  81            ($K$) Fixed costs to invest for development.
  82        startup_assets : float
  83            ($A$) Assets of the startup at the beginning.
  84        success_probability : float
  85            ($p$) Probability of success in case of effort (otherwise the projects fails for sure).
  86        development_success : bool
  87            Decides whether an attempted development will be successful (true $\\rightarrow$ attempted development succeeds).
  88        private_benefit : float
  89            ($B$) Private benefit of the entrepreneur in case of failure.
  90        consumer_surplus_without_innovation : float
  91            ($CS^m$) Consumer surplus for the case that the innovation is not introduced by the incumbent into the market.
  92        incumbent_profit_without_innovation : float
  93            ($\\pi^m_I$) Profit of the monopolist with a single product (without innovation).
  94        consumer_surplus_duopoly : float
  95            ($CS^d$) Consumer surplus for the case that the innovation is introduced into the market and a duopoly exists.
  96        incumbent_profit_duopoly : float
  97            ($\\pi^d_I$) Profit of the incumbent in the case of a duopoly.
  98        startup_profit_duopoly : float
  99            ($\\pi^d_S$) Profit of the startup in the case of a duopoly.
 100        consumer_surplus_with_innovation : float
 101             ($CS^M$) Consumer surplus for the case that the innovation is introduced by the incumbent into the market.
 102        incumbent_profit_with_innovation : float
 103            ($\\pi^M_I$) Profit of the monopolist with multiple products (with innovation).
 104        """
 105        self._merger_policy = merger_policy
 106        self._development_costs = development_costs
 107        self._startup_assets = startup_assets
 108        self._success_probability = success_probability
 109        self._development_success = development_success
 110        self._private_benefit = private_benefit
 111
 112        # product market payoffs (p.6ff.)
 113        # with innovation
 114        self._incumbent_profit_with_innovation = incumbent_profit_with_innovation
 115        self._cs_with_innovation = consumer_surplus_with_innovation
 116
 117        # without innovation
 118        self._incumbent_profit_without_innovation = incumbent_profit_without_innovation
 119        self._cs_without_innovation = consumer_surplus_without_innovation
 120
 121        # with duopoly
 122        self._startup_profit_duopoly = startup_profit_duopoly
 123        self._incumbent_profit_duopoly = incumbent_profit_duopoly
 124        self._cs_duopoly = consumer_surplus_duopoly
 125
 126        # set asset distribution
 127        self.asset_distribution = asset_distribution
 128        self._set_asset_distribution_kwargs()
 129
 130        # pre-conditions given for the parameters (p.6-8)
 131        self._check_preconditions()
 132
 133    def _set_asset_distribution_kwargs(self) -> None:
 134        if self.asset_distribution is Distributions.UniformDistribution:
 135            self.asset_distribution_kwargs = {
 136                "loc": 0,
 137                "scale": self.development_costs,
 138            }
 139        else:
 140            self.asset_distribution_kwargs = {}
 141
 142    def _check_preconditions(self):
 143        self._check_merger_policy()
 144        # preconditions given (p.6-8)
 145        assert self.private_benefit > 0, "Private benefit has to be bigger than 0"
 146        assert (
 147            0 < self.success_probability <= 1
 148        ), "Success probability of development has to be between 0 and 1"
 149        assert (
 150            0 < self.startup_assets < self.development_costs
 151        ), "Startup has not enough assets for development"
 152        assert (
 153            self.incumbent_profit_without_innovation > self.incumbent_profit_duopoly
 154        ), "Profit of the incumbent has to be bigger without the innovation than in the duopoly"
 155        assert (
 156            self.incumbent_profit_with_innovation
 157            > self.incumbent_profit_without_innovation
 158        ), "Profit of the incumbent has to be bigger with the innovation than without the innovation"
 159        assert (
 160            self.cs_with_innovation >= self.cs_without_innovation
 161        ), "Consumer surplus with the innovation has to weakly bigger than without the innovation"
 162        assert (
 163            self.w_without_innovation < self.w_with_innovation < self.w_duopoly
 164        ), "Ranking of total welfare not valid (p.7)"
 165        assert (
 166            self.development_success is not None
 167        ), "Development success is not optional"
 168        self._check_assumption_one()
 169        self._check_assumption_two()
 170        self._check_assumption_three()
 171        self._check_assumption_four()
 172        self._check_assumption_five()
 173
 174    def _check_merger_policy(self):
 175        assert self._merger_policy is not None
 176
 177    def _check_assumption_five(self):
 178        assert (
 179            self.private_benefit - self.development_costs
 180            < 0
 181            < self.private_benefit
 182            - (
 183                self.success_probability * self._startup_profit_duopoly
 184                - self.development_costs
 185            )
 186        ), "A5 not satisfied (p.8)"
 187
 188    def _check_assumption_four(self):
 189        assert (
 190            self._success_probability
 191            * (self.w_with_innovation - self.w_without_innovation)
 192            > self._development_costs
 193        ), "A4 not satisfied (p.8)"
 194
 195    def _check_assumption_three(self):
 196        assert (
 197            self.success_probability * self.startup_profit_duopoly
 198            > self._development_costs
 199        ), "A3 not satisfied (p.8)"
 200
 201    def _check_assumption_two(self):
 202        assert (
 203            self.startup_profit_duopoly
 204            > self.incumbent_profit_with_innovation
 205            - self.incumbent_profit_without_innovation
 206        ), "A2 not satisfied (p.7)"
 207
 208    def _check_assumption_one(self):
 209        assert (
 210            self.incumbent_profit_with_innovation
 211            > self.incumbent_profit_duopoly + self.startup_profit_duopoly
 212        ), "A1 not satisfied (p.7)"
 213
 214    def _recalculate_model(self) -> None:
 215        """
 216        Organizes the recalculation of the model after a property changed value.
 217        """
 218        self._check_preconditions()
 219
 220    @property
 221    def development_costs(self) -> float:
 222        """
 223        ($K$) Fixed costs to invest for development.
 224        """
 225        return self._development_costs
 226
 227    @development_costs.setter
 228    def development_costs(self, value: float) -> None:
 229        self._development_costs = value
 230        self._recalculate_model()
 231
 232    @property
 233    def startup_assets(self) -> float:
 234        """
 235        ($A$) Assets of the startup at the beginning.
 236        """
 237        return self._startup_assets
 238
 239    @startup_assets.setter
 240    def startup_assets(self, value: float) -> None:
 241        self._startup_assets = value
 242        self._recalculate_model()
 243
 244    @property
 245    def success_probability(self) -> float:
 246        """
 247        ($p$) Probability of success in case of effort (otherwise the projects fails for sure).
 248        """
 249        return self._success_probability
 250
 251    @success_probability.setter
 252    def success_probability(self, value: float) -> None:
 253        self._success_probability = value
 254        self._recalculate_model()
 255
 256    @property
 257    def development_success(self) -> bool:
 258        """
 259        Decides whether an attempted development will be successful.
 260
 261        If true, every attempted development will be successful.
 262        """
 263        return self._development_success
 264
 265    @development_success.setter
 266    def development_success(self, value: bool) -> None:
 267        self._development_success = value
 268        self._recalculate_model()
 269
 270    @property
 271    def private_benefit(self) -> float:
 272        """
 273        ($B$) Private benefit of the entrepreneur in case of failure.
 274        """
 275        return self._private_benefit
 276
 277    @private_benefit.setter
 278    def private_benefit(self, value: float) -> None:
 279        self._private_benefit = value
 280        self._recalculate_model()
 281
 282    @property
 283    def incumbent_profit_with_innovation(self):
 284        """
 285        ($\\pi^M_I$) Profit of the monopolist with multiple products (with innovation).
 286        """
 287        return self._incumbent_profit_with_innovation
 288
 289    @incumbent_profit_with_innovation.setter
 290    def incumbent_profit_with_innovation(self, value: float) -> None:
 291        self._incumbent_profit_with_innovation = value
 292        self._recalculate_model()
 293
 294    @property
 295    def cs_with_innovation(self) -> float:
 296        """
 297        ($CS^M$) Consumer surplus for the case that the innovation is introduced by the incumbent into the market.
 298        """
 299        return self._cs_with_innovation
 300
 301    @cs_with_innovation.setter
 302    def cs_with_innovation(self, value: float) -> None:
 303        self._cs_with_innovation = value
 304        self._recalculate_model()
 305
 306    @property
 307    def w_with_innovation(self) -> float:
 308        """
 309        ($W^M$) Total welfare for the case that the innovation is introduced by the incumbent into the market.
 310        """
 311        return self._cs_with_innovation + self._incumbent_profit_with_innovation
 312
 313    @property
 314    def incumbent_profit_without_innovation(self) -> float:
 315        """
 316        ($\\pi^m_I$) Profit of the monopolist with a single product (without innovation).
 317        """
 318        return self._incumbent_profit_without_innovation
 319
 320    @incumbent_profit_without_innovation.setter
 321    def incumbent_profit_without_innovation(self, value: float) -> None:
 322        self._incumbent_profit_without_innovation = value
 323        self._recalculate_model()
 324
 325    @property
 326    def cs_without_innovation(self) -> float:
 327        """
 328        ($CS^m$) Consumer surplus for the case that the innovation is not introduced by the incumbent into the market.
 329        """
 330        return self._cs_without_innovation
 331
 332    @cs_without_innovation.setter
 333    def cs_without_innovation(self, value: float) -> None:
 334        self._cs_without_innovation = value
 335        self._recalculate_model()
 336
 337    @property
 338    def w_without_innovation(self) -> float:
 339        """
 340        ($W^m$) Total welfare for the case that the innovation is not introduced by the incumbent into the market.
 341        """
 342        return self._cs_without_innovation + self._incumbent_profit_without_innovation
 343
 344    @property
 345    def startup_profit_duopoly(self) -> float:
 346        """
 347        ($\\pi^d_S$) Profit of the startup in the case of a duopoly.
 348        """
 349        return self._startup_profit_duopoly
 350
 351    @startup_profit_duopoly.setter
 352    def startup_profit_duopoly(self, value: float) -> None:
 353        self._startup_profit_duopoly = value
 354        self._recalculate_model()
 355
 356    @property
 357    def incumbent_profit_duopoly(self) -> float:
 358        """
 359        ($\\pi^d_I$) Profit of the incumbent in the case of a duopoly.
 360        """
 361        return self._incumbent_profit_duopoly
 362
 363    @incumbent_profit_duopoly.setter
 364    def incumbent_profit_duopoly(self, value: float) -> None:
 365        self._incumbent_profit_duopoly = value
 366        self._recalculate_model()
 367
 368    @property
 369    def cs_duopoly(self) -> float:
 370        """
 371        ($CS^d$) Consumer surplus for the case that the innovation is introduced into the market and a duopoly exists.
 372        """
 373        return self._cs_duopoly
 374
 375    @cs_duopoly.setter
 376    def cs_duopoly(self, value: float) -> None:
 377        self._cs_duopoly = value
 378        self._recalculate_model()
 379
 380    @property
 381    def w_duopoly(self) -> float:
 382        """
 383        ($W^d$) Total welfare for the case that the innovation is introduced into the market and a duopoly exists.
 384        """
 385        return (
 386            self._cs_duopoly
 387            + self._startup_profit_duopoly
 388            + self._incumbent_profit_duopoly
 389        )
 390
 391
 392class MergerPolicy(CoreModel):
 393    """
 394    In this class all merger policies and their respective outcomes are calculated.
 395
 396    The available merger policies are documented in Fumagalli_Motta_Tarantino_2020.Types.MergerPolicies.
 397    """
 398
 399    def __init__(self, *args, **kwargs):
 400        """
 401        Takes the same arguments as Fumagalli_Motta_Tarantino_2020.Models.Base.CoreModel.__init__.
 402        """
 403        super(MergerPolicy, self).__init__(*args, **kwargs)
 404        self._probability_credit_constrained_default: float = 0
 405        self._probability_credit_constrained_merger_policy: float = 0
 406
 407        self._early_bid_attempt: Optional[Types.Takeover] = None
 408        self._late_bid_attempt: Optional[Types.Takeover] = None
 409        self._early_takeover: Optional[bool] = None
 410        self._late_takeover: Optional[bool] = None
 411
 412        self._check_asset_distribution_thresholds()
 413        self._solve_game()
 414
 415    def _check_asset_distribution_thresholds(self) -> None:
 416        """
 417        Checks the asset distributions thresholds on validity.
 418
 419        Every threshold has to be between 0 and 1. If this condition is not satisfied, an assertion error is raised.
 420        """
 421        assert (
 422            0 < self.asset_distribution_threshold_profitable_without_late_takeover < 1
 423        ), "Violates A.2 (has to be between 0 and 1)"
 424        if self.merger_policy is Types.MergerPolicies.Strict:
 425            self._check_asset_distribution_threshold_strict()
 426        elif (
 427            self.merger_policy
 428            is Types.MergerPolicies.Intermediate_late_takeover_prohibited
 429            and self.is_incumbent_expected_to_shelve()
 430        ):
 431            assert (
 432                0
 433                <= self.asset_distribution_threshold_unprofitable_without_late_takeover
 434                < 1
 435            ), "Violates Condition A-3 (has to be between 0 and 1)"
 436        elif (
 437            self.merger_policy is Types.MergerPolicies.Laissez_faire
 438            and self.is_incumbent_expected_to_shelve()
 439        ):
 440            assert (
 441                0 < self.asset_distribution_threshold_with_late_takeover < 1
 442            ), "Violates Condition 4 (has to be between 0 and 1)"
 443
 444    def _check_asset_distribution_threshold_strict(self):
 445        assert (
 446            0 < self.asset_distribution_threshold_welfare < 1
 447        ), "Violates Condition 2 (has to be between 0 and 1)"
 448
 449    @property
 450    def merger_policy(
 451        self,
 452    ) -> Types.MergerPolicies:
 453        """
 454        Returns the merger policy used to determine the outcome, given by the thresholds for tolerated harm.
 455
 456        The levels of tolerated harm are defined in A.4 (p.36ff.). See Fumagalli_Motta_Tarantino_2020.Types.MergerPolicies
 457        for the available merger policies.
 458        """
 459        return self._merger_policy
 460
 461    @merger_policy.setter
 462    def merger_policy(self, merger_policy: Types.MergerPolicies) -> None:
 463        self._merger_policy = merger_policy
 464        self._check_merger_policy()
 465        self._recalculate_model()
 466
 467    @property
 468    def tolerated_harm(self) -> float:
 469        """
 470        ($\\bar{H}$) The AA commits at the beginning of the game to a merger policy. The tolerated harm is the maximal loss of welfare the AA is ready to accept.
 471        """
 472        if self.merger_policy is Types.MergerPolicies.Strict:
 473            return self._calculate_h0()
 474        if (
 475            self.merger_policy
 476            is Types.MergerPolicies.Intermediate_late_takeover_prohibited
 477        ):
 478            return self._calculate_h1()
 479        if (
 480            self.merger_policy
 481            is Types.MergerPolicies.Intermediate_late_takeover_allowed
 482        ):
 483            return self._calculate_h2()
 484        return float("inf")
 485
 486    @property
 487    def asset_threshold(self) -> float:
 488        """
 489        Threshold level $\\bar{A} = B - (\\pi^d_S - K)$
 490        """
 491        return self.private_benefit - (
 492            self.success_probability * self.startup_profit_duopoly
 493            - self.development_costs
 494        )
 495
 496    @property
 497    def asset_threshold_cdf(self) -> float:
 498        """
 499        Returns the value of the continuous distribution function for the asset threshold.
 500        """
 501        return self.asset_distribution.cumulative(
 502            self.asset_threshold, **self.asset_distribution_kwargs
 503        )
 504
 505    @property
 506    def asset_threshold_late_takeover(self) -> float:
 507        """
 508        The prospect that the start-up will be acquired at $t = 2$ alleviates financial constraints: there exists a
 509        threshold level $\\bar{A}^T = B - (\\pi_I^M - K)$
 510        """
 511        return self.private_benefit - (
 512            self.success_probability * self.incumbent_profit_with_innovation
 513            - self.development_costs
 514        )
 515
 516    @property
 517    def asset_threshold_late_takeover_cdf(self) -> float:
 518        """
 519        Returns the value of the continuous distribution function for the asset threshold under laissez-faire.
 520        """
 521        return self.asset_distribution.cumulative(
 522            self.asset_threshold_late_takeover, **self.asset_distribution_kwargs
 523        )
 524
 525    @CoreModel.startup_assets.setter
 526    def startup_assets(self, value: float) -> None:
 527        CoreModel.startup_assets.fset(self, value)
 528        self._recalculate_model()
 529
 530    @property
 531    def early_bidding_type(self) -> Types.Takeover:
 532        """
 533        Returns the bidding attempt of the incumbent at $t = 1$.
 534
 535        See Fumagalli_Motta_Tarantino_2020.Types.Takeover for the available options.
 536        """
 537        assert self._early_bid_attempt is not None
 538        return self._early_bid_attempt
 539
 540    @property
 541    def late_bidding_type(self) -> Types.Takeover:
 542        """
 543        Returns the bidding attempt of the incumbent at $t = 2$.
 544
 545        See Fumagalli_Motta_Tarantino_2020.Types.Takeover for the available options.
 546        """
 547        assert self._late_bid_attempt is not None
 548        return self._late_bid_attempt
 549
 550    @property
 551    def is_early_takeover(self) -> bool:
 552        """
 553        Returns whether the start-up is acquired by the incumbent at $t=1$.
 554
 555        Returns
 556        -------
 557        True
 558            If the start-up is acquired by the incumbent at $t=1$.
 559        """
 560        assert self._early_takeover is not None
 561        return self._early_takeover
 562
 563    @property
 564    def is_late_takeover(self) -> bool:
 565        """
 566        Returns whether the start-up is acquired by the incumbent at $t=2$.
 567
 568        Returns
 569        -------
 570        True
 571            If the start-up is acquired by the incumbent at $t=2$.
 572        """
 573        assert self._late_takeover is not None
 574        return self._late_takeover
 575
 576    @property
 577    def is_owner_investing(self) -> bool:
 578        """
 579        A start-up that expects external investors to deny financing will not undertake the investment. Conversely, the incumbent
 580        has the financial ability to invest, but it does not always have the incentive to do so. Indeed, the innovation
 581        increases the incumbent’s profits less than the (unconstrained) start-up’s. (This result follows directly from
 582        the Arrow’s replacement effect) The increase in the incumbent’s profits may not be large enough to cover the investment
 583        cost. When this is the case, the incumbent will shelve the project and the acquisition turns out to be a killer acquisition.
 584
 585        Investment decision under the strict merger policy:
 586        - An unconstrained start-up always invests in the development of the prototype.
 587        - The incumbent invests if (and only if): $p*(\\pi^M_I-\\pi^m_I) \\ge K$
 588
 589        Returns
 590        -------
 591        True
 592            If the owner of the innovation at $t=1$ invests in the project, instead of shelving.
 593        """
 594        assert self.is_startup_credit_rationed is not None
 595        assert self.is_early_takeover is not None
 596        if (not self.is_startup_credit_rationed and not self.is_early_takeover) or (
 597            not self.is_incumbent_expected_to_shelve() and self.is_early_takeover
 598        ):
 599            return True
 600        return False
 601
 602    @property
 603    def is_development_successful(self) -> bool:
 604        """
 605        Returns whether the development was successful or not.
 606
 607        The following two conditions have to be satisfied:
 608        - The owner of the product at $t=1$ has to invest in the development
 609        - The development success variable has to be set to True (attempted development always successful).
 610
 611        Returns
 612        -------
 613        True
 614            If both conditions are met.
 615        """
 616        assert self.is_owner_investing is not None
 617        return self.is_owner_investing and self._development_success
 618
 619    @property
 620    def is_startup_credit_rationed(self) -> bool:
 621        """
 622        If no takeover took place at t = 1(b), a start-up that decided to develop the project searches for funding at $t = 1(d)$.
 623
 624        Strict and Intermediate (late takeover prohibited):
 625        - $A < \\bar{A}$, the start-up is credit-rationed and cannot invest.
 626        - $A \\ge \\bar{A}$, the start-up obtains external funding.
 627
 628        Laissez-Faire and Intermediate (late takeover allowed):
 629        - $A < \\bar{A}^T$, the start-up is credit-rationed and cannot invest.
 630        - $A \\ge \\bar{A}^T$, the start-up obtains external funding.
 631
 632        Returns
 633        -------
 634        True
 635            If the start-up is credit rationed.
 636        """
 637        # financial contracting (chapter 3.2)
 638        if self.merger_policy in [
 639            Types.MergerPolicies.Strict,
 640            Types.MergerPolicies.Intermediate_late_takeover_prohibited,
 641        ]:
 642            if self.startup_assets < self.asset_threshold:
 643                return True
 644            return False
 645        if self.startup_assets < self.asset_threshold_late_takeover:
 646            return True
 647        return False
 648
 649    @property
 650    def asset_distribution_threshold_welfare(self) -> float:
 651        """
 652        Threshold defined in Lemma 3 :$\\;\\Gamma(\\cdot)=\\frac{p(W^d-W^M)}{p(W^d-W^m)-K}$
 653        """
 654        return (
 655            self.success_probability * (self.w_duopoly - self.w_with_innovation)
 656        ) / (
 657            self.success_probability * (self.w_duopoly - self.w_without_innovation)
 658            - self.development_costs
 659        )
 660
 661    @property
 662    def asset_distribution_threshold_profitable_without_late_takeover(self) -> float:
 663        """
 664        Threshold defined in Condition 3 :$\\;\\Phi(\\cdot)=\\frac{p(\\pi^M_I-\\pi^d_I-\\pi^d_S)}{p(\\pi^M_I-\\pi^d_I)-K}$
 665        """
 666        return (
 667            self.success_probability
 668            * (
 669                self.incumbent_profit_with_innovation
 670                - self.incumbent_profit_duopoly
 671                - self.startup_profit_duopoly
 672            )
 673        ) / (
 674            self.success_probability
 675            * (self.incumbent_profit_with_innovation - self.incumbent_profit_duopoly)
 676            - self.development_costs
 677        )
 678
 679    @property
 680    def asset_distribution_threshold_with_late_takeover(self) -> float:
 681        """
 682        Threshold defined in Condition 4 :$\\;\\Phi^T(\\cdot)=\\frac{p(\\pi^m_I-\\pi^M_I)+K}{p(\\pi^m_I+\\pi^d_S-\\pi^M_I)}$
 683        """
 684        return (
 685            self.success_probability
 686            * (
 687                self.incumbent_profit_without_innovation
 688                - self.incumbent_profit_with_innovation
 689            )
 690            + self.development_costs
 691        ) / (
 692            self.success_probability
 693            * (
 694                self.incumbent_profit_without_innovation
 695                + self.startup_profit_duopoly
 696                - self.incumbent_profit_with_innovation
 697            )
 698        )
 699
 700    @property
 701    def asset_distribution_threshold_unprofitable_without_late_takeover(self) -> float:
 702        """
 703        Threshold defined in A-3 :$\\;\\Phi^{\\prime}(\\cdot)=\\frac{p(\\pi^m_I-\\pi^d_I-\\pi^d_S)+K}{p(\\pi^m_I+\\pi^d_I)}$
 704        """
 705        return (
 706            self.success_probability
 707            * (
 708                self.incumbent_profit_without_innovation
 709                - self.incumbent_profit_duopoly
 710                - self.startup_profit_duopoly
 711            )
 712            + self.development_costs
 713        ) / (
 714            self.success_probability
 715            * (self.incumbent_profit_without_innovation - self.incumbent_profit_duopoly)
 716        )
 717
 718    def is_incumbent_expected_to_shelve(self) -> bool:
 719        """
 720        Returns whether the incumbent is expected to shelve, whenever it acquires the entrant (Condition 1).
 721
 722        - True (expected to shelve): $p*(\\pi^M_I-\\pi^m_I) < K$
 723
 724        - False (not expected to shelve): $p*(\\pi^M_I-\\pi^m_I) \\ge K$
 725
 726        """
 727        return self.incumbent_expected_additional_profit_from_innovation() < 0
 728
 729    def incumbent_expected_additional_profit_from_innovation(self) -> float:
 730        """
 731        Returns the additional expected profit for the incumbent, if it does not shelve the product after an acquisition.
 732
 733        $ Expected \\; additional \\; profit = p*(\\pi^M_I-\\pi^m_I)-K$
 734        """
 735        return (
 736            self.success_probability
 737            * (
 738                self.incumbent_profit_with_innovation
 739                - self.incumbent_profit_without_innovation
 740            )
 741            - self.development_costs
 742        )
 743
 744    def _calculate_h0(self) -> float:
 745        """
 746        Calculates the minimal threshold of tolerated harm to achieve for an intermediate merger policy (late takeover prohibited).
 747        """
 748        return max(
 749            (1 - self.asset_threshold_cdf)
 750            * (self.success_probability * (self.w_duopoly - self.w_with_innovation))
 751            - self.asset_threshold_cdf
 752            * (
 753                self.success_probability
 754                * (self.w_with_innovation - self.w_without_innovation)
 755                - self.development_costs
 756            ),
 757            0,
 758        )
 759
 760    def _calculate_h1(self) -> float:
 761        """
 762        Calculates the minimal threshold of tolerated harm to achieve for an intermediate merger policy (late takeover allowed).
 763        """
 764        return (1 - self.asset_threshold_cdf) * (
 765            self.success_probability * (self.w_duopoly - self.w_without_innovation)
 766            - self.development_costs
 767        )
 768
 769    def _calculate_h2(self) -> float:
 770        """
 771        Calculates the minimal threshold of tolerated harm to achieve for a laissez-faire merger policy.
 772        """
 773        return max(
 774            self.w_duopoly - self.w_with_innovation,
 775            (1 - self.asset_threshold_late_takeover_cdf)
 776            * (
 777                self.success_probability
 778                * (self.w_with_innovation - self.w_without_innovation)
 779                - self.development_costs
 780            ),
 781        )
 782
 783    def _solve_game(self) -> None:
 784        """
 785        Solves the game according to the set Fumagalli_Motta_Tarantino_2020.Types.MergerPolicies.
 786        """
 787        if self.merger_policy is Types.MergerPolicies.Strict:
 788            self._solve_game_strict_merger_policy()
 789        elif (
 790            self.merger_policy
 791            is Types.MergerPolicies.Intermediate_late_takeover_prohibited
 792        ):
 793            self._solve_game_late_takeover_prohibited()
 794        elif (
 795            self.merger_policy
 796            is Types.MergerPolicies.Intermediate_late_takeover_allowed
 797        ):
 798            self._solve_game_late_takeover_allowed()
 799        else:
 800            self._solve_game_laissez_faire()
 801
 802    def _recalculate_model(self) -> None:
 803        """
 804        Organizes the recalculation of the model after a property changed value.
 805        """
 806        self._reset_takeovers()
 807        super(MergerPolicy, self)._recalculate_model()
 808        self._solve_game()
 809
 810    def _reset_takeovers(self):
 811        self._early_bid_attempt = None
 812        self._late_bid_attempt = None
 813        self._early_takeover = None
 814        self._late_takeover = None
 815
 816    def _solve_game_laissez_faire(self) -> None:
 817        """
 818        Solves the game under a laissez-faire merger policy, based on section 4 in the paper.
 819        """
 820        assert self.merger_policy is Types.MergerPolicies.Laissez_faire
 821        if self.is_incumbent_expected_to_shelve():
 822            if (
 823                self.asset_threshold_late_takeover_cdf
 824                >= self.asset_distribution_threshold_with_late_takeover
 825            ):
 826                if not self.is_startup_credit_rationed and self.development_success:
 827                    self._set_takeovers(late_takeover=Types.Takeover.Pooling)
 828                else:
 829                    self._set_takeovers(
 830                        early_takeover=Types.Takeover.No,
 831                        late_takeover=Types.Takeover.No,
 832                    )
 833            else:
 834                self._set_takeovers(early_takeover=Types.Takeover.Pooling)
 835        else:
 836            if self.is_startup_credit_rationed:
 837                self._set_takeovers(early_takeover=Types.Takeover.Separating)
 838            else:
 839                if self.development_success:
 840                    self._set_takeovers(
 841                        early_takeover=Types.Takeover.Separating,
 842                        early_takeover_accepted=False,
 843                        late_takeover=Types.Takeover.Pooling,
 844                    )
 845                else:
 846                    self._set_takeovers(
 847                        early_takeover=Types.Takeover.Separating,
 848                        early_takeover_accepted=False,
 849                        late_takeover=Types.Takeover.No,
 850                    )
 851
 852    def _solve_game_late_takeover_allowed(self) -> None:
 853        """
 854        Solves the game under an intermediate merger policy (late takeover allowed), based on section 5.2 in the paper.
 855        """
 856        assert (
 857            self.merger_policy
 858            is Types.MergerPolicies.Intermediate_late_takeover_allowed
 859        )
 860        if self.is_incumbent_expected_to_shelve():
 861            if not self.is_startup_credit_rationed and self.development_success:
 862                self._set_takeovers(late_takeover=Types.Takeover.Pooling)
 863            else:
 864                self._set_takeovers(
 865                    early_takeover=Types.Takeover.No, late_takeover=Types.Takeover.No
 866                )
 867        else:
 868            if self.is_startup_credit_rationed:
 869                self._set_takeovers(early_takeover=Types.Takeover.Separating)
 870            else:
 871                if self.development_success:
 872                    self._set_takeovers(
 873                        early_takeover=Types.Takeover.Separating,
 874                        early_takeover_accepted=False,
 875                        late_takeover=Types.Takeover.Pooling,
 876                    )
 877                else:
 878                    self._set_takeovers(
 879                        early_takeover=Types.Takeover.Separating,
 880                        early_takeover_accepted=False,
 881                    )
 882
 883    def _solve_game_late_takeover_prohibited(self) -> None:
 884        """
 885        Solves the game under an intermediate merger policy (late takeover prohibited),
 886        based on section 5.1 in the paper.
 887        """
 888        assert (
 889            self.merger_policy
 890            is Types.MergerPolicies.Intermediate_late_takeover_prohibited
 891        )
 892        if self.is_incumbent_expected_to_shelve():
 893            if (
 894                self.asset_threshold_cdf
 895                >= self.asset_distribution_threshold_unprofitable_without_late_takeover
 896            ):
 897                self._set_takeovers(
 898                    early_takeover=Types.Takeover.No, late_takeover=Types.Takeover.No
 899                )
 900            else:
 901                self._set_takeovers(early_takeover=Types.Takeover.Pooling)
 902        else:
 903            if (
 904                self.asset_threshold_cdf
 905                >= self.asset_distribution_threshold_profitable_without_late_takeover
 906            ):
 907                if self.is_startup_credit_rationed:
 908                    self._set_takeovers(early_takeover=Types.Takeover.Separating)
 909                else:
 910                    self._set_takeovers(
 911                        early_takeover=Types.Takeover.Separating,
 912                        early_takeover_accepted=False,
 913                    )
 914            else:
 915                self._set_takeovers(Types.Takeover.Pooling)
 916
 917    def _solve_game_strict_merger_policy(self) -> None:
 918        """
 919        Solves the game under a strict merger policy, based on section 3 in the paper.
 920        """
 921        assert self.merger_policy is Types.MergerPolicies.Strict
 922        if self.is_incumbent_expected_to_shelve():
 923            self._set_takeovers(
 924                early_takeover=Types.Takeover.No, late_takeover=Types.Takeover.No
 925            )
 926        else:
 927            if (
 928                self.asset_distribution_threshold_welfare
 929                < self.asset_threshold_cdf
 930                < max(
 931                    self.asset_distribution_threshold_profitable_without_late_takeover,
 932                    self.asset_distribution_threshold_welfare,
 933                )
 934            ):
 935                self._set_takeovers(early_takeover=Types.Takeover.Pooling)
 936            else:
 937                if self.is_startup_credit_rationed:
 938                    self._set_takeovers(early_takeover=Types.Takeover.Separating)
 939                else:
 940                    self._set_takeovers(
 941                        early_takeover=Types.Takeover.Separating,
 942                        early_takeover_accepted=False,
 943                    )
 944
 945    def _set_takeovers(
 946        self,
 947        early_takeover: Types.Takeover = Types.Takeover.No,
 948        late_takeover: Types.Takeover = Types.Takeover.No,
 949        early_takeover_accepted=True,
 950        late_takeover_accepted=True,
 951    ) -> None:
 952        """
 953        Sets the takeover variables of the class.
 954
 955        Parameters
 956        ----------
 957        early_takeover: Fumagalli_Motta_Tarantino_2020.Types.Takeover
 958            Type of the early bid attempt/takeover (if existing).
 959        late_takeover: Fumagalli_Motta_Tarantino_2020.Types.Takeover
 960            Type of the early bid attempt/takeover (if existing).
 961        early_takeover_accepted: bool
 962            If true, the early takeover comes through, otherwise the takeover is blocked by AA or the start-up.
 963        late_takeover_accepted
 964            If true, the late takeover comes through, otherwise the takeover is blocked by AA or the start-up.
 965        """
 966        assert self._early_bid_attempt is None and self._early_takeover is None
 967        assert self._late_bid_attempt is None and self._late_takeover is None
 968        assert not (
 969            early_takeover in [Types.Takeover.Separating, Types.Takeover.Pooling]
 970            and early_takeover_accepted
 971            and late_takeover in [Types.Takeover.Separating, Types.Takeover.Pooling]
 972            and late_takeover_accepted
 973        ), "Only one takeover can occur."
 974        self._early_takeover = (
 975            False
 976            if early_takeover is Types.Takeover.No or not early_takeover_accepted
 977            else True
 978        )
 979        self._early_bid_attempt = early_takeover
 980        self._late_takeover = (
 981            False
 982            if late_takeover is Types.Takeover.No or not late_takeover_accepted
 983            else True
 984        )
 985        self._late_bid_attempt = late_takeover
 986
 987    def summary(self) -> Types.Summary:
 988        """
 989        Returns the calculated outcome of the model with the defined parameters.
 990
 991        The resulting dictionary contains the following information (and keys):
 992        - 'set_policy' : Fumagalli_Motta_Tarantino_2020.Types.MergerPolicies -> Defines the chosen merger policy based on the tolerated level of harm.
 993        - 'credit_rationed' : True, if the start-up is credit rationed.
 994        - 'early_bidding_type' : Fumagalli_Motta_Tarantino_2020.Types.Takeover -> Defines the bidding type of the incumbent at t=1.
 995        - 'late_bidding_type' : 'Fumagalli_Motta_Tarantino_2020.Types.Takeover -> Defines the bidding type of the incumbent at t=2.
 996        - 'development_attempt' : True, if the owner (start-up or incumbent after a takeover) tries to develop the product.
 997        - 'development_outcome' : True, if the product is developed successfully.
 998        - 'early_takeover' : True, if a takeover takes place at $t=1$.
 999        - 'late_takeover' : True, if a takeover takes place at $t=2$.
1000
1001        Returns
1002        -------
1003        Fumagalli_Motta_Tarantino_2020.Types.Summary
1004            Containing the result of the model with the defined parameters.
1005        """
1006        return Types.Summary(
1007            set_policy=self.merger_policy,
1008            credit_rationed=self.is_startup_credit_rationed,
1009            early_bidding_type=self.early_bidding_type,
1010            late_bidding_type=self.late_bidding_type,
1011            development_attempt=self.is_owner_investing,
1012            development_outcome=self.is_development_successful,
1013            early_takeover=self.is_early_takeover,
1014            late_takeover=self.is_late_takeover,
1015        )
1016
1017    def is_killer_acquisition(self) -> bool:
1018        """
1019        Returns whether a killer acquisition occurred in the model.
1020
1021        For a killer acquisition to take place the following condition have to satisfied:
1022        - An early takeover takes place
1023        - The incumbent does not develop the product
1024
1025        Returns
1026        -------
1027        True
1028            if a killer acquisition occurred in the model.
1029        """
1030        return self.is_early_takeover and not self.is_owner_investing
1031
1032    def __str__(self) -> str:
1033        return (
1034            f"Merger Policy: {self.merger_policy}\n"
1035            f"Is start-up credit rationed?: {self.is_startup_credit_rationed}\n"
1036            f"Type of early takeover attempt: {self.early_bidding_type}\n"
1037            f"Is the early takeover approved?: {self.is_early_takeover}\n"
1038            f"Does the owner attempt the development?: {self.is_owner_investing}\n"
1039            f"Is the development successful?: {self.is_development_successful}\n"
1040            f"Type of late takeover attempt: {self.late_bidding_type}\n"
1041            f"Is the late takeover approved?: {self.is_late_takeover}"
1042        )
1043
1044
1045class OptimalMergerPolicy(MergerPolicy):
1046    """
1047    Add functionality to determine the optimal merger policy for a given set of parameters.
1048
1049    Annotation: As discussed in section 5.1, a policy that is more lenient with respect to early acquisitions is always
1050    dominated by a strict merger policy. Therefore, only the three remaining policies are discussed.
1051    """
1052
1053    def __init__(self, *args, **kwargs):
1054        super(OptimalMergerPolicy, self).__init__(*args, **kwargs)
1055
1056    def get_optimal_merger_policy(
1057        self,
1058    ) -> Types.MergerPolicies:
1059        """
1060        A strict merger policy is always optimal when the incumbent is expected to invest. When the incumbent is expected
1061        to shelve, a more lenient policy (that either authorises any type of takeover, or that blocks early takeovers when
1062        the incumbent makes a pooling bid and plans to shelve, and authorises late takeovers) may be optimal, but under the
1063        cumulative conditions indicated in proposition 4.
1064
1065        See: OptimalMergerPolicy.is_laissez_faire_optimal, OptimalMergerPolicy.is_intermediate_optimal and OptimalMergerPolicy.is_strict_optimal
1066
1067        """
1068        if self.is_laissez_faire_optimal():
1069            return Types.MergerPolicies.Laissez_faire
1070        if self.is_intermediate_optimal():
1071            return self._get_intermediate_optimal_candidate()
1072        return Types.MergerPolicies.Strict
1073
1074    @staticmethod
1075    def _get_intermediate_optimal_candidate() -> Types.MergerPolicies:
1076        return Types.MergerPolicies.Intermediate_late_takeover_allowed
1077
1078    def is_laissez_faire_optimal(self) -> bool:
1079        """
1080        Returns whether a laissez-faire policy is optimal.
1081
1082        A laissez-faire policy (that authorises any takeover) is optimal, if:
1083        1. Incumbent is expected to shelve ($p(\\pi^M_I-\\pi^m_I) < K$).
1084        2. Financial imperfections are severe ($F(\\bar{A}^T)\\ge\\Phi^T(\\cdot)$).
1085        3. Approving early takeovers followed by shelving is optimal ($F(\\bar{A}^T)\\ge\\Lambda(\\cdot)$).
1086        4. Detrimental effect of less intense product market competition is dominated by the benefit of making it more
1087        likely that the innovation is commercialised (Condition 6 not satisfied).
1088
1089        Returns
1090        -------
1091        True
1092            If a laissez-faire merger policy is optimal.
1093        """
1094        return (
1095            self.is_incumbent_expected_to_shelve()
1096            and self.is_financial_imperfection_severe()
1097            and not self.is_intermediate_policy_feasible()
1098            and not self.is_competition_effect_dominating()
1099        )
1100
1101    def is_intermediate_optimal(self) -> bool:
1102        """
1103        Returns whether an intermediate merger policy (late takeover allowed) is optimal.
1104
1105        An intermediate merger policy (late takeovers allowed) is optimal, if:
1106        1. Incumbent is expected to shelve ($p(\\pi^M_I-\\pi^m_I) < K$).
1107        2. Approving early takeovers followed by shelving is not optimal ($F(\\bar{A}^T) < \\Lambda(\\cdot)$).
1108        3. Detrimental effect of less intense product market competition is dominated by the benefit of making it more
1109        likely that the innovation is commercialised (Condition 6 not satisfied).
1110
1111        Returns
1112        -------
1113        True
1114            If an intermediate merger policy (late takeover allowed) is optimal.
1115        """
1116        return (
1117            self.is_incumbent_expected_to_shelve()
1118            and self.is_intermediate_policy_feasible()
1119            and not self.is_competition_effect_dominating()
1120        )
1121
1122    def is_strict_optimal(self) -> bool:
1123        """
1124        Returns whether the strict merger policy is optimal.
1125
1126        The strict merger is optimal, if the other policies are not optimal.
1127
1128        Returns
1129        -------
1130        True
1131            If the strict merger policy is optimal.
1132        """
1133        return not (self.is_intermediate_optimal() or self.is_laissez_faire_optimal())
1134
1135    def is_competition_effect_dominating(self) -> bool:
1136        """
1137        Condition 6: $\\frac{p(W^d-W^m)-K}{p(W^M-W^m)-K} \\ge \\frac{1-F(\\bar{A}^T)}{1-F(\\bar{A})}$
1138        """
1139        return (
1140            self.success_probability * (self.w_duopoly - self.w_without_innovation)
1141            - self.development_costs
1142        ) / (
1143            self.success_probability
1144            * (self.w_with_innovation - self.w_without_innovation)
1145            - self.development_costs
1146        ) >= (
1147            1 - self.asset_threshold_late_takeover_cdf
1148        ) / (
1149            1 - self.asset_threshold_cdf
1150        )
1151
1152    def is_financial_imperfection_severe(self) -> bool:
1153        """
1154        Returns whether financial imperfections are severe.
1155
1156        Returns
1157        -------
1158        True
1159            If the financial imperfections are severe.
1160        """
1161        return (
1162            self.asset_threshold_late_takeover_cdf
1163            >= self.asset_distribution_threshold_with_late_takeover
1164        )
1165
1166    def is_intermediate_policy_feasible(self) -> bool:
1167        """
1168        Returns whether an intermediate (with late takeovers) merger policy is feasible.
1169
1170        An intermediate policy, which authorizes late takeovers, is feasible if condition 5 is not satisfied.
1171
1172        Returns
1173        -------
1174        True
1175            If an intermediate policy is feasible.
1176        """
1177        return (
1178            self.asset_threshold_late_takeover_cdf
1179            < self.asset_distribution_threshold_shelving_approved
1180        )
1181
1182    @property
1183    def asset_distribution_threshold_shelving_approved(self) -> float:
1184        """
1185        Threshold defined in Condition 5 :$\\;\\Lambda(\\cdot)=\\frac{p(W^M-W^m)-K-(W^d-W^M)}{p(W^M-W^m)-K}$
1186        """
1187        return (
1188            self.success_probability
1189            * (self.w_with_innovation - self.w_without_innovation)
1190            - self.development_costs
1191            - (self.w_duopoly - self.w_with_innovation)
1192        ) / (
1193            self.success_probability
1194            * (self.w_with_innovation - self.w_without_innovation)
1195            - self.development_costs
1196        )
1197
1198    def summary(self) -> Types.OptimalMergerPolicySummary:
1199        """
1200        Returns the calculated outcome of the model with the defined parameters.
1201
1202        Additional information compared to Fumagalli_Motta_Tarantino_2020.Models.MergerPolicy.summary:
1203        - 'optimal_policy' : Fumagalli_Motta_Tarantino_2020.Types.MergerPolicies -> Defines the welfare maximizing merger policy.
1204
1205        Returns
1206        -------
1207        Fumagalli_Motta_Tarantino_2020.Types.OptimalMergerPolicySummary
1208            Containing the result of the model with the defined parameters.
1209        """
1210        return Types.OptimalMergerPolicySummary(
1211            set_policy=self.merger_policy,
1212            credit_rationed=self.is_startup_credit_rationed,
1213            early_bidding_type=self.early_bidding_type,
1214            late_bidding_type=self.late_bidding_type,
1215            development_attempt=self.is_owner_investing,
1216            development_outcome=self.is_development_successful,
1217            early_takeover=self.is_early_takeover,
1218            late_takeover=self.is_late_takeover,
1219            optimal_policy=self.get_optimal_merger_policy(),
1220        )
1221
1222    def __str__(self) -> str:
1223        return (
1224            super(OptimalMergerPolicy, self).__str__()
1225            + f"\nOptimal merger policy: {self.get_optimal_merger_policy()}"
1226        )
class CoreModel:
  8class CoreModel:
  9    """
 10    There are three players in our game: an Antitrust Authority (AA), which at the beginning of the game decides its
 11    merger policy; a monopolist $\t{I}$ncumbent; and a $\t{S}$tart-up. The start-up owns a “prototype” (or project)
 12    that, if developed, can give rise to an innovation: for instance a substitute/higher quality product to the
 13    incumbent’s existing product, or a more efficient production process. The start-up does not have enough own
 14    resources to develop the project. It has two options: it can either obtain additional funds from competitive
 15    capital markets, or sell out to the incumbent. The incumbent will have to decide whether and when it wants to
 16    acquire the start-up (and if it does so before product development, it has to decide whether to develop the
 17    prototype or shelve it), conditional on the AA’s approval of the acquisition. We assume that the takeover
 18    involves a negligible but positive transaction cost. The AA commits at the beginning of the game to a merger
 19    policy, in the form of a maximum threshold of “harm”, that it is ready to tolerate. Harm from a proposed merger
 20    consists of the difference between the expected welfare levels if the merger goes ahead, and in the counterfactual
 21    where it does not take place (derived of course by correctly anticipating the continuation equilibrium of the
 22    game). A proposed merger will be prohibited only if the tolerated harm level H is lower than the expected harm
 23    from the merger, if any.
 24
 25    Timing of the game:
 26
 27    | Time | Action                                                                                                                                                 |
 28    |------|--------------------------------------------------------------------------------------------------------------------------------------------------------|
 29    | 0    | The AA commits to the standard for merger approval, $\\bar{H}$.                                                                                        |
 30    | 1(a) | $\t{I}$ can make a takeover offer to $\t{S}$, which can accept or reject.                                                                              |
 31    | 1(b) | The AA approves or blocks the takeover proposal.                                                                                                       |
 32    | 1(c) | The firm ($\t{I}$ or $\t{S}$) that owns the prototype decides whether to develop or shelve it.                                                         |
 33    | 1(d) | The owner of the prototype engages in financial contracting (if needed). After that, uncertainty about the success or failure of the project resolves. |
 34    | 2(a) | $\t{I}$ can make a take-it-or-leave-it offer to $\t{S}$ (if it did not already buy it at t = 1, and if the development of the project was successful). |
 35    | 2(b) | The AA approves or blocks the takeover proposal.                                                                                                       |
 36    | 3    | Active firms sell in the product market, payoffs are realised and contracts are honored.                                                               |
 37    """
 38
 39    def __init__(
 40        self,
 41        merger_policy: Types.MergerPolicies = Types.MergerPolicies.Strict,
 42        development_costs: float = 0.1,
 43        startup_assets: float = 0.05,
 44        success_probability: float = 0.7,
 45        development_success: bool = True,
 46        private_benefit: float = 0.05,
 47        consumer_surplus_without_innovation: float = 0.2,
 48        incumbent_profit_without_innovation: float = 0.4,
 49        consumer_surplus_duopoly: float = 0.5,
 50        incumbent_profit_duopoly: float = 0.2,
 51        startup_profit_duopoly: float = 0.2,
 52        consumer_surplus_with_innovation: float = 0.3,
 53        incumbent_profit_with_innovation: float = 0.5,
 54        asset_distribution: Union[
 55            Distributions.NormalDistribution, Distributions.UniformDistribution
 56        ] = Distributions.NormalDistribution,
 57        **kwargs,
 58    ):
 59        """
 60        Initializes a valid base model according to the assumptions given in the paper.
 61
 62        The following assumptions have to be met:
 63
 64        | Condition                    | Remark                                                                                                                                                                                                                                                                                                                                                        | Page (Assumption) |
 65        |------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------|
 66        | $\\bar{H} \\ge 0$            | The tolerated level of harm has to be bigger than 0.                                                                                                                                                                                                                                                                                                          | p.6               |
 67        | $p \\in (0,1]$               | Probability that the prototype is developed successfully depends on the non-contractible effort exerted by the entrepreneur of the firm that owns the project. In case of no effort the project fails for sure, but the entrepreneur obtains a positive private benefit. In case of failure the project yields no profit.                                     | p.8               |
 68        | $B>0$                        | Private benefit of the entrepreneur in case of failure.                                                                                                                                                                                                                                                                                                       | p.8               |
 69        | $A \\in (0,K)$               | The startup does not hold sufficient assets at the beginning to cover the costs.                                                                                                                                                                                                                                                                              | p.8               |
 70        | $\\pi^m_I>\\pi^d_I$          | Profit of the incumbent has to be bigger without the innovation than in the duopoly.                                                                                                                                                                                                                                                                          | p.7               |
 71        | $\\pi^M_I>\\pi^m_I$          | Industry profits are higher with a multi-product monopolist than a single product monopolist (otherwise, the incumbent would always shelve).                                                                                                                                                                                                                                                                 | p.7               |
 72        | $CS^M \\ge CS^m$             | Consumer surplus with the innovation has to weakly bigger than without the innovation (consumers like variety).                                                                                                                                                                                                                                                                        | p.7               |
 73        | $\\pi^M_I>\\pi^d_I+\\pi^d_S$ | Industry profits are higher under monopoly than under duopoly. If this assumption did not hold, the takeover would not take place.                                                                                                                                                                                                                            | p.7 (A1)          |
 74        | $\\pi^d_S>\\pi^M_I-\\pi^m_I$ | An incumbent has less incentive to innovate (in a new/better product or a more efficient production process) than a potential entrant because the innovation would cannibalise the incumbent’s current profits. (Corresponds to Arrow's replacement effect)                                                                                                   | p.7 (A2)          |
 75        | $p\\pi^d_S>K$                | In case of effort it is efficient to develop the prototype, i.e., development has a positive net present value (NPV) for the start-up                                                                                                                                                                                                                         | p.8 (A3)          |
 76        | $p(W^M-W^m)>K$               | The development of the project is not only privately beneficial for the start-up, but also for society as a whole, whether undertaken by the incumbent or the start-up (implies $\\;p(W^d-W^m)>K\\;$).                                                                                                                                                                                       | p.8 (A4)          |
 77        | $B-K<0$$B-(p\\pi^d_S-K)>0$   | The first inequality implies that if S shirks the project has negative value; thus, no financial contract could be signed unless the startup makes effort. The second implies that the start-up may be financially constrained, that is, it may hold insufficient assets to fund the development of the prototype even though the project has a positive NPV. | p.8 (A5)          |
 78
 79        Parameters
 80        ----------
 81        development_costs : float
 82            ($K$) Fixed costs to invest for development.
 83        startup_assets : float
 84            ($A$) Assets of the startup at the beginning.
 85        success_probability : float
 86            ($p$) Probability of success in case of effort (otherwise the projects fails for sure).
 87        development_success : bool
 88            Decides whether an attempted development will be successful (true $\\rightarrow$ attempted development succeeds).
 89        private_benefit : float
 90            ($B$) Private benefit of the entrepreneur in case of failure.
 91        consumer_surplus_without_innovation : float
 92            ($CS^m$) Consumer surplus for the case that the innovation is not introduced by the incumbent into the market.
 93        incumbent_profit_without_innovation : float
 94            ($\\pi^m_I$) Profit of the monopolist with a single product (without innovation).
 95        consumer_surplus_duopoly : float
 96            ($CS^d$) Consumer surplus for the case that the innovation is introduced into the market and a duopoly exists.
 97        incumbent_profit_duopoly : float
 98            ($\\pi^d_I$) Profit of the incumbent in the case of a duopoly.
 99        startup_profit_duopoly : float
100            ($\\pi^d_S$) Profit of the startup in the case of a duopoly.
101        consumer_surplus_with_innovation : float
102             ($CS^M$) Consumer surplus for the case that the innovation is introduced by the incumbent into the market.
103        incumbent_profit_with_innovation : float
104            ($\\pi^M_I$) Profit of the monopolist with multiple products (with innovation).
105        """
106        self._merger_policy = merger_policy
107        self._development_costs = development_costs
108        self._startup_assets = startup_assets
109        self._success_probability = success_probability
110        self._development_success = development_success
111        self._private_benefit = private_benefit
112
113        # product market payoffs (p.6ff.)
114        # with innovation
115        self._incumbent_profit_with_innovation = incumbent_profit_with_innovation
116        self._cs_with_innovation = consumer_surplus_with_innovation
117
118        # without innovation
119        self._incumbent_profit_without_innovation = incumbent_profit_without_innovation
120        self._cs_without_innovation = consumer_surplus_without_innovation
121
122        # with duopoly
123        self._startup_profit_duopoly = startup_profit_duopoly
124        self._incumbent_profit_duopoly = incumbent_profit_duopoly
125        self._cs_duopoly = consumer_surplus_duopoly
126
127        # set asset distribution
128        self.asset_distribution = asset_distribution
129        self._set_asset_distribution_kwargs()
130
131        # pre-conditions given for the parameters (p.6-8)
132        self._check_preconditions()
133
134    def _set_asset_distribution_kwargs(self) -> None:
135        if self.asset_distribution is Distributions.UniformDistribution:
136            self.asset_distribution_kwargs = {
137                "loc": 0,
138                "scale": self.development_costs,
139            }
140        else:
141            self.asset_distribution_kwargs = {}
142
143    def _check_preconditions(self):
144        self._check_merger_policy()
145        # preconditions given (p.6-8)
146        assert self.private_benefit > 0, "Private benefit has to be bigger than 0"
147        assert (
148            0 < self.success_probability <= 1
149        ), "Success probability of development has to be between 0 and 1"
150        assert (
151            0 < self.startup_assets < self.development_costs
152        ), "Startup has not enough assets for development"
153        assert (
154            self.incumbent_profit_without_innovation > self.incumbent_profit_duopoly
155        ), "Profit of the incumbent has to be bigger without the innovation than in the duopoly"
156        assert (
157            self.incumbent_profit_with_innovation
158            > self.incumbent_profit_without_innovation
159        ), "Profit of the incumbent has to be bigger with the innovation than without the innovation"
160        assert (
161            self.cs_with_innovation >= self.cs_without_innovation
162        ), "Consumer surplus with the innovation has to weakly bigger than without the innovation"
163        assert (
164            self.w_without_innovation < self.w_with_innovation < self.w_duopoly
165        ), "Ranking of total welfare not valid (p.7)"
166        assert (
167            self.development_success is not None
168        ), "Development success is not optional"
169        self._check_assumption_one()
170        self._check_assumption_two()
171        self._check_assumption_three()
172        self._check_assumption_four()
173        self._check_assumption_five()
174
175    def _check_merger_policy(self):
176        assert self._merger_policy is not None
177
178    def _check_assumption_five(self):
179        assert (
180            self.private_benefit - self.development_costs
181            < 0
182            < self.private_benefit
183            - (
184                self.success_probability * self._startup_profit_duopoly
185                - self.development_costs
186            )
187        ), "A5 not satisfied (p.8)"
188
189    def _check_assumption_four(self):
190        assert (
191            self._success_probability
192            * (self.w_with_innovation - self.w_without_innovation)
193            > self._development_costs
194        ), "A4 not satisfied (p.8)"
195
196    def _check_assumption_three(self):
197        assert (
198            self.success_probability * self.startup_profit_duopoly
199            > self._development_costs
200        ), "A3 not satisfied (p.8)"
201
202    def _check_assumption_two(self):
203        assert (
204            self.startup_profit_duopoly
205            > self.incumbent_profit_with_innovation
206            - self.incumbent_profit_without_innovation
207        ), "A2 not satisfied (p.7)"
208
209    def _check_assumption_one(self):
210        assert (
211            self.incumbent_profit_with_innovation
212            > self.incumbent_profit_duopoly + self.startup_profit_duopoly
213        ), "A1 not satisfied (p.7)"
214
215    def _recalculate_model(self) -> None:
216        """
217        Organizes the recalculation of the model after a property changed value.
218        """
219        self._check_preconditions()
220
221    @property
222    def development_costs(self) -> float:
223        """
224        ($K$) Fixed costs to invest for development.
225        """
226        return self._development_costs
227
228    @development_costs.setter
229    def development_costs(self, value: float) -> None:
230        self._development_costs = value
231        self._recalculate_model()
232
233    @property
234    def startup_assets(self) -> float:
235        """
236        ($A$) Assets of the startup at the beginning.
237        """
238        return self._startup_assets
239
240    @startup_assets.setter
241    def startup_assets(self, value: float) -> None:
242        self._startup_assets = value
243        self._recalculate_model()
244
245    @property
246    def success_probability(self) -> float:
247        """
248        ($p$) Probability of success in case of effort (otherwise the projects fails for sure).
249        """
250        return self._success_probability
251
252    @success_probability.setter
253    def success_probability(self, value: float) -> None:
254        self._success_probability = value
255        self._recalculate_model()
256
257    @property
258    def development_success(self) -> bool:
259        """
260        Decides whether an attempted development will be successful.
261
262        If true, every attempted development will be successful.
263        """
264        return self._development_success
265
266    @development_success.setter
267    def development_success(self, value: bool) -> None:
268        self._development_success = value
269        self._recalculate_model()
270
271    @property
272    def private_benefit(self) -> float:
273        """
274        ($B$) Private benefit of the entrepreneur in case of failure.
275        """
276        return self._private_benefit
277
278    @private_benefit.setter
279    def private_benefit(self, value: float) -> None:
280        self._private_benefit = value
281        self._recalculate_model()
282
283    @property
284    def incumbent_profit_with_innovation(self):
285        """
286        ($\\pi^M_I$) Profit of the monopolist with multiple products (with innovation).
287        """
288        return self._incumbent_profit_with_innovation
289
290    @incumbent_profit_with_innovation.setter
291    def incumbent_profit_with_innovation(self, value: float) -> None:
292        self._incumbent_profit_with_innovation = value
293        self._recalculate_model()
294
295    @property
296    def cs_with_innovation(self) -> float:
297        """
298        ($CS^M$) Consumer surplus for the case that the innovation is introduced by the incumbent into the market.
299        """
300        return self._cs_with_innovation
301
302    @cs_with_innovation.setter
303    def cs_with_innovation(self, value: float) -> None:
304        self._cs_with_innovation = value
305        self._recalculate_model()
306
307    @property
308    def w_with_innovation(self) -> float:
309        """
310        ($W^M$) Total welfare for the case that the innovation is introduced by the incumbent into the market.
311        """
312        return self._cs_with_innovation + self._incumbent_profit_with_innovation
313
314    @property
315    def incumbent_profit_without_innovation(self) -> float:
316        """
317        ($\\pi^m_I$) Profit of the monopolist with a single product (without innovation).
318        """
319        return self._incumbent_profit_without_innovation
320
321    @incumbent_profit_without_innovation.setter
322    def incumbent_profit_without_innovation(self, value: float) -> None:
323        self._incumbent_profit_without_innovation = value
324        self._recalculate_model()
325
326    @property
327    def cs_without_innovation(self) -> float:
328        """
329        ($CS^m$) Consumer surplus for the case that the innovation is not introduced by the incumbent into the market.
330        """
331        return self._cs_without_innovation
332
333    @cs_without_innovation.setter
334    def cs_without_innovation(self, value: float) -> None:
335        self._cs_without_innovation = value
336        self._recalculate_model()
337
338    @property
339    def w_without_innovation(self) -> float:
340        """
341        ($W^m$) Total welfare for the case that the innovation is not introduced by the incumbent into the market.
342        """
343        return self._cs_without_innovation + self._incumbent_profit_without_innovation
344
345    @property
346    def startup_profit_duopoly(self) -> float:
347        """
348        ($\\pi^d_S$) Profit of the startup in the case of a duopoly.
349        """
350        return self._startup_profit_duopoly
351
352    @startup_profit_duopoly.setter
353    def startup_profit_duopoly(self, value: float) -> None:
354        self._startup_profit_duopoly = value
355        self._recalculate_model()
356
357    @property
358    def incumbent_profit_duopoly(self) -> float:
359        """
360        ($\\pi^d_I$) Profit of the incumbent in the case of a duopoly.
361        """
362        return self._incumbent_profit_duopoly
363
364    @incumbent_profit_duopoly.setter
365    def incumbent_profit_duopoly(self, value: float) -> None:
366        self._incumbent_profit_duopoly = value
367        self._recalculate_model()
368
369    @property
370    def cs_duopoly(self) -> float:
371        """
372        ($CS^d$) Consumer surplus for the case that the innovation is introduced into the market and a duopoly exists.
373        """
374        return self._cs_duopoly
375
376    @cs_duopoly.setter
377    def cs_duopoly(self, value: float) -> None:
378        self._cs_duopoly = value
379        self._recalculate_model()
380
381    @property
382    def w_duopoly(self) -> float:
383        """
384        ($W^d$) Total welfare for the case that the innovation is introduced into the market and a duopoly exists.
385        """
386        return (
387            self._cs_duopoly
388            + self._startup_profit_duopoly
389            + self._incumbent_profit_duopoly
390        )

There are three players in our game: an Antitrust Authority (AA), which at the beginning of the game decides its merger policy; a monopolist $ {I}$ncumbent; and a $ {S}$tart-up. The start-up owns a “prototype” (or project) that, if developed, can give rise to an innovation: for instance a substitute/higher quality product to the incumbent’s existing product, or a more efficient production process. The start-up does not have enough own resources to develop the project. It has two options: it can either obtain additional funds from competitive capital markets, or sell out to the incumbent. The incumbent will have to decide whether and when it wants to acquire the start-up (and if it does so before product development, it has to decide whether to develop the prototype or shelve it), conditional on the AA’s approval of the acquisition. We assume that the takeover involves a negligible but positive transaction cost. The AA commits at the beginning of the game to a merger policy, in the form of a maximum threshold of “harm”, that it is ready to tolerate. Harm from a proposed merger consists of the difference between the expected welfare levels if the merger goes ahead, and in the counterfactual where it does not take place (derived of course by correctly anticipating the continuation equilibrium of the game). A proposed merger will be prohibited only if the tolerated harm level H is lower than the expected harm from the merger, if any.

Timing of the game:

Time Action
0 The AA commits to the standard for merger approval, $\bar{H}$.
1(a) $ {I}$ can make a takeover offer to $ {S}$, which can accept or reject.
1(b) The AA approves or blocks the takeover proposal.
1(c) The firm ($ {I}$ or $ {S}$) that owns the prototype decides whether to develop or shelve it.
1(d) The owner of the prototype engages in financial contracting (if needed). After that, uncertainty about the success or failure of the project resolves.
2(a) $ {I}$ can make a take-it-or-leave-it offer to $ {S}$ (if it did not already buy it at t = 1, and if the development of the project was successful).
2(b) The AA approves or blocks the takeover proposal.
3 Active firms sell in the product market, payoffs are realised and contracts are honored.
CoreModel( merger_policy: Fumagalli_Motta_Tarantino_2020.Models.Types.MergerPolicies = <MergerPolicies.Strict: 'Strict'>, development_costs: float = 0.1, startup_assets: float = 0.05, success_probability: float = 0.7, development_success: bool = True, private_benefit: float = 0.05, consumer_surplus_without_innovation: float = 0.2, incumbent_profit_without_innovation: float = 0.4, consumer_surplus_duopoly: float = 0.5, incumbent_profit_duopoly: float = 0.2, startup_profit_duopoly: float = 0.2, consumer_surplus_with_innovation: float = 0.3, incumbent_profit_with_innovation: float = 0.5, asset_distribution: Union[Fumagalli_Motta_Tarantino_2020.Models.Distributions.NormalDistribution, Fumagalli_Motta_Tarantino_2020.Models.Distributions.UniformDistribution] = <class 'Fumagalli_Motta_Tarantino_2020.Models.Distributions.NormalDistribution'>, **kwargs)
 39    def __init__(
 40        self,
 41        merger_policy: Types.MergerPolicies = Types.MergerPolicies.Strict,
 42        development_costs: float = 0.1,
 43        startup_assets: float = 0.05,
 44        success_probability: float = 0.7,
 45        development_success: bool = True,
 46        private_benefit: float = 0.05,
 47        consumer_surplus_without_innovation: float = 0.2,
 48        incumbent_profit_without_innovation: float = 0.4,
 49        consumer_surplus_duopoly: float = 0.5,
 50        incumbent_profit_duopoly: float = 0.2,
 51        startup_profit_duopoly: float = 0.2,
 52        consumer_surplus_with_innovation: float = 0.3,
 53        incumbent_profit_with_innovation: float = 0.5,
 54        asset_distribution: Union[
 55            Distributions.NormalDistribution, Distributions.UniformDistribution
 56        ] = Distributions.NormalDistribution,
 57        **kwargs,
 58    ):
 59        """
 60        Initializes a valid base model according to the assumptions given in the paper.
 61
 62        The following assumptions have to be met:
 63
 64        | Condition                    | Remark                                                                                                                                                                                                                                                                                                                                                        | Page (Assumption) |
 65        |------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------|
 66        | $\\bar{H} \\ge 0$            | The tolerated level of harm has to be bigger than 0.                                                                                                                                                                                                                                                                                                          | p.6               |
 67        | $p \\in (0,1]$               | Probability that the prototype is developed successfully depends on the non-contractible effort exerted by the entrepreneur of the firm that owns the project. In case of no effort the project fails for sure, but the entrepreneur obtains a positive private benefit. In case of failure the project yields no profit.                                     | p.8               |
 68        | $B>0$                        | Private benefit of the entrepreneur in case of failure.                                                                                                                                                                                                                                                                                                       | p.8               |
 69        | $A \\in (0,K)$               | The startup does not hold sufficient assets at the beginning to cover the costs.                                                                                                                                                                                                                                                                              | p.8               |
 70        | $\\pi^m_I>\\pi^d_I$          | Profit of the incumbent has to be bigger without the innovation than in the duopoly.                                                                                                                                                                                                                                                                          | p.7               |
 71        | $\\pi^M_I>\\pi^m_I$          | Industry profits are higher with a multi-product monopolist than a single product monopolist (otherwise, the incumbent would always shelve).                                                                                                                                                                                                                                                                 | p.7               |
 72        | $CS^M \\ge CS^m$             | Consumer surplus with the innovation has to weakly bigger than without the innovation (consumers like variety).                                                                                                                                                                                                                                                                        | p.7               |
 73        | $\\pi^M_I>\\pi^d_I+\\pi^d_S$ | Industry profits are higher under monopoly than under duopoly. If this assumption did not hold, the takeover would not take place.                                                                                                                                                                                                                            | p.7 (A1)          |
 74        | $\\pi^d_S>\\pi^M_I-\\pi^m_I$ | An incumbent has less incentive to innovate (in a new/better product or a more efficient production process) than a potential entrant because the innovation would cannibalise the incumbent’s current profits. (Corresponds to Arrow's replacement effect)                                                                                                   | p.7 (A2)          |
 75        | $p\\pi^d_S>K$                | In case of effort it is efficient to develop the prototype, i.e., development has a positive net present value (NPV) for the start-up                                                                                                                                                                                                                         | p.8 (A3)          |
 76        | $p(W^M-W^m)>K$               | The development of the project is not only privately beneficial for the start-up, but also for society as a whole, whether undertaken by the incumbent or the start-up (implies $\\;p(W^d-W^m)>K\\;$).                                                                                                                                                                                       | p.8 (A4)          |
 77        | $B-K<0$$B-(p\\pi^d_S-K)>0$   | The first inequality implies that if S shirks the project has negative value; thus, no financial contract could be signed unless the startup makes effort. The second implies that the start-up may be financially constrained, that is, it may hold insufficient assets to fund the development of the prototype even though the project has a positive NPV. | p.8 (A5)          |
 78
 79        Parameters
 80        ----------
 81        development_costs : float
 82            ($K$) Fixed costs to invest for development.
 83        startup_assets : float
 84            ($A$) Assets of the startup at the beginning.
 85        success_probability : float
 86            ($p$) Probability of success in case of effort (otherwise the projects fails for sure).
 87        development_success : bool
 88            Decides whether an attempted development will be successful (true $\\rightarrow$ attempted development succeeds).
 89        private_benefit : float
 90            ($B$) Private benefit of the entrepreneur in case of failure.
 91        consumer_surplus_without_innovation : float
 92            ($CS^m$) Consumer surplus for the case that the innovation is not introduced by the incumbent into the market.
 93        incumbent_profit_without_innovation : float
 94            ($\\pi^m_I$) Profit of the monopolist with a single product (without innovation).
 95        consumer_surplus_duopoly : float
 96            ($CS^d$) Consumer surplus for the case that the innovation is introduced into the market and a duopoly exists.
 97        incumbent_profit_duopoly : float
 98            ($\\pi^d_I$) Profit of the incumbent in the case of a duopoly.
 99        startup_profit_duopoly : float
100            ($\\pi^d_S$) Profit of the startup in the case of a duopoly.
101        consumer_surplus_with_innovation : float
102             ($CS^M$) Consumer surplus for the case that the innovation is introduced by the incumbent into the market.
103        incumbent_profit_with_innovation : float
104            ($\\pi^M_I$) Profit of the monopolist with multiple products (with innovation).
105        """
106        self._merger_policy = merger_policy
107        self._development_costs = development_costs
108        self._startup_assets = startup_assets
109        self._success_probability = success_probability
110        self._development_success = development_success
111        self._private_benefit = private_benefit
112
113        # product market payoffs (p.6ff.)
114        # with innovation
115        self._incumbent_profit_with_innovation = incumbent_profit_with_innovation
116        self._cs_with_innovation = consumer_surplus_with_innovation
117
118        # without innovation
119        self._incumbent_profit_without_innovation = incumbent_profit_without_innovation
120        self._cs_without_innovation = consumer_surplus_without_innovation
121
122        # with duopoly
123        self._startup_profit_duopoly = startup_profit_duopoly
124        self._incumbent_profit_duopoly = incumbent_profit_duopoly
125        self._cs_duopoly = consumer_surplus_duopoly
126
127        # set asset distribution
128        self.asset_distribution = asset_distribution
129        self._set_asset_distribution_kwargs()
130
131        # pre-conditions given for the parameters (p.6-8)
132        self._check_preconditions()

Initializes a valid base model according to the assumptions given in the paper.

The following assumptions have to be met:

Condition Remark Page (Assumption)
$\bar{H} \ge 0$ The tolerated level of harm has to be bigger than 0. p.6
$p \in (0,1]$ Probability that the prototype is developed successfully depends on the non-contractible effort exerted by the entrepreneur of the firm that owns the project. In case of no effort the project fails for sure, but the entrepreneur obtains a positive private benefit. In case of failure the project yields no profit. p.8
$B>0$ Private benefit of the entrepreneur in case of failure. p.8
$A \in (0,K)$ The startup does not hold sufficient assets at the beginning to cover the costs. p.8
$\pi^m_I>\pi^d_I$ Profit of the incumbent has to be bigger without the innovation than in the duopoly. p.7
$\pi^M_I>\pi^m_I$ Industry profits are higher with a multi-product monopolist than a single product monopolist (otherwise, the incumbent would always shelve). p.7
$CS^M \ge CS^m$ Consumer surplus with the innovation has to weakly bigger than without the innovation (consumers like variety). p.7
$\pi^M_I>\pi^d_I+\pi^d_S$ Industry profits are higher under monopoly than under duopoly. If this assumption did not hold, the takeover would not take place. p.7 (A1)
$\pi^d_S>\pi^M_I-\pi^m_I$ An incumbent has less incentive to innovate (in a new/better product or a more efficient production process) than a potential entrant because the innovation would cannibalise the incumbent’s current profits. (Corresponds to Arrow's replacement effect) p.7 (A2)
$p\pi^d_S>K$ In case of effort it is efficient to develop the prototype, i.e., development has a positive net present value (NPV) for the start-up p.8 (A3)
$p(W^M-W^m)>K$ The development of the project is not only privately beneficial for the start-up, but also for society as a whole, whether undertaken by the incumbent or the start-up (implies $\;p(W^d-W^m)>K\;$). p.8 (A4)
$B-K<0$$B-(p\pi^d_S-K)>0$ The first inequality implies that if S shirks the project has negative value; thus, no financial contract could be signed unless the startup makes effort. The second implies that the start-up may be financially constrained, that is, it may hold insufficient assets to fund the development of the prototype even though the project has a positive NPV. p.8 (A5)
Parameters
  • development_costs (float): ($K$) Fixed costs to invest for development.
  • startup_assets (float): ($A$) Assets of the startup at the beginning.
  • success_probability (float): ($p$) Probability of success in case of effort (otherwise the projects fails for sure).
  • development_success (bool): Decides whether an attempted development will be successful (true $\rightarrow$ attempted development succeeds).
  • private_benefit (float): ($B$) Private benefit of the entrepreneur in case of failure.
  • consumer_surplus_without_innovation (float): ($CS^m$) Consumer surplus for the case that the innovation is not introduced by the incumbent into the market.
  • incumbent_profit_without_innovation (float): ($\pi^m_I$) Profit of the monopolist with a single product (without innovation).
  • consumer_surplus_duopoly (float): ($CS^d$) Consumer surplus for the case that the innovation is introduced into the market and a duopoly exists.
  • incumbent_profit_duopoly (float): ($\pi^d_I$) Profit of the incumbent in the case of a duopoly.
  • startup_profit_duopoly (float): ($\pi^d_S$) Profit of the startup in the case of a duopoly.
  • consumer_surplus_with_innovation (float): ($CS^M$) Consumer surplus for the case that the innovation is introduced by the incumbent into the market.
  • incumbent_profit_with_innovation (float): ($\pi^M_I$) Profit of the monopolist with multiple products (with innovation).
asset_distribution
development_costs: float
221    @property
222    def development_costs(self) -> float:
223        """
224        ($K$) Fixed costs to invest for development.
225        """
226        return self._development_costs

($K$) Fixed costs to invest for development.

startup_assets: float
233    @property
234    def startup_assets(self) -> float:
235        """
236        ($A$) Assets of the startup at the beginning.
237        """
238        return self._startup_assets

($A$) Assets of the startup at the beginning.

success_probability: float
245    @property
246    def success_probability(self) -> float:
247        """
248        ($p$) Probability of success in case of effort (otherwise the projects fails for sure).
249        """
250        return self._success_probability

($p$) Probability of success in case of effort (otherwise the projects fails for sure).

development_success: bool
257    @property
258    def development_success(self) -> bool:
259        """
260        Decides whether an attempted development will be successful.
261
262        If true, every attempted development will be successful.
263        """
264        return self._development_success

Decides whether an attempted development will be successful.

If true, every attempted development will be successful.

private_benefit: float
271    @property
272    def private_benefit(self) -> float:
273        """
274        ($B$) Private benefit of the entrepreneur in case of failure.
275        """
276        return self._private_benefit

($B$) Private benefit of the entrepreneur in case of failure.

incumbent_profit_with_innovation
283    @property
284    def incumbent_profit_with_innovation(self):
285        """
286        ($\\pi^M_I$) Profit of the monopolist with multiple products (with innovation).
287        """
288        return self._incumbent_profit_with_innovation

($\pi^M_I$) Profit of the monopolist with multiple products (with innovation).

cs_with_innovation: float
295    @property
296    def cs_with_innovation(self) -> float:
297        """
298        ($CS^M$) Consumer surplus for the case that the innovation is introduced by the incumbent into the market.
299        """
300        return self._cs_with_innovation

($CS^M$) Consumer surplus for the case that the innovation is introduced by the incumbent into the market.

w_with_innovation: float
307    @property
308    def w_with_innovation(self) -> float:
309        """
310        ($W^M$) Total welfare for the case that the innovation is introduced by the incumbent into the market.
311        """
312        return self._cs_with_innovation + self._incumbent_profit_with_innovation

($W^M$) Total welfare for the case that the innovation is introduced by the incumbent into the market.

incumbent_profit_without_innovation: float
314    @property
315    def incumbent_profit_without_innovation(self) -> float:
316        """
317        ($\\pi^m_I$) Profit of the monopolist with a single product (without innovation).
318        """
319        return self._incumbent_profit_without_innovation

($\pi^m_I$) Profit of the monopolist with a single product (without innovation).

cs_without_innovation: float
326    @property
327    def cs_without_innovation(self) -> float:
328        """
329        ($CS^m$) Consumer surplus for the case that the innovation is not introduced by the incumbent into the market.
330        """
331        return self._cs_without_innovation

($CS^m$) Consumer surplus for the case that the innovation is not introduced by the incumbent into the market.

w_without_innovation: float
338    @property
339    def w_without_innovation(self) -> float:
340        """
341        ($W^m$) Total welfare for the case that the innovation is not introduced by the incumbent into the market.
342        """
343        return self._cs_without_innovation + self._incumbent_profit_without_innovation

($W^m$) Total welfare for the case that the innovation is not introduced by the incumbent into the market.

startup_profit_duopoly: float
345    @property
346    def startup_profit_duopoly(self) -> float:
347        """
348        ($\\pi^d_S$) Profit of the startup in the case of a duopoly.
349        """
350        return self._startup_profit_duopoly

($\pi^d_S$) Profit of the startup in the case of a duopoly.

incumbent_profit_duopoly: float
357    @property
358    def incumbent_profit_duopoly(self) -> float:
359        """
360        ($\\pi^d_I$) Profit of the incumbent in the case of a duopoly.
361        """
362        return self._incumbent_profit_duopoly

($\pi^d_I$) Profit of the incumbent in the case of a duopoly.

cs_duopoly: float
369    @property
370    def cs_duopoly(self) -> float:
371        """
372        ($CS^d$) Consumer surplus for the case that the innovation is introduced into the market and a duopoly exists.
373        """
374        return self._cs_duopoly

($CS^d$) Consumer surplus for the case that the innovation is introduced into the market and a duopoly exists.

w_duopoly: float
381    @property
382    def w_duopoly(self) -> float:
383        """
384        ($W^d$) Total welfare for the case that the innovation is introduced into the market and a duopoly exists.
385        """
386        return (
387            self._cs_duopoly
388            + self._startup_profit_duopoly
389            + self._incumbent_profit_duopoly
390        )

($W^d$) Total welfare for the case that the innovation is introduced into the market and a duopoly exists.

class MergerPolicy(CoreModel):
 393class MergerPolicy(CoreModel):
 394    """
 395    In this class all merger policies and their respective outcomes are calculated.
 396
 397    The available merger policies are documented in Fumagalli_Motta_Tarantino_2020.Types.MergerPolicies.
 398    """
 399
 400    def __init__(self, *args, **kwargs):
 401        """
 402        Takes the same arguments as Fumagalli_Motta_Tarantino_2020.Models.Base.CoreModel.__init__.
 403        """
 404        super(MergerPolicy, self).__init__(*args, **kwargs)
 405        self._probability_credit_constrained_default: float = 0
 406        self._probability_credit_constrained_merger_policy: float = 0
 407
 408        self._early_bid_attempt: Optional[Types.Takeover] = None
 409        self._late_bid_attempt: Optional[Types.Takeover] = None
 410        self._early_takeover: Optional[bool] = None
 411        self._late_takeover: Optional[bool] = None
 412
 413        self._check_asset_distribution_thresholds()
 414        self._solve_game()
 415
 416    def _check_asset_distribution_thresholds(self) -> None:
 417        """
 418        Checks the asset distributions thresholds on validity.
 419
 420        Every threshold has to be between 0 and 1. If this condition is not satisfied, an assertion error is raised.
 421        """
 422        assert (
 423            0 < self.asset_distribution_threshold_profitable_without_late_takeover < 1
 424        ), "Violates A.2 (has to be between 0 and 1)"
 425        if self.merger_policy is Types.MergerPolicies.Strict:
 426            self._check_asset_distribution_threshold_strict()
 427        elif (
 428            self.merger_policy
 429            is Types.MergerPolicies.Intermediate_late_takeover_prohibited
 430            and self.is_incumbent_expected_to_shelve()
 431        ):
 432            assert (
 433                0
 434                <= self.asset_distribution_threshold_unprofitable_without_late_takeover
 435                < 1
 436            ), "Violates Condition A-3 (has to be between 0 and 1)"
 437        elif (
 438            self.merger_policy is Types.MergerPolicies.Laissez_faire
 439            and self.is_incumbent_expected_to_shelve()
 440        ):
 441            assert (
 442                0 < self.asset_distribution_threshold_with_late_takeover < 1
 443            ), "Violates Condition 4 (has to be between 0 and 1)"
 444
 445    def _check_asset_distribution_threshold_strict(self):
 446        assert (
 447            0 < self.asset_distribution_threshold_welfare < 1
 448        ), "Violates Condition 2 (has to be between 0 and 1)"
 449
 450    @property
 451    def merger_policy(
 452        self,
 453    ) -> Types.MergerPolicies:
 454        """
 455        Returns the merger policy used to determine the outcome, given by the thresholds for tolerated harm.
 456
 457        The levels of tolerated harm are defined in A.4 (p.36ff.). See Fumagalli_Motta_Tarantino_2020.Types.MergerPolicies
 458        for the available merger policies.
 459        """
 460        return self._merger_policy
 461
 462    @merger_policy.setter
 463    def merger_policy(self, merger_policy: Types.MergerPolicies) -> None:
 464        self._merger_policy = merger_policy
 465        self._check_merger_policy()
 466        self._recalculate_model()
 467
 468    @property
 469    def tolerated_harm(self) -> float:
 470        """
 471        ($\\bar{H}$) The AA commits at the beginning of the game to a merger policy. The tolerated harm is the maximal loss of welfare the AA is ready to accept.
 472        """
 473        if self.merger_policy is Types.MergerPolicies.Strict:
 474            return self._calculate_h0()
 475        if (
 476            self.merger_policy
 477            is Types.MergerPolicies.Intermediate_late_takeover_prohibited
 478        ):
 479            return self._calculate_h1()
 480        if (
 481            self.merger_policy
 482            is Types.MergerPolicies.Intermediate_late_takeover_allowed
 483        ):
 484            return self._calculate_h2()
 485        return float("inf")
 486
 487    @property
 488    def asset_threshold(self) -> float:
 489        """
 490        Threshold level $\\bar{A} = B - (\\pi^d_S - K)$
 491        """
 492        return self.private_benefit - (
 493            self.success_probability * self.startup_profit_duopoly
 494            - self.development_costs
 495        )
 496
 497    @property
 498    def asset_threshold_cdf(self) -> float:
 499        """
 500        Returns the value of the continuous distribution function for the asset threshold.
 501        """
 502        return self.asset_distribution.cumulative(
 503            self.asset_threshold, **self.asset_distribution_kwargs
 504        )
 505
 506    @property
 507    def asset_threshold_late_takeover(self) -> float:
 508        """
 509        The prospect that the start-up will be acquired at $t = 2$ alleviates financial constraints: there exists a
 510        threshold level $\\bar{A}^T = B - (\\pi_I^M - K)$
 511        """
 512        return self.private_benefit - (
 513            self.success_probability * self.incumbent_profit_with_innovation
 514            - self.development_costs
 515        )
 516
 517    @property
 518    def asset_threshold_late_takeover_cdf(self) -> float:
 519        """
 520        Returns the value of the continuous distribution function for the asset threshold under laissez-faire.
 521        """
 522        return self.asset_distribution.cumulative(
 523            self.asset_threshold_late_takeover, **self.asset_distribution_kwargs
 524        )
 525
 526    @CoreModel.startup_assets.setter
 527    def startup_assets(self, value: float) -> None:
 528        CoreModel.startup_assets.fset(self, value)
 529        self._recalculate_model()
 530
 531    @property
 532    def early_bidding_type(self) -> Types.Takeover:
 533        """
 534        Returns the bidding attempt of the incumbent at $t = 1$.
 535
 536        See Fumagalli_Motta_Tarantino_2020.Types.Takeover for the available options.
 537        """
 538        assert self._early_bid_attempt is not None
 539        return self._early_bid_attempt
 540
 541    @property
 542    def late_bidding_type(self) -> Types.Takeover:
 543        """
 544        Returns the bidding attempt of the incumbent at $t = 2$.
 545
 546        See Fumagalli_Motta_Tarantino_2020.Types.Takeover for the available options.
 547        """
 548        assert self._late_bid_attempt is not None
 549        return self._late_bid_attempt
 550
 551    @property
 552    def is_early_takeover(self) -> bool:
 553        """
 554        Returns whether the start-up is acquired by the incumbent at $t=1$.
 555
 556        Returns
 557        -------
 558        True
 559            If the start-up is acquired by the incumbent at $t=1$.
 560        """
 561        assert self._early_takeover is not None
 562        return self._early_takeover
 563
 564    @property
 565    def is_late_takeover(self) -> bool:
 566        """
 567        Returns whether the start-up is acquired by the incumbent at $t=2$.
 568
 569        Returns
 570        -------
 571        True
 572            If the start-up is acquired by the incumbent at $t=2$.
 573        """
 574        assert self._late_takeover is not None
 575        return self._late_takeover
 576
 577    @property
 578    def is_owner_investing(self) -> bool:
 579        """
 580        A start-up that expects external investors to deny financing will not undertake the investment. Conversely, the incumbent
 581        has the financial ability to invest, but it does not always have the incentive to do so. Indeed, the innovation
 582        increases the incumbent’s profits less than the (unconstrained) start-up’s. (This result follows directly from
 583        the Arrow’s replacement effect) The increase in the incumbent’s profits may not be large enough to cover the investment
 584        cost. When this is the case, the incumbent will shelve the project and the acquisition turns out to be a killer acquisition.
 585
 586        Investment decision under the strict merger policy:
 587        - An unconstrained start-up always invests in the development of the prototype.
 588        - The incumbent invests if (and only if): $p*(\\pi^M_I-\\pi^m_I) \\ge K$
 589
 590        Returns
 591        -------
 592        True
 593            If the owner of the innovation at $t=1$ invests in the project, instead of shelving.
 594        """
 595        assert self.is_startup_credit_rationed is not None
 596        assert self.is_early_takeover is not None
 597        if (not self.is_startup_credit_rationed and not self.is_early_takeover) or (
 598            not self.is_incumbent_expected_to_shelve() and self.is_early_takeover
 599        ):
 600            return True
 601        return False
 602
 603    @property
 604    def is_development_successful(self) -> bool:
 605        """
 606        Returns whether the development was successful or not.
 607
 608        The following two conditions have to be satisfied:
 609        - The owner of the product at $t=1$ has to invest in the development
 610        - The development success variable has to be set to True (attempted development always successful).
 611
 612        Returns
 613        -------
 614        True
 615            If both conditions are met.
 616        """
 617        assert self.is_owner_investing is not None
 618        return self.is_owner_investing and self._development_success
 619
 620    @property
 621    def is_startup_credit_rationed(self) -> bool:
 622        """
 623        If no takeover took place at t = 1(b), a start-up that decided to develop the project searches for funding at $t = 1(d)$.
 624
 625        Strict and Intermediate (late takeover prohibited):
 626        - $A < \\bar{A}$, the start-up is credit-rationed and cannot invest.
 627        - $A \\ge \\bar{A}$, the start-up obtains external funding.
 628
 629        Laissez-Faire and Intermediate (late takeover allowed):
 630        - $A < \\bar{A}^T$, the start-up is credit-rationed and cannot invest.
 631        - $A \\ge \\bar{A}^T$, the start-up obtains external funding.
 632
 633        Returns
 634        -------
 635        True
 636            If the start-up is credit rationed.
 637        """
 638        # financial contracting (chapter 3.2)
 639        if self.merger_policy in [
 640            Types.MergerPolicies.Strict,
 641            Types.MergerPolicies.Intermediate_late_takeover_prohibited,
 642        ]:
 643            if self.startup_assets < self.asset_threshold:
 644                return True
 645            return False
 646        if self.startup_assets < self.asset_threshold_late_takeover:
 647            return True
 648        return False
 649
 650    @property
 651    def asset_distribution_threshold_welfare(self) -> float:
 652        """
 653        Threshold defined in Lemma 3 :$\\;\\Gamma(\\cdot)=\\frac{p(W^d-W^M)}{p(W^d-W^m)-K}$
 654        """
 655        return (
 656            self.success_probability * (self.w_duopoly - self.w_with_innovation)
 657        ) / (
 658            self.success_probability * (self.w_duopoly - self.w_without_innovation)
 659            - self.development_costs
 660        )
 661
 662    @property
 663    def asset_distribution_threshold_profitable_without_late_takeover(self) -> float:
 664        """
 665        Threshold defined in Condition 3 :$\\;\\Phi(\\cdot)=\\frac{p(\\pi^M_I-\\pi^d_I-\\pi^d_S)}{p(\\pi^M_I-\\pi^d_I)-K}$
 666        """
 667        return (
 668            self.success_probability
 669            * (
 670                self.incumbent_profit_with_innovation
 671                - self.incumbent_profit_duopoly
 672                - self.startup_profit_duopoly
 673            )
 674        ) / (
 675            self.success_probability
 676            * (self.incumbent_profit_with_innovation - self.incumbent_profit_duopoly)
 677            - self.development_costs
 678        )
 679
 680    @property
 681    def asset_distribution_threshold_with_late_takeover(self) -> float:
 682        """
 683        Threshold defined in Condition 4 :$\\;\\Phi^T(\\cdot)=\\frac{p(\\pi^m_I-\\pi^M_I)+K}{p(\\pi^m_I+\\pi^d_S-\\pi^M_I)}$
 684        """
 685        return (
 686            self.success_probability
 687            * (
 688                self.incumbent_profit_without_innovation
 689                - self.incumbent_profit_with_innovation
 690            )
 691            + self.development_costs
 692        ) / (
 693            self.success_probability
 694            * (
 695                self.incumbent_profit_without_innovation
 696                + self.startup_profit_duopoly
 697                - self.incumbent_profit_with_innovation
 698            )
 699        )
 700
 701    @property
 702    def asset_distribution_threshold_unprofitable_without_late_takeover(self) -> float:
 703        """
 704        Threshold defined in A-3 :$\\;\\Phi^{\\prime}(\\cdot)=\\frac{p(\\pi^m_I-\\pi^d_I-\\pi^d_S)+K}{p(\\pi^m_I+\\pi^d_I)}$
 705        """
 706        return (
 707            self.success_probability
 708            * (
 709                self.incumbent_profit_without_innovation
 710                - self.incumbent_profit_duopoly
 711                - self.startup_profit_duopoly
 712            )
 713            + self.development_costs
 714        ) / (
 715            self.success_probability
 716            * (self.incumbent_profit_without_innovation - self.incumbent_profit_duopoly)
 717        )
 718
 719    def is_incumbent_expected_to_shelve(self) -> bool:
 720        """
 721        Returns whether the incumbent is expected to shelve, whenever it acquires the entrant (Condition 1).
 722
 723        - True (expected to shelve): $p*(\\pi^M_I-\\pi^m_I) < K$
 724
 725        - False (not expected to shelve): $p*(\\pi^M_I-\\pi^m_I) \\ge K$
 726
 727        """
 728        return self.incumbent_expected_additional_profit_from_innovation() < 0
 729
 730    def incumbent_expected_additional_profit_from_innovation(self) -> float:
 731        """
 732        Returns the additional expected profit for the incumbent, if it does not shelve the product after an acquisition.
 733
 734        $ Expected \\; additional \\; profit = p*(\\pi^M_I-\\pi^m_I)-K$
 735        """
 736        return (
 737            self.success_probability
 738            * (
 739                self.incumbent_profit_with_innovation
 740                - self.incumbent_profit_without_innovation
 741            )
 742            - self.development_costs
 743        )
 744
 745    def _calculate_h0(self) -> float:
 746        """
 747        Calculates the minimal threshold of tolerated harm to achieve for an intermediate merger policy (late takeover prohibited).
 748        """
 749        return max(
 750            (1 - self.asset_threshold_cdf)
 751            * (self.success_probability * (self.w_duopoly - self.w_with_innovation))
 752            - self.asset_threshold_cdf
 753            * (
 754                self.success_probability
 755                * (self.w_with_innovation - self.w_without_innovation)
 756                - self.development_costs
 757            ),
 758            0,
 759        )
 760
 761    def _calculate_h1(self) -> float:
 762        """
 763        Calculates the minimal threshold of tolerated harm to achieve for an intermediate merger policy (late takeover allowed).
 764        """
 765        return (1 - self.asset_threshold_cdf) * (
 766            self.success_probability * (self.w_duopoly - self.w_without_innovation)
 767            - self.development_costs
 768        )
 769
 770    def _calculate_h2(self) -> float:
 771        """
 772        Calculates the minimal threshold of tolerated harm to achieve for a laissez-faire merger policy.
 773        """
 774        return max(
 775            self.w_duopoly - self.w_with_innovation,
 776            (1 - self.asset_threshold_late_takeover_cdf)
 777            * (
 778                self.success_probability
 779                * (self.w_with_innovation - self.w_without_innovation)
 780                - self.development_costs
 781            ),
 782        )
 783
 784    def _solve_game(self) -> None:
 785        """
 786        Solves the game according to the set Fumagalli_Motta_Tarantino_2020.Types.MergerPolicies.
 787        """
 788        if self.merger_policy is Types.MergerPolicies.Strict:
 789            self._solve_game_strict_merger_policy()
 790        elif (
 791            self.merger_policy
 792            is Types.MergerPolicies.Intermediate_late_takeover_prohibited
 793        ):
 794            self._solve_game_late_takeover_prohibited()
 795        elif (
 796            self.merger_policy
 797            is Types.MergerPolicies.Intermediate_late_takeover_allowed
 798        ):
 799            self._solve_game_late_takeover_allowed()
 800        else:
 801            self._solve_game_laissez_faire()
 802
 803    def _recalculate_model(self) -> None:
 804        """
 805        Organizes the recalculation of the model after a property changed value.
 806        """
 807        self._reset_takeovers()
 808        super(MergerPolicy, self)._recalculate_model()
 809        self._solve_game()
 810
 811    def _reset_takeovers(self):
 812        self._early_bid_attempt = None
 813        self._late_bid_attempt = None
 814        self._early_takeover = None
 815        self._late_takeover = None
 816
 817    def _solve_game_laissez_faire(self) -> None:
 818        """
 819        Solves the game under a laissez-faire merger policy, based on section 4 in the paper.
 820        """
 821        assert self.merger_policy is Types.MergerPolicies.Laissez_faire
 822        if self.is_incumbent_expected_to_shelve():
 823            if (
 824                self.asset_threshold_late_takeover_cdf
 825                >= self.asset_distribution_threshold_with_late_takeover
 826            ):
 827                if not self.is_startup_credit_rationed and self.development_success:
 828                    self._set_takeovers(late_takeover=Types.Takeover.Pooling)
 829                else:
 830                    self._set_takeovers(
 831                        early_takeover=Types.Takeover.No,
 832                        late_takeover=Types.Takeover.No,
 833                    )
 834            else:
 835                self._set_takeovers(early_takeover=Types.Takeover.Pooling)
 836        else:
 837            if self.is_startup_credit_rationed:
 838                self._set_takeovers(early_takeover=Types.Takeover.Separating)
 839            else:
 840                if self.development_success:
 841                    self._set_takeovers(
 842                        early_takeover=Types.Takeover.Separating,
 843                        early_takeover_accepted=False,
 844                        late_takeover=Types.Takeover.Pooling,
 845                    )
 846                else:
 847                    self._set_takeovers(
 848                        early_takeover=Types.Takeover.Separating,
 849                        early_takeover_accepted=False,
 850                        late_takeover=Types.Takeover.No,
 851                    )
 852
 853    def _solve_game_late_takeover_allowed(self) -> None:
 854        """
 855        Solves the game under an intermediate merger policy (late takeover allowed), based on section 5.2 in the paper.
 856        """
 857        assert (
 858            self.merger_policy
 859            is Types.MergerPolicies.Intermediate_late_takeover_allowed
 860        )
 861        if self.is_incumbent_expected_to_shelve():
 862            if not self.is_startup_credit_rationed and self.development_success:
 863                self._set_takeovers(late_takeover=Types.Takeover.Pooling)
 864            else:
 865                self._set_takeovers(
 866                    early_takeover=Types.Takeover.No, late_takeover=Types.Takeover.No
 867                )
 868        else:
 869            if self.is_startup_credit_rationed:
 870                self._set_takeovers(early_takeover=Types.Takeover.Separating)
 871            else:
 872                if self.development_success:
 873                    self._set_takeovers(
 874                        early_takeover=Types.Takeover.Separating,
 875                        early_takeover_accepted=False,
 876                        late_takeover=Types.Takeover.Pooling,
 877                    )
 878                else:
 879                    self._set_takeovers(
 880                        early_takeover=Types.Takeover.Separating,
 881                        early_takeover_accepted=False,
 882                    )
 883
 884    def _solve_game_late_takeover_prohibited(self) -> None:
 885        """
 886        Solves the game under an intermediate merger policy (late takeover prohibited),
 887        based on section 5.1 in the paper.
 888        """
 889        assert (
 890            self.merger_policy
 891            is Types.MergerPolicies.Intermediate_late_takeover_prohibited
 892        )
 893        if self.is_incumbent_expected_to_shelve():
 894            if (
 895                self.asset_threshold_cdf
 896                >= self.asset_distribution_threshold_unprofitable_without_late_takeover
 897            ):
 898                self._set_takeovers(
 899                    early_takeover=Types.Takeover.No, late_takeover=Types.Takeover.No
 900                )
 901            else:
 902                self._set_takeovers(early_takeover=Types.Takeover.Pooling)
 903        else:
 904            if (
 905                self.asset_threshold_cdf
 906                >= self.asset_distribution_threshold_profitable_without_late_takeover
 907            ):
 908                if self.is_startup_credit_rationed:
 909                    self._set_takeovers(early_takeover=Types.Takeover.Separating)
 910                else:
 911                    self._set_takeovers(
 912                        early_takeover=Types.Takeover.Separating,
 913                        early_takeover_accepted=False,
 914                    )
 915            else:
 916                self._set_takeovers(Types.Takeover.Pooling)
 917
 918    def _solve_game_strict_merger_policy(self) -> None:
 919        """
 920        Solves the game under a strict merger policy, based on section 3 in the paper.
 921        """
 922        assert self.merger_policy is Types.MergerPolicies.Strict
 923        if self.is_incumbent_expected_to_shelve():
 924            self._set_takeovers(
 925                early_takeover=Types.Takeover.No, late_takeover=Types.Takeover.No
 926            )
 927        else:
 928            if (
 929                self.asset_distribution_threshold_welfare
 930                < self.asset_threshold_cdf
 931                < max(
 932                    self.asset_distribution_threshold_profitable_without_late_takeover,
 933                    self.asset_distribution_threshold_welfare,
 934                )
 935            ):
 936                self._set_takeovers(early_takeover=Types.Takeover.Pooling)
 937            else:
 938                if self.is_startup_credit_rationed:
 939                    self._set_takeovers(early_takeover=Types.Takeover.Separating)
 940                else:
 941                    self._set_takeovers(
 942                        early_takeover=Types.Takeover.Separating,
 943                        early_takeover_accepted=False,
 944                    )
 945
 946    def _set_takeovers(
 947        self,
 948        early_takeover: Types.Takeover = Types.Takeover.No,
 949        late_takeover: Types.Takeover = Types.Takeover.No,
 950        early_takeover_accepted=True,
 951        late_takeover_accepted=True,
 952    ) -> None:
 953        """
 954        Sets the takeover variables of the class.
 955
 956        Parameters
 957        ----------
 958        early_takeover: Fumagalli_Motta_Tarantino_2020.Types.Takeover
 959            Type of the early bid attempt/takeover (if existing).
 960        late_takeover: Fumagalli_Motta_Tarantino_2020.Types.Takeover
 961            Type of the early bid attempt/takeover (if existing).
 962        early_takeover_accepted: bool
 963            If true, the early takeover comes through, otherwise the takeover is blocked by AA or the start-up.
 964        late_takeover_accepted
 965            If true, the late takeover comes through, otherwise the takeover is blocked by AA or the start-up.
 966        """
 967        assert self._early_bid_attempt is None and self._early_takeover is None
 968        assert self._late_bid_attempt is None and self._late_takeover is None
 969        assert not (
 970            early_takeover in [Types.Takeover.Separating, Types.Takeover.Pooling]
 971            and early_takeover_accepted
 972            and late_takeover in [Types.Takeover.Separating, Types.Takeover.Pooling]
 973            and late_takeover_accepted
 974        ), "Only one takeover can occur."
 975        self._early_takeover = (
 976            False
 977            if early_takeover is Types.Takeover.No or not early_takeover_accepted
 978            else True
 979        )
 980        self._early_bid_attempt = early_takeover
 981        self._late_takeover = (
 982            False
 983            if late_takeover is Types.Takeover.No or not late_takeover_accepted
 984            else True
 985        )
 986        self._late_bid_attempt = late_takeover
 987
 988    def summary(self) -> Types.Summary:
 989        """
 990        Returns the calculated outcome of the model with the defined parameters.
 991
 992        The resulting dictionary contains the following information (and keys):
 993        - 'set_policy' : Fumagalli_Motta_Tarantino_2020.Types.MergerPolicies -> Defines the chosen merger policy based on the tolerated level of harm.
 994        - 'credit_rationed' : True, if the start-up is credit rationed.
 995        - 'early_bidding_type' : Fumagalli_Motta_Tarantino_2020.Types.Takeover -> Defines the bidding type of the incumbent at t=1.
 996        - 'late_bidding_type' : 'Fumagalli_Motta_Tarantino_2020.Types.Takeover -> Defines the bidding type of the incumbent at t=2.
 997        - 'development_attempt' : True, if the owner (start-up or incumbent after a takeover) tries to develop the product.
 998        - 'development_outcome' : True, if the product is developed successfully.
 999        - 'early_takeover' : True, if a takeover takes place at $t=1$.
1000        - 'late_takeover' : True, if a takeover takes place at $t=2$.
1001
1002        Returns
1003        -------
1004        Fumagalli_Motta_Tarantino_2020.Types.Summary
1005            Containing the result of the model with the defined parameters.
1006        """
1007        return Types.Summary(
1008            set_policy=self.merger_policy,
1009            credit_rationed=self.is_startup_credit_rationed,
1010            early_bidding_type=self.early_bidding_type,
1011            late_bidding_type=self.late_bidding_type,
1012            development_attempt=self.is_owner_investing,
1013            development_outcome=self.is_development_successful,
1014            early_takeover=self.is_early_takeover,
1015            late_takeover=self.is_late_takeover,
1016        )
1017
1018    def is_killer_acquisition(self) -> bool:
1019        """
1020        Returns whether a killer acquisition occurred in the model.
1021
1022        For a killer acquisition to take place the following condition have to satisfied:
1023        - An early takeover takes place
1024        - The incumbent does not develop the product
1025
1026        Returns
1027        -------
1028        True
1029            if a killer acquisition occurred in the model.
1030        """
1031        return self.is_early_takeover and not self.is_owner_investing
1032
1033    def __str__(self) -> str:
1034        return (
1035            f"Merger Policy: {self.merger_policy}\n"
1036            f"Is start-up credit rationed?: {self.is_startup_credit_rationed}\n"
1037            f"Type of early takeover attempt: {self.early_bidding_type}\n"
1038            f"Is the early takeover approved?: {self.is_early_takeover}\n"
1039            f"Does the owner attempt the development?: {self.is_owner_investing}\n"
1040            f"Is the development successful?: {self.is_development_successful}\n"
1041            f"Type of late takeover attempt: {self.late_bidding_type}\n"
1042            f"Is the late takeover approved?: {self.is_late_takeover}"
1043        )

In this class all merger policies and their respective outcomes are calculated.

The available merger policies are documented in Fumagalli_Motta_Tarantino_2020.Types.MergerPolicies.

MergerPolicy(*args, **kwargs)
400    def __init__(self, *args, **kwargs):
401        """
402        Takes the same arguments as Fumagalli_Motta_Tarantino_2020.Models.Base.CoreModel.__init__.
403        """
404        super(MergerPolicy, self).__init__(*args, **kwargs)
405        self._probability_credit_constrained_default: float = 0
406        self._probability_credit_constrained_merger_policy: float = 0
407
408        self._early_bid_attempt: Optional[Types.Takeover] = None
409        self._late_bid_attempt: Optional[Types.Takeover] = None
410        self._early_takeover: Optional[bool] = None
411        self._late_takeover: Optional[bool] = None
412
413        self._check_asset_distribution_thresholds()
414        self._solve_game()
450    @property
451    def merger_policy(
452        self,
453    ) -> Types.MergerPolicies:
454        """
455        Returns the merger policy used to determine the outcome, given by the thresholds for tolerated harm.
456
457        The levels of tolerated harm are defined in A.4 (p.36ff.). See Fumagalli_Motta_Tarantino_2020.Types.MergerPolicies
458        for the available merger policies.
459        """
460        return self._merger_policy

Returns the merger policy used to determine the outcome, given by the thresholds for tolerated harm.

The levels of tolerated harm are defined in A.4 (p.36ff.). See Fumagalli_Motta_Tarantino_2020.Types.MergerPolicies for the available merger policies.

tolerated_harm: float
468    @property
469    def tolerated_harm(self) -> float:
470        """
471        ($\\bar{H}$) The AA commits at the beginning of the game to a merger policy. The tolerated harm is the maximal loss of welfare the AA is ready to accept.
472        """
473        if self.merger_policy is Types.MergerPolicies.Strict:
474            return self._calculate_h0()
475        if (
476            self.merger_policy
477            is Types.MergerPolicies.Intermediate_late_takeover_prohibited
478        ):
479            return self._calculate_h1()
480        if (
481            self.merger_policy
482            is Types.MergerPolicies.Intermediate_late_takeover_allowed
483        ):
484            return self._calculate_h2()
485        return float("inf")

($\bar{H}$) The AA commits at the beginning of the game to a merger policy. The tolerated harm is the maximal loss of welfare the AA is ready to accept.

asset_threshold: float
487    @property
488    def asset_threshold(self) -> float:
489        """
490        Threshold level $\\bar{A} = B - (\\pi^d_S - K)$
491        """
492        return self.private_benefit - (
493            self.success_probability * self.startup_profit_duopoly
494            - self.development_costs
495        )

Threshold level $\bar{A} = B - (\pi^d_S - K)$

asset_threshold_cdf: float
497    @property
498    def asset_threshold_cdf(self) -> float:
499        """
500        Returns the value of the continuous distribution function for the asset threshold.
501        """
502        return self.asset_distribution.cumulative(
503            self.asset_threshold, **self.asset_distribution_kwargs
504        )

Returns the value of the continuous distribution function for the asset threshold.

asset_threshold_late_takeover: float
506    @property
507    def asset_threshold_late_takeover(self) -> float:
508        """
509        The prospect that the start-up will be acquired at $t = 2$ alleviates financial constraints: there exists a
510        threshold level $\\bar{A}^T = B - (\\pi_I^M - K)$
511        """
512        return self.private_benefit - (
513            self.success_probability * self.incumbent_profit_with_innovation
514            - self.development_costs
515        )

The prospect that the start-up will be acquired at $t = 2$ alleviates financial constraints: there exists a threshold level $\bar{A}^T = B - (\pi_I^M - K)$

asset_threshold_late_takeover_cdf: float
517    @property
518    def asset_threshold_late_takeover_cdf(self) -> float:
519        """
520        Returns the value of the continuous distribution function for the asset threshold under laissez-faire.
521        """
522        return self.asset_distribution.cumulative(
523            self.asset_threshold_late_takeover, **self.asset_distribution_kwargs
524        )

Returns the value of the continuous distribution function for the asset threshold under laissez-faire.

startup_assets: float
233    @property
234    def startup_assets(self) -> float:
235        """
236        ($A$) Assets of the startup at the beginning.
237        """
238        return self._startup_assets

($A$) Assets of the startup at the beginning.

531    @property
532    def early_bidding_type(self) -> Types.Takeover:
533        """
534        Returns the bidding attempt of the incumbent at $t = 1$.
535
536        See Fumagalli_Motta_Tarantino_2020.Types.Takeover for the available options.
537        """
538        assert self._early_bid_attempt is not None
539        return self._early_bid_attempt

Returns the bidding attempt of the incumbent at $t = 1$.

See Fumagalli_Motta_Tarantino_2020.Types.Takeover for the available options.

541    @property
542    def late_bidding_type(self) -> Types.Takeover:
543        """
544        Returns the bidding attempt of the incumbent at $t = 2$.
545
546        See Fumagalli_Motta_Tarantino_2020.Types.Takeover for the available options.
547        """
548        assert self._late_bid_attempt is not None
549        return self._late_bid_attempt

Returns the bidding attempt of the incumbent at $t = 2$.

See Fumagalli_Motta_Tarantino_2020.Types.Takeover for the available options.

is_early_takeover: bool
551    @property
552    def is_early_takeover(self) -> bool:
553        """
554        Returns whether the start-up is acquired by the incumbent at $t=1$.
555
556        Returns
557        -------
558        True
559            If the start-up is acquired by the incumbent at $t=1$.
560        """
561        assert self._early_takeover is not None
562        return self._early_takeover

Returns whether the start-up is acquired by the incumbent at $t=1$.

Returns
  • True: If the start-up is acquired by the incumbent at $t=1$.
is_late_takeover: bool
564    @property
565    def is_late_takeover(self) -> bool:
566        """
567        Returns whether the start-up is acquired by the incumbent at $t=2$.
568
569        Returns
570        -------
571        True
572            If the start-up is acquired by the incumbent at $t=2$.
573        """
574        assert self._late_takeover is not None
575        return self._late_takeover

Returns whether the start-up is acquired by the incumbent at $t=2$.

Returns
  • True: If the start-up is acquired by the incumbent at $t=2$.
is_owner_investing: bool
577    @property
578    def is_owner_investing(self) -> bool:
579        """
580        A start-up that expects external investors to deny financing will not undertake the investment. Conversely, the incumbent
581        has the financial ability to invest, but it does not always have the incentive to do so. Indeed, the innovation
582        increases the incumbent’s profits less than the (unconstrained) start-up’s. (This result follows directly from
583        the Arrow’s replacement effect) The increase in the incumbent’s profits may not be large enough to cover the investment
584        cost. When this is the case, the incumbent will shelve the project and the acquisition turns out to be a killer acquisition.
585
586        Investment decision under the strict merger policy:
587        - An unconstrained start-up always invests in the development of the prototype.
588        - The incumbent invests if (and only if): $p*(\\pi^M_I-\\pi^m_I) \\ge K$
589
590        Returns
591        -------
592        True
593            If the owner of the innovation at $t=1$ invests in the project, instead of shelving.
594        """
595        assert self.is_startup_credit_rationed is not None
596        assert self.is_early_takeover is not None
597        if (not self.is_startup_credit_rationed and not self.is_early_takeover) or (
598            not self.is_incumbent_expected_to_shelve() and self.is_early_takeover
599        ):
600            return True
601        return False

A start-up that expects external investors to deny financing will not undertake the investment. Conversely, the incumbent has the financial ability to invest, but it does not always have the incentive to do so. Indeed, the innovation increases the incumbent’s profits less than the (unconstrained) start-up’s. (This result follows directly from the Arrow’s replacement effect) The increase in the incumbent’s profits may not be large enough to cover the investment cost. When this is the case, the incumbent will shelve the project and the acquisition turns out to be a killer acquisition.

Investment decision under the strict merger policy:

  • An unconstrained start-up always invests in the development of the prototype.
  • The incumbent invests if (and only if): $p*(\pi^M_I-\pi^m_I) \ge K$
Returns
  • True: If the owner of the innovation at $t=1$ invests in the project, instead of shelving.
is_development_successful: bool
603    @property
604    def is_development_successful(self) -> bool:
605        """
606        Returns whether the development was successful or not.
607
608        The following two conditions have to be satisfied:
609        - The owner of the product at $t=1$ has to invest in the development
610        - The development success variable has to be set to True (attempted development always successful).
611
612        Returns
613        -------
614        True
615            If both conditions are met.
616        """
617        assert self.is_owner_investing is not None
618        return self.is_owner_investing and self._development_success

Returns whether the development was successful or not.

The following two conditions have to be satisfied:

  • The owner of the product at $t=1$ has to invest in the development
  • The development success variable has to be set to True (attempted development always successful).
Returns
  • True: If both conditions are met.
is_startup_credit_rationed: bool
620    @property
621    def is_startup_credit_rationed(self) -> bool:
622        """
623        If no takeover took place at t = 1(b), a start-up that decided to develop the project searches for funding at $t = 1(d)$.
624
625        Strict and Intermediate (late takeover prohibited):
626        - $A < \\bar{A}$, the start-up is credit-rationed and cannot invest.
627        - $A \\ge \\bar{A}$, the start-up obtains external funding.
628
629        Laissez-Faire and Intermediate (late takeover allowed):
630        - $A < \\bar{A}^T$, the start-up is credit-rationed and cannot invest.
631        - $A \\ge \\bar{A}^T$, the start-up obtains external funding.
632
633        Returns
634        -------
635        True
636            If the start-up is credit rationed.
637        """
638        # financial contracting (chapter 3.2)
639        if self.merger_policy in [
640            Types.MergerPolicies.Strict,
641            Types.MergerPolicies.Intermediate_late_takeover_prohibited,
642        ]:
643            if self.startup_assets < self.asset_threshold:
644                return True
645            return False
646        if self.startup_assets < self.asset_threshold_late_takeover:
647            return True
648        return False

If no takeover took place at t = 1(b), a start-up that decided to develop the project searches for funding at $t = 1(d)$.

Strict and Intermediate (late takeover prohibited):

  • $A < \bar{A}$, the start-up is credit-rationed and cannot invest.
  • $A \ge \bar{A}$, the start-up obtains external funding.

Laissez-Faire and Intermediate (late takeover allowed):

  • $A < \bar{A}^T$, the start-up is credit-rationed and cannot invest.
  • $A \ge \bar{A}^T$, the start-up obtains external funding.
Returns
  • True: If the start-up is credit rationed.
asset_distribution_threshold_welfare: float
650    @property
651    def asset_distribution_threshold_welfare(self) -> float:
652        """
653        Threshold defined in Lemma 3 :$\\;\\Gamma(\\cdot)=\\frac{p(W^d-W^M)}{p(W^d-W^m)-K}$
654        """
655        return (
656            self.success_probability * (self.w_duopoly - self.w_with_innovation)
657        ) / (
658            self.success_probability * (self.w_duopoly - self.w_without_innovation)
659            - self.development_costs
660        )

Threshold defined in Lemma 3 :$\;\Gamma(\cdot)=\frac{p(W^d-W^M)}{p(W^d-W^m)-K}$

asset_distribution_threshold_profitable_without_late_takeover: float
662    @property
663    def asset_distribution_threshold_profitable_without_late_takeover(self) -> float:
664        """
665        Threshold defined in Condition 3 :$\\;\\Phi(\\cdot)=\\frac{p(\\pi^M_I-\\pi^d_I-\\pi^d_S)}{p(\\pi^M_I-\\pi^d_I)-K}$
666        """
667        return (
668            self.success_probability
669            * (
670                self.incumbent_profit_with_innovation
671                - self.incumbent_profit_duopoly
672                - self.startup_profit_duopoly
673            )
674        ) / (
675            self.success_probability
676            * (self.incumbent_profit_with_innovation - self.incumbent_profit_duopoly)
677            - self.development_costs
678        )

Threshold defined in Condition 3 :$\;\Phi(\cdot)=\frac{p(\pi^M_I-\pi^d_I-\pi^d_S)}{p(\pi^M_I-\pi^d_I)-K}$

asset_distribution_threshold_with_late_takeover: float
680    @property
681    def asset_distribution_threshold_with_late_takeover(self) -> float:
682        """
683        Threshold defined in Condition 4 :$\\;\\Phi^T(\\cdot)=\\frac{p(\\pi^m_I-\\pi^M_I)+K}{p(\\pi^m_I+\\pi^d_S-\\pi^M_I)}$
684        """
685        return (
686            self.success_probability
687            * (
688                self.incumbent_profit_without_innovation
689                - self.incumbent_profit_with_innovation
690            )
691            + self.development_costs
692        ) / (
693            self.success_probability
694            * (
695                self.incumbent_profit_without_innovation
696                + self.startup_profit_duopoly
697                - self.incumbent_profit_with_innovation
698            )
699        )

Threshold defined in Condition 4 :$\;\Phi^T(\cdot)=\frac{p(\pi^m_I-\pi^M_I)+K}{p(\pi^m_I+\pi^d_S-\pi^M_I)}$

asset_distribution_threshold_unprofitable_without_late_takeover: float
701    @property
702    def asset_distribution_threshold_unprofitable_without_late_takeover(self) -> float:
703        """
704        Threshold defined in A-3 :$\\;\\Phi^{\\prime}(\\cdot)=\\frac{p(\\pi^m_I-\\pi^d_I-\\pi^d_S)+K}{p(\\pi^m_I+\\pi^d_I)}$
705        """
706        return (
707            self.success_probability
708            * (
709                self.incumbent_profit_without_innovation
710                - self.incumbent_profit_duopoly
711                - self.startup_profit_duopoly
712            )
713            + self.development_costs
714        ) / (
715            self.success_probability
716            * (self.incumbent_profit_without_innovation - self.incumbent_profit_duopoly)
717        )

Threshold defined in A-3 :$\;\Phi^{\prime}(\cdot)=\frac{p(\pi^m_I-\pi^d_I-\pi^d_S)+K}{p(\pi^m_I+\pi^d_I)}$

def is_incumbent_expected_to_shelve(self) -> bool:
719    def is_incumbent_expected_to_shelve(self) -> bool:
720        """
721        Returns whether the incumbent is expected to shelve, whenever it acquires the entrant (Condition 1).
722
723        - True (expected to shelve): $p*(\\pi^M_I-\\pi^m_I) < K$
724
725        - False (not expected to shelve): $p*(\\pi^M_I-\\pi^m_I) \\ge K$
726
727        """
728        return self.incumbent_expected_additional_profit_from_innovation() < 0

Returns whether the incumbent is expected to shelve, whenever it acquires the entrant (Condition 1).

  • True (expected to shelve): $p*(\pi^M_I-\pi^m_I) < K$

  • False (not expected to shelve): $p*(\pi^M_I-\pi^m_I) \ge K$

def incumbent_expected_additional_profit_from_innovation(self) -> float:
730    def incumbent_expected_additional_profit_from_innovation(self) -> float:
731        """
732        Returns the additional expected profit for the incumbent, if it does not shelve the product after an acquisition.
733
734        $ Expected \\; additional \\; profit = p*(\\pi^M_I-\\pi^m_I)-K$
735        """
736        return (
737            self.success_probability
738            * (
739                self.incumbent_profit_with_innovation
740                - self.incumbent_profit_without_innovation
741            )
742            - self.development_costs
743        )

Returns the additional expected profit for the incumbent, if it does not shelve the product after an acquisition.

$ Expected \; additional \; profit = p*(\pi^M_I-\pi^m_I)-K$

def summary(self) -> Fumagalli_Motta_Tarantino_2020.Models.Types.Summary:
 988    def summary(self) -> Types.Summary:
 989        """
 990        Returns the calculated outcome of the model with the defined parameters.
 991
 992        The resulting dictionary contains the following information (and keys):
 993        - 'set_policy' : Fumagalli_Motta_Tarantino_2020.Types.MergerPolicies -> Defines the chosen merger policy based on the tolerated level of harm.
 994        - 'credit_rationed' : True, if the start-up is credit rationed.
 995        - 'early_bidding_type' : Fumagalli_Motta_Tarantino_2020.Types.Takeover -> Defines the bidding type of the incumbent at t=1.
 996        - 'late_bidding_type' : 'Fumagalli_Motta_Tarantino_2020.Types.Takeover -> Defines the bidding type of the incumbent at t=2.
 997        - 'development_attempt' : True, if the owner (start-up or incumbent after a takeover) tries to develop the product.
 998        - 'development_outcome' : True, if the product is developed successfully.
 999        - 'early_takeover' : True, if a takeover takes place at $t=1$.
1000        - 'late_takeover' : True, if a takeover takes place at $t=2$.
1001
1002        Returns
1003        -------
1004        Fumagalli_Motta_Tarantino_2020.Types.Summary
1005            Containing the result of the model with the defined parameters.
1006        """
1007        return Types.Summary(
1008            set_policy=self.merger_policy,
1009            credit_rationed=self.is_startup_credit_rationed,
1010            early_bidding_type=self.early_bidding_type,
1011            late_bidding_type=self.late_bidding_type,
1012            development_attempt=self.is_owner_investing,
1013            development_outcome=self.is_development_successful,
1014            early_takeover=self.is_early_takeover,
1015            late_takeover=self.is_late_takeover,
1016        )

Returns the calculated outcome of the model with the defined parameters.

The resulting dictionary contains the following information (and keys):

  • 'set_policy' : Fumagalli_Motta_Tarantino_2020.Types.MergerPolicies -> Defines the chosen merger policy based on the tolerated level of harm.
  • 'credit_rationed' : True, if the start-up is credit rationed.
  • 'early_bidding_type' : Fumagalli_Motta_Tarantino_2020.Types.Takeover -> Defines the bidding type of the incumbent at t=1.
  • 'late_bidding_type' : 'Fumagalli_Motta_Tarantino_2020.Types.Takeover -> Defines the bidding type of the incumbent at t=2.
  • 'development_attempt' : True, if the owner (start-up or incumbent after a takeover) tries to develop the product.
  • 'development_outcome' : True, if the product is developed successfully.
  • 'early_takeover' : True, if a takeover takes place at $t=1$.
  • 'late_takeover' : True, if a takeover takes place at $t=2$.
Returns
  • Fumagalli_Motta_Tarantino_2020.Types.Summary: Containing the result of the model with the defined parameters.
def is_killer_acquisition(self) -> bool:
1018    def is_killer_acquisition(self) -> bool:
1019        """
1020        Returns whether a killer acquisition occurred in the model.
1021
1022        For a killer acquisition to take place the following condition have to satisfied:
1023        - An early takeover takes place
1024        - The incumbent does not develop the product
1025
1026        Returns
1027        -------
1028        True
1029            if a killer acquisition occurred in the model.
1030        """
1031        return self.is_early_takeover and not self.is_owner_investing

Returns whether a killer acquisition occurred in the model.

For a killer acquisition to take place the following condition have to satisfied:

  • An early takeover takes place
  • The incumbent does not develop the product
Returns
  • True: if a killer acquisition occurred in the model.
class OptimalMergerPolicy(MergerPolicy):
1046class OptimalMergerPolicy(MergerPolicy):
1047    """
1048    Add functionality to determine the optimal merger policy for a given set of parameters.
1049
1050    Annotation: As discussed in section 5.1, a policy that is more lenient with respect to early acquisitions is always
1051    dominated by a strict merger policy. Therefore, only the three remaining policies are discussed.
1052    """
1053
1054    def __init__(self, *args, **kwargs):
1055        super(OptimalMergerPolicy, self).__init__(*args, **kwargs)
1056
1057    def get_optimal_merger_policy(
1058        self,
1059    ) -> Types.MergerPolicies:
1060        """
1061        A strict merger policy is always optimal when the incumbent is expected to invest. When the incumbent is expected
1062        to shelve, a more lenient policy (that either authorises any type of takeover, or that blocks early takeovers when
1063        the incumbent makes a pooling bid and plans to shelve, and authorises late takeovers) may be optimal, but under the
1064        cumulative conditions indicated in proposition 4.
1065
1066        See: OptimalMergerPolicy.is_laissez_faire_optimal, OptimalMergerPolicy.is_intermediate_optimal and OptimalMergerPolicy.is_strict_optimal
1067
1068        """
1069        if self.is_laissez_faire_optimal():
1070            return Types.MergerPolicies.Laissez_faire
1071        if self.is_intermediate_optimal():
1072            return self._get_intermediate_optimal_candidate()
1073        return Types.MergerPolicies.Strict
1074
1075    @staticmethod
1076    def _get_intermediate_optimal_candidate() -> Types.MergerPolicies:
1077        return Types.MergerPolicies.Intermediate_late_takeover_allowed
1078
1079    def is_laissez_faire_optimal(self) -> bool:
1080        """
1081        Returns whether a laissez-faire policy is optimal.
1082
1083        A laissez-faire policy (that authorises any takeover) is optimal, if:
1084        1. Incumbent is expected to shelve ($p(\\pi^M_I-\\pi^m_I) < K$).
1085        2. Financial imperfections are severe ($F(\\bar{A}^T)\\ge\\Phi^T(\\cdot)$).
1086        3. Approving early takeovers followed by shelving is optimal ($F(\\bar{A}^T)\\ge\\Lambda(\\cdot)$).
1087        4. Detrimental effect of less intense product market competition is dominated by the benefit of making it more
1088        likely that the innovation is commercialised (Condition 6 not satisfied).
1089
1090        Returns
1091        -------
1092        True
1093            If a laissez-faire merger policy is optimal.
1094        """
1095        return (
1096            self.is_incumbent_expected_to_shelve()
1097            and self.is_financial_imperfection_severe()
1098            and not self.is_intermediate_policy_feasible()
1099            and not self.is_competition_effect_dominating()
1100        )
1101
1102    def is_intermediate_optimal(self) -> bool:
1103        """
1104        Returns whether an intermediate merger policy (late takeover allowed) is optimal.
1105
1106        An intermediate merger policy (late takeovers allowed) is optimal, if:
1107        1. Incumbent is expected to shelve ($p(\\pi^M_I-\\pi^m_I) < K$).
1108        2. Approving early takeovers followed by shelving is not optimal ($F(\\bar{A}^T) < \\Lambda(\\cdot)$).
1109        3. Detrimental effect of less intense product market competition is dominated by the benefit of making it more
1110        likely that the innovation is commercialised (Condition 6 not satisfied).
1111
1112        Returns
1113        -------
1114        True
1115            If an intermediate merger policy (late takeover allowed) is optimal.
1116        """
1117        return (
1118            self.is_incumbent_expected_to_shelve()
1119            and self.is_intermediate_policy_feasible()
1120            and not self.is_competition_effect_dominating()
1121        )
1122
1123    def is_strict_optimal(self) -> bool:
1124        """
1125        Returns whether the strict merger policy is optimal.
1126
1127        The strict merger is optimal, if the other policies are not optimal.
1128
1129        Returns
1130        -------
1131        True
1132            If the strict merger policy is optimal.
1133        """
1134        return not (self.is_intermediate_optimal() or self.is_laissez_faire_optimal())
1135
1136    def is_competition_effect_dominating(self) -> bool:
1137        """
1138        Condition 6: $\\frac{p(W^d-W^m)-K}{p(W^M-W^m)-K} \\ge \\frac{1-F(\\bar{A}^T)}{1-F(\\bar{A})}$
1139        """
1140        return (
1141            self.success_probability * (self.w_duopoly - self.w_without_innovation)
1142            - self.development_costs
1143        ) / (
1144            self.success_probability
1145            * (self.w_with_innovation - self.w_without_innovation)
1146            - self.development_costs
1147        ) >= (
1148            1 - self.asset_threshold_late_takeover_cdf
1149        ) / (
1150            1 - self.asset_threshold_cdf
1151        )
1152
1153    def is_financial_imperfection_severe(self) -> bool:
1154        """
1155        Returns whether financial imperfections are severe.
1156
1157        Returns
1158        -------
1159        True
1160            If the financial imperfections are severe.
1161        """
1162        return (
1163            self.asset_threshold_late_takeover_cdf
1164            >= self.asset_distribution_threshold_with_late_takeover
1165        )
1166
1167    def is_intermediate_policy_feasible(self) -> bool:
1168        """
1169        Returns whether an intermediate (with late takeovers) merger policy is feasible.
1170
1171        An intermediate policy, which authorizes late takeovers, is feasible if condition 5 is not satisfied.
1172
1173        Returns
1174        -------
1175        True
1176            If an intermediate policy is feasible.
1177        """
1178        return (
1179            self.asset_threshold_late_takeover_cdf
1180            < self.asset_distribution_threshold_shelving_approved
1181        )
1182
1183    @property
1184    def asset_distribution_threshold_shelving_approved(self) -> float:
1185        """
1186        Threshold defined in Condition 5 :$\\;\\Lambda(\\cdot)=\\frac{p(W^M-W^m)-K-(W^d-W^M)}{p(W^M-W^m)-K}$
1187        """
1188        return (
1189            self.success_probability
1190            * (self.w_with_innovation - self.w_without_innovation)
1191            - self.development_costs
1192            - (self.w_duopoly - self.w_with_innovation)
1193        ) / (
1194            self.success_probability
1195            * (self.w_with_innovation - self.w_without_innovation)
1196            - self.development_costs
1197        )
1198
1199    def summary(self) -> Types.OptimalMergerPolicySummary:
1200        """
1201        Returns the calculated outcome of the model with the defined parameters.
1202
1203        Additional information compared to Fumagalli_Motta_Tarantino_2020.Models.MergerPolicy.summary:
1204        - 'optimal_policy' : Fumagalli_Motta_Tarantino_2020.Types.MergerPolicies -> Defines the welfare maximizing merger policy.
1205
1206        Returns
1207        -------
1208        Fumagalli_Motta_Tarantino_2020.Types.OptimalMergerPolicySummary
1209            Containing the result of the model with the defined parameters.
1210        """
1211        return Types.OptimalMergerPolicySummary(
1212            set_policy=self.merger_policy,
1213            credit_rationed=self.is_startup_credit_rationed,
1214            early_bidding_type=self.early_bidding_type,
1215            late_bidding_type=self.late_bidding_type,
1216            development_attempt=self.is_owner_investing,
1217            development_outcome=self.is_development_successful,
1218            early_takeover=self.is_early_takeover,
1219            late_takeover=self.is_late_takeover,
1220            optimal_policy=self.get_optimal_merger_policy(),
1221        )
1222
1223    def __str__(self) -> str:
1224        return (
1225            super(OptimalMergerPolicy, self).__str__()
1226            + f"\nOptimal merger policy: {self.get_optimal_merger_policy()}"
1227        )

Add functionality to determine the optimal merger policy for a given set of parameters.

Annotation: As discussed in section 5.1, a policy that is more lenient with respect to early acquisitions is always dominated by a strict merger policy. Therefore, only the three remaining policies are discussed.

OptimalMergerPolicy(*args, **kwargs)
1054    def __init__(self, *args, **kwargs):
1055        super(OptimalMergerPolicy, self).__init__(*args, **kwargs)
def get_optimal_merger_policy(self) -> Fumagalli_Motta_Tarantino_2020.Models.Types.MergerPolicies:
1057    def get_optimal_merger_policy(
1058        self,
1059    ) -> Types.MergerPolicies:
1060        """
1061        A strict merger policy is always optimal when the incumbent is expected to invest. When the incumbent is expected
1062        to shelve, a more lenient policy (that either authorises any type of takeover, or that blocks early takeovers when
1063        the incumbent makes a pooling bid and plans to shelve, and authorises late takeovers) may be optimal, but under the
1064        cumulative conditions indicated in proposition 4.
1065
1066        See: OptimalMergerPolicy.is_laissez_faire_optimal, OptimalMergerPolicy.is_intermediate_optimal and OptimalMergerPolicy.is_strict_optimal
1067
1068        """
1069        if self.is_laissez_faire_optimal():
1070            return Types.MergerPolicies.Laissez_faire
1071        if self.is_intermediate_optimal():
1072            return self._get_intermediate_optimal_candidate()
1073        return Types.MergerPolicies.Strict

A strict merger policy is always optimal when the incumbent is expected to invest. When the incumbent is expected to shelve, a more lenient policy (that either authorises any type of takeover, or that blocks early takeovers when the incumbent makes a pooling bid and plans to shelve, and authorises late takeovers) may be optimal, but under the cumulative conditions indicated in proposition 4.

See: OptimalMergerPolicy.is_laissez_faire_optimal, OptimalMergerPolicy.is_intermediate_optimal and OptimalMergerPolicy.is_strict_optimal

def is_laissez_faire_optimal(self) -> bool:
1079    def is_laissez_faire_optimal(self) -> bool:
1080        """
1081        Returns whether a laissez-faire policy is optimal.
1082
1083        A laissez-faire policy (that authorises any takeover) is optimal, if:
1084        1. Incumbent is expected to shelve ($p(\\pi^M_I-\\pi^m_I) < K$).
1085        2. Financial imperfections are severe ($F(\\bar{A}^T)\\ge\\Phi^T(\\cdot)$).
1086        3. Approving early takeovers followed by shelving is optimal ($F(\\bar{A}^T)\\ge\\Lambda(\\cdot)$).
1087        4. Detrimental effect of less intense product market competition is dominated by the benefit of making it more
1088        likely that the innovation is commercialised (Condition 6 not satisfied).
1089
1090        Returns
1091        -------
1092        True
1093            If a laissez-faire merger policy is optimal.
1094        """
1095        return (
1096            self.is_incumbent_expected_to_shelve()
1097            and self.is_financial_imperfection_severe()
1098            and not self.is_intermediate_policy_feasible()
1099            and not self.is_competition_effect_dominating()
1100        )

Returns whether a laissez-faire policy is optimal.

A laissez-faire policy (that authorises any takeover) is optimal, if:

  1. Incumbent is expected to shelve ($p(\pi^M_I-\pi^m_I) < K$).
  2. Financial imperfections are severe ($F(\bar{A}^T)\ge\Phi^T(\cdot)$).
  3. Approving early takeovers followed by shelving is optimal ($F(\bar{A}^T)\ge\Lambda(\cdot)$).
  4. Detrimental effect of less intense product market competition is dominated by the benefit of making it more likely that the innovation is commercialised (Condition 6 not satisfied).
Returns
  • True: If a laissez-faire merger policy is optimal.
def is_intermediate_optimal(self) -> bool:
1102    def is_intermediate_optimal(self) -> bool:
1103        """
1104        Returns whether an intermediate merger policy (late takeover allowed) is optimal.
1105
1106        An intermediate merger policy (late takeovers allowed) is optimal, if:
1107        1. Incumbent is expected to shelve ($p(\\pi^M_I-\\pi^m_I) < K$).
1108        2. Approving early takeovers followed by shelving is not optimal ($F(\\bar{A}^T) < \\Lambda(\\cdot)$).
1109        3. Detrimental effect of less intense product market competition is dominated by the benefit of making it more
1110        likely that the innovation is commercialised (Condition 6 not satisfied).
1111
1112        Returns
1113        -------
1114        True
1115            If an intermediate merger policy (late takeover allowed) is optimal.
1116        """
1117        return (
1118            self.is_incumbent_expected_to_shelve()
1119            and self.is_intermediate_policy_feasible()
1120            and not self.is_competition_effect_dominating()
1121        )

Returns whether an intermediate merger policy (late takeover allowed) is optimal.

An intermediate merger policy (late takeovers allowed) is optimal, if:

  1. Incumbent is expected to shelve ($p(\pi^M_I-\pi^m_I) < K$).
  2. Approving early takeovers followed by shelving is not optimal ($F(\bar{A}^T) < \Lambda(\cdot)$).
  3. Detrimental effect of less intense product market competition is dominated by the benefit of making it more likely that the innovation is commercialised (Condition 6 not satisfied).
Returns
  • True: If an intermediate merger policy (late takeover allowed) is optimal.
def is_strict_optimal(self) -> bool:
1123    def is_strict_optimal(self) -> bool:
1124        """
1125        Returns whether the strict merger policy is optimal.
1126
1127        The strict merger is optimal, if the other policies are not optimal.
1128
1129        Returns
1130        -------
1131        True
1132            If the strict merger policy is optimal.
1133        """
1134        return not (self.is_intermediate_optimal() or self.is_laissez_faire_optimal())

Returns whether the strict merger policy is optimal.

The strict merger is optimal, if the other policies are not optimal.

Returns
  • True: If the strict merger policy is optimal.
def is_competition_effect_dominating(self) -> bool:
1136    def is_competition_effect_dominating(self) -> bool:
1137        """
1138        Condition 6: $\\frac{p(W^d-W^m)-K}{p(W^M-W^m)-K} \\ge \\frac{1-F(\\bar{A}^T)}{1-F(\\bar{A})}$
1139        """
1140        return (
1141            self.success_probability * (self.w_duopoly - self.w_without_innovation)
1142            - self.development_costs
1143        ) / (
1144            self.success_probability
1145            * (self.w_with_innovation - self.w_without_innovation)
1146            - self.development_costs
1147        ) >= (
1148            1 - self.asset_threshold_late_takeover_cdf
1149        ) / (
1150            1 - self.asset_threshold_cdf
1151        )

Condition 6: $\frac{p(W^d-W^m)-K}{p(W^M-W^m)-K} \ge \frac{1-F(\bar{A}^T)}{1-F(\bar{A})}$

def is_financial_imperfection_severe(self) -> bool:
1153    def is_financial_imperfection_severe(self) -> bool:
1154        """
1155        Returns whether financial imperfections are severe.
1156
1157        Returns
1158        -------
1159        True
1160            If the financial imperfections are severe.
1161        """
1162        return (
1163            self.asset_threshold_late_takeover_cdf
1164            >= self.asset_distribution_threshold_with_late_takeover
1165        )

Returns whether financial imperfections are severe.

Returns
  • True: If the financial imperfections are severe.
def is_intermediate_policy_feasible(self) -> bool:
1167    def is_intermediate_policy_feasible(self) -> bool:
1168        """
1169        Returns whether an intermediate (with late takeovers) merger policy is feasible.
1170
1171        An intermediate policy, which authorizes late takeovers, is feasible if condition 5 is not satisfied.
1172
1173        Returns
1174        -------
1175        True
1176            If an intermediate policy is feasible.
1177        """
1178        return (
1179            self.asset_threshold_late_takeover_cdf
1180            < self.asset_distribution_threshold_shelving_approved
1181        )

Returns whether an intermediate (with late takeovers) merger policy is feasible.

An intermediate policy, which authorizes late takeovers, is feasible if condition 5 is not satisfied.

Returns
  • True: If an intermediate policy is feasible.
asset_distribution_threshold_shelving_approved: float
1183    @property
1184    def asset_distribution_threshold_shelving_approved(self) -> float:
1185        """
1186        Threshold defined in Condition 5 :$\\;\\Lambda(\\cdot)=\\frac{p(W^M-W^m)-K-(W^d-W^M)}{p(W^M-W^m)-K}$
1187        """
1188        return (
1189            self.success_probability
1190            * (self.w_with_innovation - self.w_without_innovation)
1191            - self.development_costs
1192            - (self.w_duopoly - self.w_with_innovation)
1193        ) / (
1194            self.success_probability
1195            * (self.w_with_innovation - self.w_without_innovation)
1196            - self.development_costs
1197        )

Threshold defined in Condition 5 :$\;\Lambda(\cdot)=\frac{p(W^M-W^m)-K-(W^d-W^M)}{p(W^M-W^m)-K}$

1199    def summary(self) -> Types.OptimalMergerPolicySummary:
1200        """
1201        Returns the calculated outcome of the model with the defined parameters.
1202
1203        Additional information compared to Fumagalli_Motta_Tarantino_2020.Models.MergerPolicy.summary:
1204        - 'optimal_policy' : Fumagalli_Motta_Tarantino_2020.Types.MergerPolicies -> Defines the welfare maximizing merger policy.
1205
1206        Returns
1207        -------
1208        Fumagalli_Motta_Tarantino_2020.Types.OptimalMergerPolicySummary
1209            Containing the result of the model with the defined parameters.
1210        """
1211        return Types.OptimalMergerPolicySummary(
1212            set_policy=self.merger_policy,
1213            credit_rationed=self.is_startup_credit_rationed,
1214            early_bidding_type=self.early_bidding_type,
1215            late_bidding_type=self.late_bidding_type,
1216            development_attempt=self.is_owner_investing,
1217            development_outcome=self.is_development_successful,
1218            early_takeover=self.is_early_takeover,
1219            late_takeover=self.is_late_takeover,
1220            optimal_policy=self.get_optimal_merger_policy(),
1221        )

Returns the calculated outcome of the model with the defined parameters.

Additional information compared to Fumagalli_Motta_Tarantino_2020.Models.MergerPolicy.summary:

  • 'optimal_policy' : Fumagalli_Motta_Tarantino_2020.Types.MergerPolicies -> Defines the welfare maximizing merger policy.
Returns
  • Fumagalli_Motta_Tarantino_2020.Types.OptimalMergerPolicySummary: Containing the result of the model with the defined parameters.