"""@abc.abstractmethod
- defplot_incumbent_best_answers(self,axis:matplotlib.axes.Axes=None)->matplotlib.axes.Axes:
+ defget_optimal_choice(self,A:float,F:float)->Dict[str,str]:"""
- Plots the best answers of the incumbent to all possible actions of the entrant.
+ Return the optimal choice of the entrant and the incumbent based on a pair of assets of the entrant and fixed costs for copying of the incumbent.
+
+ The output dictionary will contain the following details:
+
+ - "entrant": choice of the entrant (possible choices listed in Shelegia_Motta_2021.IModel.IModel.ENTRANT_CHOICES))
+ - "incumbent": choice of the incumbent (possible choices listed in Shelegia_Motta_2021.IModel.IModel.INCUMBENT_CHOICES)
+ - "development": outcome of the development (possible outcomes listed in Shelegia_Motta_2021.IModel.IModel.DEVELOPMENT_OUTCOME) Parameters ----------
- axis : matplotlib.axes.Axes
- Axis to draw the plot on. (optional)
+ A : float
+ Assets of the entrant.
+ F : float
+ Fixed costs for copying of the incumbent. Returns -------
- matplotlib.axes.Axes
- Axis containing the plot.
+ Dict[str, str]
+ Optimal choice of the entrant, the incumbent and the outcome of the development. """pass@abc.abstractmethod
- defplot_equilibrium(self,axis:matplotlib.axes.Axes=None)->matplotlib.axes.Axes:
+ defplot_incumbent_best_answers(self,axis:matplotlib.axes.Axes=None)->matplotlib.axes.Axes:"""
- Plots the equilibrium path based on the choices of the entrant and incumbent.
+ Plots the best answers of the incumbent to all possible actions of the entrant. Parameters ----------
@@ -244,9 +282,9 @@
pass@abc.abstractmethod
- defplot_utilities(self,axis:matplotlib.axes.Axes=None)->matplotlib.axes.Axes:
+ defplot_equilibrium(self,axis:matplotlib.axes.Axes=None)->matplotlib.axes.Axes:"""
- Plots the utilities for different market configurations.
+ Plots the equilibrium path based on the choices of the entrant and incumbent. Parameters ----------
@@ -261,20 +299,19 @@
pass@abc.abstractmethod
- defget_optimal_choice(self,A:float,F:float):
+ defplot_utilities(self,axis:matplotlib.axes.Axes=None)->matplotlib.axes.Axes:"""
- Return the optimal choice of the entrant and the incumbent based on a pair of assets of the entrant ann fixed costs for copying of the incumbent.
+ Plots the utilities for different market configurations. Parameters ----------
- A : float
- Assets of the entrant.
- F : float
- Fixed costs for copying of the incumbent.
+ axis : matplotlib.axes.Axes
+ Axis to draw the plot on. (optional) Returns -------
- Optimal choice of the entrant and the incumbent.
+ matplotlib.axes.Axes
+ Axis containing the plot. """pass
@@ -314,6 +351,27 @@
"""@abc.abstractmethod
- defplot_incumbent_best_answers(self,axis:matplotlib.axes.Axes=None)->matplotlib.axes.Axes:
+ defget_optimal_choice(self,A:float,F:float)->Dict[str,str]:"""
- Plots the best answers of the incumbent to all possible actions of the entrant.
+ Return the optimal choice of the entrant and the incumbent based on a pair of assets of the entrant and fixed costs for copying of the incumbent.
+
+ The output dictionary will contain the following details:
+
+ - "entrant": choice of the entrant (possible choices listed in Shelegia_Motta_2021.IModel.IModel.ENTRANT_CHOICES))
+ - "incumbent": choice of the incumbent (possible choices listed in Shelegia_Motta_2021.IModel.IModel.INCUMBENT_CHOICES)
+ - "development": outcome of the development (possible outcomes listed in Shelegia_Motta_2021.IModel.IModel.DEVELOPMENT_OUTCOME) Parameters ----------
- axis : matplotlib.axes.Axes
- Axis to draw the plot on. (optional)
+ A : float
+ Assets of the entrant.
+ F : float
+ Fixed costs for copying of the incumbent. Returns -------
- matplotlib.axes.Axes
- Axis containing the plot.
+ Dict[str, str]
+ Optimal choice of the entrant, the incumbent and the outcome of the development. """pass@abc.abstractmethod
- defplot_equilibrium(self,axis:matplotlib.axes.Axes=None)->matplotlib.axes.Axes:
+ defplot_incumbent_best_answers(self,axis:matplotlib.axes.Axes=None)->matplotlib.axes.Axes:"""
- Plots the equilibrium path based on the choices of the entrant and incumbent.
+ Plots the best answers of the incumbent to all possible actions of the entrant. Parameters ----------
@@ -452,9 +518,9 @@
pass@abc.abstractmethod
- defplot_utilities(self,axis:matplotlib.axes.Axes=None)->matplotlib.axes.Axes:
+ defplot_equilibrium(self,axis:matplotlib.axes.Axes=None)->matplotlib.axes.Axes:"""
- Plots the utilities for different market configurations.
+ Plots the equilibrium path based on the choices of the entrant and incumbent. Parameters ----------
@@ -469,20 +535,19 @@
pass@abc.abstractmethod
- defget_optimal_choice(self,A:float,F:float):
+ defplot_utilities(self,axis:matplotlib.axes.Axes=None)->matplotlib.axes.Axes:"""
- Return the optimal choice of the entrant and the incumbent based on a pair of assets of the entrant ann fixed costs for copying of the incumbent.
+ Plots the utilities for different market configurations. Parameters ----------
- A : float
- Assets of the entrant.
- F : float
- Fixed costs for copying of the incumbent.
+ axis : matplotlib.axes.Axes
+ Axis to draw the plot on. (optional) Returns -------
- Optimal choice of the entrant and the incumbent.
+ matplotlib.axes.Axes
+ Axis containing the plot. """pass
@@ -517,9 +582,83 @@
@abc.abstractmethod
- defplot_incumbent_best_answers(self,axis:matplotlib.axes.Axes=None)->matplotlib.axes.Axes:
+ defget_optimal_choice(self,A:float,F:float)->Dict[str,str]:"""
- Plots the best answers of the incumbent to all possible actions of the entrant.
+ Return the optimal choice of the entrant and the incumbent based on a pair of assets of the entrant and fixed costs for copying of the incumbent.
+
+ The output dictionary will contain the following details:
+
+ - "entrant": choice of the entrant (possible choices listed in Shelegia_Motta_2021.IModel.IModel.ENTRANT_CHOICES))
+ - "incumbent": choice of the incumbent (possible choices listed in Shelegia_Motta_2021.IModel.IModel.INCUMBENT_CHOICES)
+ - "development": outcome of the development (possible outcomes listed in Shelegia_Motta_2021.IModel.IModel.DEVELOPMENT_OUTCOME) Parameters ----------
- axis : matplotlib.axes.Axes
- Axis to draw the plot on. (optional)
+ A : float
+ Assets of the entrant.
+ F : float
+ Fixed costs for copying of the incumbent. Returns -------
- matplotlib.axes.Axes
- Axis containing the plot.
+ Dict[str, str]
+ Optimal choice of the entrant, the incumbent and the outcome of the development. """pass
-
Plots the best answers of the incumbent to all possible actions of the entrant.
+
Return the optimal choice of the entrant and the incumbent based on a pair of assets of the entrant and fixed costs for copying of the incumbent.
+
+
The output dictionary will contain the following details:
@abc.abstractmethod
- defplot_equilibrium(self,axis:matplotlib.axes.Axes=None)->matplotlib.axes.Axes:
+ defplot_incumbent_best_answers(self,axis:matplotlib.axes.Axes=None)->matplotlib.axes.Axes:"""
- Plots the equilibrium path based on the choices of the entrant and incumbent.
+ Plots the best answers of the incumbent to all possible actions of the entrant. Parameters ----------
@@ -814,7 +968,7 @@
Returns
-
Plots the equilibrium path based on the choices of the entrant and incumbent.
+
Plots the best answers of the incumbent to all possible actions of the entrant.
@abc.abstractmethod
- defplot_utilities(self,axis:matplotlib.axes.Axes=None)->matplotlib.axes.Axes:
+ defplot_equilibrium(self,axis:matplotlib.axes.Axes=None)->matplotlib.axes.Axes:"""
- Plots the utilities for different market configurations.
+ Plots the equilibrium path based on the choices of the entrant and incumbent. Parameters ----------
@@ -866,7 +1020,7 @@
Returns
-
Plots the utilities for different market configurations.
+
Plots the equilibrium path based on the choices of the entrant and incumbent.
@abc.abstractmethod
- defget_optimal_choice(self,A:float,F:float):
+ defplot_utilities(self,axis:matplotlib.axes.Axes=None)->matplotlib.axes.Axes:"""
- Return the optimal choice of the entrant and the incumbent based on a pair of assets of the entrant ann fixed costs for copying of the incumbent.
+ Plots the utilities for different market configurations. Parameters ----------
- A : float
- Assets of the entrant.
- F : float
- Fixed costs for copying of the incumbent.
+ axis : matplotlib.axes.Axes
+ Axis to draw the plot on. (optional) Returns -------
- Optimal choice of the entrant and the incumbent.
+ matplotlib.axes.Axes
+ Axis containing the plot. """pass
-
Return the optimal choice of the entrant and the incumbent based on a pair of assets of the entrant ann fixed costs for copying of the incumbent.
+
Plots the utilities for different market configurations.
Parameters
-
A (float):
-Assets of the entrant.
-
F (float):
-Fixed costs for copying of the incumbent.
+
axis (matplotlib.axes.Axes):
+Axis to draw the plot on. (optional)
By default, the test code itself should be placed in a method named
+'runTest'.
+
+
If the fixture may be used for many test cases, create as
+many test methods as are needed. When instantiating such a TestCase
+subclass, specify in the constructor arguments the name of the test method
+that the instance is to execute.
+
+
Test authors should subclass TestCase for their own tests. Construction
+and deconstruction of the test's environment ('fixture') can be
+implemented by overriding the 'setUp' and 'tearDown' methods respectively.
+
+
If it is necessary to override the __init__ method, the base class
+__init__ method must always be called. It is important that subclasses
+should not change the signature of their __init__ method, since instances
+of the classes are instantiated automatically by parts of the framework
+in order to be run.
+
+
When subclassing TestCase, you can set these attributes:
+
+
+
failureException: determines which exception will be raised when
+the instance's assertion methods fail; test methods raising this
+exception will be deemed to have 'failed' rather than 'errored'.
+
longMessage: determines whether long messages (including repr of
+objects used in assert methods) will be printed on failure in addition
+to any explicit message passed.
+
maxDiff: sets the maximum length of a diff in failure messages
+by assert methods using difflib. It is looked up as an instance
+attribute so can be configured by individual tests if required.
small_delta : float ($\delta$) Additional utility gained from from a complement combined with a primary product. delta : float
- ($\Delta$) Additional utility gained from the primary product of the entrant compared to the primary product of the incumbent.
+ ($\Delta$) Additional utility gained from the substitute of the entrant compared to the primary product of the incumbent. K : float
- Investment costs to develop a second product for the entrant.
+ Investment costs for the entrant to develop a second product. """
+ super(BaseModel,self).__init__()assertsmall_delta/2<delta<3*small_delta/2,"(A1b) not satisfied."assertK<small_delta/2,"(A2) not satisfied."self._u:float=u
@@ -254,10 +256,27 @@
small_delta : float ($\delta$) Additional utility gained from from a complement combined with a primary product. delta : float
- ($\Delta$) Additional utility gained from the primary product of the entrant compared to the primary product of the incumbent.
+ ($\Delta$) Additional utility gained from the substitute of the entrant compared to the primary product of the incumbent. K : float
- Investment costs to develop a second product for the entrant.
+ Investment costs for the entrant to develop a second product. """
+ super(BaseModel,self).__init__()assertsmall_delta/2<delta<3*small_delta/2,"(A1b) not satisfied."assertK<small_delta/2,"(A2) not satisfied."self._u:float=u
@@ -588,10 +686,27 @@
small_delta : float ($\delta$) Additional utility gained from from a complement combined with a primary product. delta : float
- ($\Delta$) Additional utility gained from the primary product of the entrant compared to the primary product of the incumbent.
+ ($\Delta$) Additional utility gained from the substitute of the entrant compared to the primary product of the incumbent. K : float
- Investment costs to develop a second product for the entrant.
+ Investment costs for the entrant to develop a second product. """
+ super(BaseModel,self).__init__()assertsmall_delta/2<delta<3*small_delta/2,"(A1b) not satisfied."assertK<small_delta/2,"(A2) not satisfied."self._u:float=u
@@ -833,9 +1026,9 @@
Parameters
small_delta (float):
($\delta$) Additional utility gained from from a complement combined with a primary product.
delta (float):
-($\Delta$) Additional utility gained from the primary product of the entrant compared to the primary product of the incumbent.
+($\Delta$) Additional utility gained from the substitute of the entrant compared to the primary product of the incumbent.
K (float):
-Investment costs to develop a second product for the entrant.
+Investment costs for the entrant to develop a second product.
diff --git a/docs/search.js b/docs/search.js
index b8736a7..83a7afa 100644
--- a/docs/search.js
+++ b/docs/search.js
@@ -1,6 +1,6 @@
window.pdocSearch = (function(){
/** elasticlunr - http://weixsong.github.io * Copyright (C) 2017 Oliver Nightingale * Copyright (C) 2017 Wei Song * MIT Licensed */!function(){function e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),t.utils.toString=function(e){return void 0===e||null===e?"":e.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop(),n=e;if("function"!=typeof t)throw new TypeError("last argument must be a function");n.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},t.EventEmitter.prototype.removeListener=function(e,t){if(this.hasHandler(e)){var n=this.events[e].indexOf(t);-1!==n&&(this.events[e].splice(n,1),0==this.events[e].length&&delete this.events[e])}},t.EventEmitter.prototype.emit=function(e){if(this.hasHandler(e)){var t=Array.prototype.slice.call(arguments,1);this.events[e].forEach(function(e){e.apply(void 0,t)},this)}},t.EventEmitter.prototype.hasHandler=function(e){return e in this.events},t.tokenizer=function(e){if(!arguments.length||null===e||void 0===e)return[];if(Array.isArray(e)){var n=e.filter(function(e){return null===e||void 0===e?!1:!0});n=n.map(function(e){return t.utils.toString(e).toLowerCase()});var i=[];return n.forEach(function(e){var n=e.split(t.tokenizer.seperator);i=i.concat(n)},this),i}return e.toString().trim().toLowerCase().split(t.tokenizer.seperator)},t.tokenizer.defaultSeperator=/[\s\-]+/,t.tokenizer.seperator=t.tokenizer.defaultSeperator,t.tokenizer.setSeperator=function(e){null!==e&&void 0!==e&&"object"==typeof e&&(t.tokenizer.seperator=e)},t.tokenizer.resetSeperator=function(){t.tokenizer.seperator=t.tokenizer.defaultSeperator},t.tokenizer.getSeperator=function(){return t.tokenizer.seperator},t.Pipeline=function(){this._queue=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in t.Pipeline.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[n]=e},t.Pipeline.getRegisteredFunction=function(e){return e in t.Pipeline.registeredFunctions!=!0?null:t.Pipeline.registeredFunctions[e]},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.getRegisteredFunction(e);if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i+1,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i,0,n)},t.Pipeline.prototype.remove=function(e){var t=this._queue.indexOf(e);-1!==t&&this._queue.splice(t,1)},t.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,i=this._queue.length,o=0;n>o;o++){for(var r=e[o],s=0;i>s&&(r=this._queue[s](r,o,e),void 0!==r&&null!==r);s++);void 0!==r&&null!==r&&t.push(r)}return t},t.Pipeline.prototype.reset=function(){this._queue=[]},t.Pipeline.prototype.get=function(){return this._queue},t.Pipeline.prototype.toJSON=function(){return this._queue.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.DocumentStore,this.index={},this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var e=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,e)},t.Index.prototype.off=function(e,t){return this.eventEmitter.removeListener(e,t)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;n._fields=e.fields,n._ref=e.ref,n.documentStore=t.DocumentStore.load(e.documentStore),n.pipeline=t.Pipeline.load(e.pipeline),n.index={};for(var i in e.index)n.index[i]=t.InvertedIndex.load(e.index[i]);return n},t.Index.prototype.addField=function(e){return this._fields.push(e),this.index[e]=new t.InvertedIndex,this},t.Index.prototype.setRef=function(e){return this._ref=e,this},t.Index.prototype.saveDocument=function(e){return this.documentStore=new t.DocumentStore(e),this},t.Index.prototype.addDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.addDoc(i,e),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));this.documentStore.addFieldLength(i,n,o.length);var r={};o.forEach(function(e){e in r?r[e]+=1:r[e]=1},this);for(var s in r){var u=r[s];u=Math.sqrt(u),this.index[n].addToken(s,{ref:i,tf:u})}},this),n&&this.eventEmitter.emit("add",e,this)}},t.Index.prototype.removeDocByRef=function(e){if(e&&this.documentStore.isDocStored()!==!1&&this.documentStore.hasDoc(e)){var t=this.documentStore.getDoc(e);this.removeDoc(t,!1)}},t.Index.prototype.removeDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.hasDoc(i)&&(this.documentStore.removeDoc(i),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));o.forEach(function(e){this.index[n].removeToken(e,i)},this)},this),n&&this.eventEmitter.emit("remove",e,this))}},t.Index.prototype.updateDoc=function(e,t){var t=void 0===t?!0:t;this.removeDocByRef(e[this._ref],!1),this.addDoc(e,!1),t&&this.eventEmitter.emit("update",e,this)},t.Index.prototype.idf=function(e,t){var n="@"+t+"/"+e;if(Object.prototype.hasOwnProperty.call(this._idfCache,n))return this._idfCache[n];var i=this.index[t].getDocFreq(e),o=1+Math.log(this.documentStore.length/(i+1));return this._idfCache[n]=o,o},t.Index.prototype.getFields=function(){return this._fields.slice()},t.Index.prototype.search=function(e,n){if(!e)return[];e="string"==typeof e?{any:e}:JSON.parse(JSON.stringify(e));var i=null;null!=n&&(i=JSON.stringify(n));for(var o=new t.Configuration(i,this.getFields()).get(),r={},s=Object.keys(e),u=0;u0&&t.push(e);for(var i in n)"docs"!==i&&"df"!==i&&this.expandToken(e+i,t,n[i]);return t},t.InvertedIndex.prototype.toJSON=function(){return{root:this.root}},t.Configuration=function(e,n){var e=e||"";if(void 0==n||null==n)throw new Error("fields should not be null");this.config={};var i;try{i=JSON.parse(e),this.buildUserConfig(i,n)}catch(o){t.utils.warn("user configuration parse failed, will use default configuration"),this.buildDefaultConfig(n)}},t.Configuration.prototype.buildDefaultConfig=function(e){this.reset(),e.forEach(function(e){this.config[e]={boost:1,bool:"OR",expand:!1}},this)},t.Configuration.prototype.buildUserConfig=function(e,n){var i="OR",o=!1;if(this.reset(),"bool"in e&&(i=e.bool||i),"expand"in e&&(o=e.expand||o),"fields"in e)for(var r in e.fields)if(n.indexOf(r)>-1){var s=e.fields[r],u=o;void 0!=s.expand&&(u=s.expand),this.config[r]={boost:s.boost||0===s.boost?s.boost:1,bool:s.bool||i,expand:u}}else t.utils.warn("field name in user configuration not found in index instance fields");else this.addAllFields2UserConfig(i,o,n)},t.Configuration.prototype.addAllFields2UserConfig=function(e,t,n){n.forEach(function(n){this.config[n]={boost:1,bool:e,expand:t}},this)},t.Configuration.prototype.get=function(){return this.config},t.Configuration.prototype.reset=function(){this.config={}},lunr.SortedSet=function(){this.length=0,this.elements=[]},lunr.SortedSet.load=function(e){var t=new this;return t.elements=e,t.length=e.length,t},lunr.SortedSet.prototype.add=function(){var e,t;for(e=0;e1;){if(r===e)return o;e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o]}return r===e?o:-1},lunr.SortedSet.prototype.locationFor=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;)e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o];return r>e?o:e>r?o+1:void 0},lunr.SortedSet.prototype.intersect=function(e){for(var t=new lunr.SortedSet,n=0,i=0,o=this.length,r=e.length,s=this.elements,u=e.elements;;){if(n>o-1||i>r-1)break;s[n]!==u[i]?s[n]u[i]&&i++:(t.add(s[n]),n++,i++)}return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){var t,n,i;this.length>=e.length?(t=this,n=e):(t=e,n=this),i=t.clone();for(var o=0,r=n.toArray();oThis package implements the models of Shelegia and Motta (2021).\n\n
Since all models implement the Shelegia_Motta_2021.IModel.IModel - Interface, therefore all models provide the same functionality (public methods), even though the results may change substantially.
\n\n
For all models add the following import statement:
# every model type can be plugged in\nmodel: Shelegia_Motta_2021.IModel.IModel = Shelegia_Motta_2021.Models.BaseModel()\n\n# print string representation of the model\nprint(model)\n\n# plot the best answers of the incumbent to the choice of the entrant\nmodel.plot_incumbent_best_answers()\n\n# plot the equilibrium path\nmodel.plot_equilibrium()\n
By default, the test code itself should be placed in a method named\n'runTest'.
\n\n
If the fixture may be used for many test cases, create as\nmany test methods as are needed. When instantiating such a TestCase\nsubclass, specify in the constructor arguments the name of the test method\nthat the instance is to execute.
\n\n
Test authors should subclass TestCase for their own tests. Construction\nand deconstruction of the test's environment ('fixture') can be\nimplemented by overriding the 'setUp' and 'tearDown' methods respectively.
\n\n
If it is necessary to override the __init__ method, the base class\n__init__ method must always be called. It is important that subclasses\nshould not change the signature of their __init__ method, since instances\nof the classes are instantiated automatically by parts of the framework\nin order to be run.
\n\n
When subclassing TestCase, you can set these attributes:
\n\n
\n
failureException: determines which exception will be raised when\nthe instance's assertion methods fail; test methods raising this\nexception will be deemed to have 'failed' rather than 'errored'.
\n
longMessage: determines whether long messages (including repr of\nobjects used in assert methods) will be printed on failure in addition\nto any explicit message passed.
\n
maxDiff: sets the maximum length of a diff in failure messages\nby assert methods using difflib. It is looked up as an instance\nattribute so can be configured by individual tests if required.
There are two players in our base model: the Incumbent, which sells the primary product, denoted\nby Ip, and a start-up, that we call Entrant, which sells a product Ec complementary to Ip. (One may\nthink of Ip as a platform, and Ec as a service or product which can be accessed through the platform.)\nWe are interested in studying the choice of E between developing a substitute to Ip, denoted by\nEp, or another complement to Ip, denoted by E\u02dcc;23 and the choice of I between copying E\u2019s original\ncomplementary product Ec by creating a perfect substitute Ic, or not.24 Since E may not have enough\nassets to cover the development cost of its second product, copying its current product will a\u21b5ect E\u2019s\nability to obtain funding
u (float):\nUtility gained from consuming the primary product
\n
B (float):\nMinimal difference between the return in case of a success and the return in case of failure of E. B is called the private benefit of E in case of failure.
\n
small_delta (float):\n($\\delta$) Additional utility gained from from a complement combined with a primary product.
\n
delta (float):\n($\\Delta$) Additional utility gained from the primary product of the entrant compared to the primary product of the incumbent.
\n
K (float):\nInvestment costs to develop a second product for the entrant.
There are two players in our base model: the Incumbent, which sells the primary product, denoted\nby Ip, and a start-up, that we call Entrant, which sells a product Ec complementary to Ip. (One may\nthink of Ip as a platform, and Ec as a service or product which can be accessed through the platform.)\nWe are interested in studying the choice of E between developing a substitute to Ip, denoted by\nEp, or another complement to Ip, denoted by E\u02dcc;23 and the choice of I between copying E\u2019s original\ncomplementary product Ec by creating a perfect substitute Ic, or not.24 Since E may not have enough\nassets to cover the development cost of its second product, copying its current product will a\u21b5ect E\u2019s\nability to obtain funding
There are two players in our base model: the Incumbent, which sells the primary product, denoted\nby Ip, and a start-up, that we call Entrant, which sells a product Ec complementary to Ip. (One may\nthink of Ip as a platform, and Ec as a service or product which can be accessed through the platform.)\nWe are interested in studying the choice of E between developing a substitute to Ip, denoted by\nEp, or another complement to Ip, denoted by E\u02dcc;23 and the choice of I between copying E\u2019s original\ncomplementary product Ec by creating a perfect substitute Ic, or not.24 Since E may not have enough\nassets to cover the development cost of its second product, copying its current product will a\u21b5ect E\u2019s\nability to obtain funding
u (float):\nUtility gained from consuming the primary product
\n
B (float):\nMinimal difference between the return in case of a success and the return in case of failure of E. B is called the private benefit of E in case of failure.
\n
small_delta (float):\n($\\delta$) Additional utility gained from from a complement combined with a primary product.
\n
delta (float):\n($\\Delta$) Additional utility gained from the primary product of the entrant compared to the primary product of the incumbent.
\n
K (float):\nInvestment costs to develop a second product for the entrant.
There are two players in our base model: the Incumbent, which sells the primary product, denoted\nby Ip, and a start-up, that we call Entrant, which sells a product Ec complementary to Ip. (One may\nthink of Ip as a platform, and Ec as a service or product which can be accessed through the platform.)\nWe are interested in studying the choice of E between developing a substitute to Ip, denoted by\nEp, or another complement to Ip, denoted by E\u02dcc;23 and the choice of I between copying E\u2019s original\ncomplementary product Ec by creating a perfect substitute Ic, or not.24 Since E may not have enough\nassets to cover the development cost of its second product, copying its current product will a\u21b5ect E\u2019s\nability to obtain funding
u (float):\nUtility gained from consuming the primary product
\n
B (float):\nMinimal difference between the return in case of a success and the return in case of failure of E. B is called the private benefit of E in case of failure.
\n
small_delta (float):\n($\\delta$) Additional utility gained from from a complement combined with a primary product.
\n
delta (float):\n($\\Delta$) Additional utility gained from the primary product of the entrant compared to the primary product of the incumbent.
\n
K (float):\nInvestment costs to develop a second product for the entrant.
Since all models implement the Shelegia_Motta_2021.IModel.IModel - Interface, therefore all models provide the same functionality (public methods), even though the results may change substantially.
\n\n
For all models add the following import statement:
# every model type can be plugged in\nmodel: Shelegia_Motta_2021.IModel.IModel = Shelegia_Motta_2021.Models.BaseModel()\n\n# print string representation of the model\nprint(model)\n\n# plot the best answers of the incumbent to the choice of the entrant\nmodel.plot_incumbent_best_answers()\n\n# plot the equilibrium path\nmodel.plot_equilibrium()\n
By default, the test code itself should be placed in a method named\n'runTest'.
\n\n
If the fixture may be used for many test cases, create as\nmany test methods as are needed. When instantiating such a TestCase\nsubclass, specify in the constructor arguments the name of the test method\nthat the instance is to execute.
\n\n
Test authors should subclass TestCase for their own tests. Construction\nand deconstruction of the test's environment ('fixture') can be\nimplemented by overriding the 'setUp' and 'tearDown' methods respectively.
\n\n
If it is necessary to override the __init__ method, the base class\n__init__ method must always be called. It is important that subclasses\nshould not change the signature of their __init__ method, since instances\nof the classes are instantiated automatically by parts of the framework\nin order to be run.
\n\n
When subclassing TestCase, you can set these attributes:
\n\n
\n
failureException: determines which exception will be raised when\nthe instance's assertion methods fail; test methods raising this\nexception will be deemed to have 'failed' rather than 'errored'.
\n
longMessage: determines whether long messages (including repr of\nobjects used in assert methods) will be printed on failure in addition\nto any explicit message passed.
\n
maxDiff: sets the maximum length of a diff in failure messages\nby assert methods using difflib. It is looked up as an instance\nattribute so can be configured by individual tests if required.
There are two players in our base model: the Incumbent, which sells the primary product, denoted\nby Ip, and a start-up, that we call Entrant, which sells a product Ec complementary to Ip. (One may\nthink of Ip as a platform, and Ec as a service or product which can be accessed through the platform.)\nWe are interested in studying the choice of E between developing a substitute to Ip, denoted by\nEp, or another complement to Ip, denoted by E\u02dcc;23 and the choice of I between copying E\u2019s original\ncomplementary product Ec by creating a perfect substitute Ic, or not.24 Since E may not have enough\nassets to cover the development cost of its second product, copying its current product will a\u21b5ect E\u2019s\nability to obtain funding
u (float):\nUtility gained from consuming the primary product
\n
B (float):\nMinimal difference between the return in case of a success and the return in case of failure of E. B is called the private benefit of E in case of failure.
\n
small_delta (float):\n($\\delta$) Additional utility gained from from a complement combined with a primary product.
\n
delta (float):\n($\\Delta$) Additional utility gained from the substitute of the entrant compared to the primary product of the incumbent.
\n
K (float):\nInvestment costs for the entrant to develop a second product.
There are two players in our base model: the Incumbent, which sells the primary product, denoted\nby Ip, and a start-up, that we call Entrant, which sells a product Ec complementary to Ip. (One may\nthink of Ip as a platform, and Ec as a service or product which can be accessed through the platform.)\nWe are interested in studying the choice of E between developing a substitute to Ip, denoted by\nEp, or another complement to Ip, denoted by E\u02dcc;23 and the choice of I between copying E\u2019s original\ncomplementary product Ec by creating a perfect substitute Ic, or not.24 Since E may not have enough\nassets to cover the development cost of its second product, copying its current product will a\u21b5ect E\u2019s\nability to obtain funding
There are two players in our base model: the Incumbent, which sells the primary product, denoted\nby Ip, and a start-up, that we call Entrant, which sells a product Ec complementary to Ip. (One may\nthink of Ip as a platform, and Ec as a service or product which can be accessed through the platform.)\nWe are interested in studying the choice of E between developing a substitute to Ip, denoted by\nEp, or another complement to Ip, denoted by E\u02dcc;23 and the choice of I between copying E\u2019s original\ncomplementary product Ec by creating a perfect substitute Ic, or not.24 Since E may not have enough\nassets to cover the development cost of its second product, copying its current product will a\u21b5ect E\u2019s\nability to obtain funding
u (float):\nUtility gained from consuming the primary product
\n
B (float):\nMinimal difference between the return in case of a success and the return in case of failure of E. B is called the private benefit of E in case of failure.
\n
small_delta (float):\n($\\delta$) Additional utility gained from from a complement combined with a primary product.
\n
delta (float):\n($\\Delta$) Additional utility gained from the substitute of the entrant compared to the primary product of the incumbent.
\n
K (float):\nInvestment costs for the entrant to develop a second product.
There are two players in our base model: the Incumbent, which sells the primary product, denoted\nby Ip, and a start-up, that we call Entrant, which sells a product Ec complementary to Ip. (One may\nthink of Ip as a platform, and Ec as a service or product which can be accessed through the platform.)\nWe are interested in studying the choice of E between developing a substitute to Ip, denoted by\nEp, or another complement to Ip, denoted by E\u02dcc;23 and the choice of I between copying E\u2019s original\ncomplementary product Ec by creating a perfect substitute Ic, or not.24 Since E may not have enough\nassets to cover the development cost of its second product, copying its current product will a\u21b5ect E\u2019s\nability to obtain funding
u (float):\nUtility gained from consuming the primary product
\n
B (float):\nMinimal difference between the return in case of a success and the return in case of failure of E. B is called the private benefit of E in case of failure.
\n
small_delta (float):\n($\\delta$) Additional utility gained from from a complement combined with a primary product.
\n
delta (float):\n($\\Delta$) Additional utility gained from the substitute of the entrant compared to the primary product of the incumbent.
\n
K (float):\nInvestment costs for the entrant to develop a second product.
\n
\n", "parameters": ["self", "u", "B", "small_delta", "delta", "K", "gamma"], "funcdef": "def"}];
// mirrored in build-search-index.js (part 1)
// Also split on html tags. this is a cheap heuristic, but good enough.
diff --git a/setup.py b/setup.py
index d13de14..52660fb 100644
--- a/setup.py
+++ b/setup.py
@@ -9,7 +9,7 @@
setup(
name='Shelegia_Motta_2021',
- packages=['matplotlib', 'numpy'],
+ packages=find_packages(),
version='0.0.3',
license='MIT',
description='Implements the model presented in Shelegia and Motta (2021)',
@@ -30,4 +30,8 @@
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8',
],
+ install_requires=[
+ "matplotlib>=3.4.3",
+ "numpy>=1.17",
+ ],
)