├── tests ├── __init__.py └── multi_svr_test.py ├── .gitignore ├── Pipfile ├── examples └── example1.py ├── .travis.yml ├── setup.py ├── multi_svr └── __init__.py ├── README.md └── Pipfile.lock /tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea 2 | *.egg-info/ 3 | __pycache__/ -------------------------------------------------------------------------------- /Pipfile: -------------------------------------------------------------------------------- 1 | [[source]] 2 | verify_ssl = true 3 | name = "pypi" 4 | url = "https://pypi.org/simple" 5 | 6 | [dev-packages] 7 | toml = "*" 8 | coveralls = "*" 9 | 10 | [packages] 11 | certifi = "==2017.11.5" 12 | chardet = "==3.0.4" 13 | docopt = "==0.6.2" 14 | idna = "==2.6" 15 | numpy = "==1.13.3" 16 | requests = "==2.20.1" 17 | scikit-learn = "==0.19.1" 18 | scipy = "==1.0.0" 19 | "urllib3" = "==1.22" 20 | 21 | [requires] 22 | python_version = "3.5" 23 | -------------------------------------------------------------------------------- /examples/example1.py: -------------------------------------------------------------------------------- 1 | import multi_svr 2 | from sklearn import metrics 3 | 4 | X = [ 5 | [0, 0], 6 | [0, 10], 7 | [1, 10], 8 | [1, 20], 9 | [1, 30], 10 | [1, 40] 11 | ] 12 | 13 | y = [ 14 | [0, 0], 15 | [0, 10], 16 | [2, 10], 17 | [2, 20], 18 | [2, 30], 19 | [2, 40] 20 | ] 21 | 22 | # Create SVR 23 | regressor = multi_svr.MultiSVR(kernel='linear') 24 | # Fit 25 | regressor.fit(X, y) 26 | # Predict 27 | pred_y = regressor.predict(X) 28 | # Calc errors 29 | errs = metrics.mean_squared_error(y, pred_y) 30 | 31 | print('pred_y:', pred_y) 32 | print('errs:', errs) -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | # (from: https://qiita.com/masashi127/items/5bfcba5cad8e82958844) 2 | 3 | language: python 4 | 5 | python: 6 | - 3.4 7 | - 3.5 8 | - 3.6 9 | 10 | addons: 11 | apt: 12 | packages: 13 | # (from: https://github.com/dnouri/nolearn/blob/master/.travis.yml) 14 | - libblas-dev 15 | - liblapack-dev 16 | - gfortran 17 | 18 | 19 | before_install: 20 | - pip install -U pip setuptools wheel # (from: https://github.com/dnouri/nolearn/blob/master/.travis.yml) 21 | 22 | install: 23 | - pip install pipenv 24 | 25 | script: 26 | - pipenv install 27 | - pipenv install --dev 28 | - pipenv run coverage run --source=multi_svr setup.py test 29 | 30 | - pip3 install --upgrade git+https://github.com/nwtgck/multi-svr-python.git#$TRAVIS_COMMIT 31 | - python examples/example1.py 32 | 33 | after_success: 34 | - coveralls 35 | 36 | cache: 37 | - apt 38 | - directories: 39 | - $HOME/.cache/pip -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | # (from: https://github.com/masaponto/Python-MLP/blob/master/setup.py) 2 | # (from: https://qiita.com/masashi127/items/5bfcba5cad8e82958844) 3 | # (from: https://qiita.com/hotoku/items/4789533f5e497f3dc6e0) 4 | 5 | from setuptools import setup, find_packages 6 | import sys 7 | import toml 8 | 9 | def name_ver_join(name, ver): 10 | if ver == "*": 11 | return name 12 | else: 13 | return name + ver 14 | with open("Pipfile") as f: 15 | pipfile_dict = toml.load(f) 16 | install_requires = [name_ver_join(name, ver) for name, ver in pipfile_dict['packages'].items()] 17 | 18 | 19 | sys.path.append('./tests') 20 | 21 | setup( 22 | name='multi_svr', 23 | version='0.1.2', 24 | description='SVR for multidimensional label', 25 | author='Ryo Ota', 26 | author_email='nwtgck@nwtgck.org', 27 | install_requires=install_requires, 28 | py_modules=["multi_svr"], 29 | packages=find_packages(), 30 | test_suite='tests' 31 | ) 32 | -------------------------------------------------------------------------------- /tests/multi_svr_test.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | from sklearn import metrics 3 | 4 | import multi_svr 5 | 6 | class MultiSVRTest(unittest.TestCase): 7 | 8 | def test_prediction(self): 9 | X = [ 10 | [0, 0], 11 | [0, 10], 12 | [1, 10], 13 | [1, 20], 14 | [1, 30], 15 | [1, 40] 16 | ] 17 | 18 | y = [ 19 | [0, 0], 20 | [0, 10], 21 | [2, 10], 22 | [2, 20], 23 | [2, 30], 24 | [2, 40] 25 | ] 26 | 27 | # Create SVR 28 | regressor = multi_svr.MultiSVR(kernel='linear') 29 | # Fit 30 | regressor.fit(X, y) 31 | # Predict 32 | pred_y = regressor.predict(X) 33 | # Calc errors 34 | errs = metrics.mean_squared_error(y, pred_y, multioutput='raw_values') 35 | 36 | # Errors should be small 37 | assert(errs[0] < 0.05) 38 | assert(errs[1] < 0.05) 39 | 40 | 41 | def suite(): 42 | suite = unittest.TestSuite() 43 | suite.addTest(unittest.makeSuite(MultiSVRTest)) 44 | return suite -------------------------------------------------------------------------------- /multi_svr/__init__.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import sklearn 3 | from sklearn import svm 4 | 5 | 6 | class MultiSVR(sklearn.base.BaseEstimator, sklearn.base.RegressorMixin): 7 | def __init__(self, **kwargs): 8 | self.__init_kwargs = kwargs 9 | 10 | def fit(self, X, y, **kwargs): 11 | X = np.array(X) 12 | y = np.array(y) 13 | 14 | # Get dimension of y 15 | y_dim = np.ndim(y) 16 | if(y_dim == 2): 17 | # Feature dimension 18 | feature_dim = len(y[0]) 19 | # Create SVRs 20 | self.svrs = [svm.SVR(**self.__init_kwargs) for _ in range(feature_dim)] 21 | 22 | # For each SVR 23 | for curr_feature_dim, svr in enumerate(self.svrs): # (curr=Current) 24 | # Select y 25 | selected_y = y[:,curr_feature_dim] 26 | # Fit 27 | svr.fit(X, selected_y, **kwargs) 28 | else: 29 | raise Exception("Dimension of y must be 2, but found %d" % y_dim) 30 | 31 | 32 | def predict(self, X): 33 | # Init predict list 34 | preds = [] 35 | # For each SVR 36 | for curr_feature_dim, svr in enumerate(self.svrs): # (curr=Current) 37 | # Predict 38 | pred = svr.predict(X) 39 | # Append to preds 40 | preds.append(pred) 41 | 42 | pred = np.column_stack(tuple(preds)) 43 | return pred 44 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # multi_svr 2 | [![Build Status](https://travis-ci.org/nwtgck/multi-svr-python.svg?branch=develop)](https://travis-ci.org/nwtgck/multi-svr-python) [![Coverage Status](https://coveralls.io/repos/github/nwtgck/multi-svr-python/badge.svg?branch=develop)](https://coveralls.io/github/nwtgck/multi-svr-python?branch=develop) 3 | 4 | Support Vector Regression (SVR) for multidimensional labels 5 | 6 | 7 | ## Install with pip 8 | 9 | ```bash 10 | pip3 install git+https://github.com/nwtgck/multi-svr-python 11 | ``` 12 | 13 | ## Install with Pipenv 14 | 15 | ```bash 16 | pipenv install --dev toml 17 | pipenv install git+https://github.com/nwtgck/multi-svr-python.git@v0.1.2#egg=multi_svr 18 | ``` 19 | 20 | ## Usage 21 | 22 | ```python 23 | import multi_svr 24 | from sklearn import metrics 25 | 26 | X = [ 27 | [0, 0], 28 | [0, 10], 29 | [1, 10], 30 | [1, 20], 31 | [1, 30], 32 | [1, 40] 33 | ] 34 | 35 | y = [ 36 | [0, 0], 37 | [0, 10], 38 | [2, 10], 39 | [2, 20], 40 | [2, 30], 41 | [2, 40] 42 | ] 43 | 44 | # Create SVR 45 | regressor = multi_svr.MultiSVR(kernel='linear') 46 | # Fit 47 | regressor.fit(X, y) 48 | # Predict 49 | pred_y = regressor.predict(X) 50 | # Calc errors 51 | errs = metrics.mean_squared_error(y, pred_y) 52 | ``` 53 | 54 | ## How to test 55 | 56 | ```bash 57 | cd 58 | python setup.py test 59 | ``` -------------------------------------------------------------------------------- /Pipfile.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_meta": { 3 | "hash": { 4 | "sha256": "6f91584252515088aa81b90fdfb608868fe53dddd87987cfdadc496c36ed637a" 5 | }, 6 | "pipfile-spec": 6, 7 | "requires": { 8 | "python_version": "3.5" 9 | }, 10 | "sources": [ 11 | { 12 | "name": "pypi", 13 | "url": "https://pypi.org/simple", 14 | "verify_ssl": true 15 | } 16 | ] 17 | }, 18 | "default": { 19 | "certifi": { 20 | "hashes": [ 21 | "sha256:244be0d93b71e93fc0a0a479862051414d0e00e16435707e5bf5000f92e04694", 22 | "sha256:5ec74291ca1136b40f0379e1128ff80e866597e4e2c1e755739a913bbc3613c0" 23 | ], 24 | "index": "pypi", 25 | "version": "==2017.11.5" 26 | }, 27 | "chardet": { 28 | "hashes": [ 29 | "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", 30 | "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" 31 | ], 32 | "index": "pypi", 33 | "version": "==3.0.4" 34 | }, 35 | "docopt": { 36 | "hashes": [ 37 | "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491" 38 | ], 39 | "index": "pypi", 40 | "version": "==0.6.2" 41 | }, 42 | "idna": { 43 | "hashes": [ 44 | "sha256:2c6a5de3089009e3da7c5dde64a141dbc8551d5b7f6cf4ed7c2568d0cc520a8f", 45 | "sha256:8c7309c718f94b3a625cb648ace320157ad16ff131ae0af362c9f21b80ef6ec4" 46 | ], 47 | "index": "pypi", 48 | "version": "==2.6" 49 | }, 50 | "numpy": { 51 | "hashes": [ 52 | "sha256:09b87d652c03508447d0f618e1d3ae57595acd3e0f0c11ac91bf68ed7bdb3a28", 53 | "sha256:11fcbed36c101a3b9c4636e791efccba82409ebbedaba938c97be8bdddd029cc", 54 | "sha256:2875e8055a1ea8d933b1c9d0f8714c0aa11c097bfadfcb8564c4d868fbf09a41", 55 | "sha256:36ee86d5adbabc4fa2643a073f93d5504bdfed37a149a3a49f4dde259f35a750", 56 | "sha256:479863de17f66810db00bccf35289555365da45d3b053ccf539b95ab3b9c24f6", 57 | "sha256:4c767b6d9c9a071bb36ea34eb240ee5192fe0bc4c13be5e6c51e0350a30f7ac0", 58 | "sha256:539345898a4ae17421c159ae2a350901a5e6ce3da8f24168c6c67b3536e13de8", 59 | "sha256:62b09f3d1ea01d79c16a6642cb21599f53b9338c59971b2418a573155d2202ec", 60 | "sha256:6c6feb0647380db6e1d5d49ef9fb59c42240f25fb8df8b6e82ecb436c7e0621a", 61 | "sha256:7dfa5b49fb2a080bd0d39bfbcff1177bacb14fcb28c857fd65fd0c18938935de", 62 | "sha256:8969c8f987f8bcc3e30c014532cfc20e4a8f86a50c361596e086310853adacb7", 63 | "sha256:910e7ae5eeee8d322775187692c5c66719cd58d230fbfd57245ea3cf75716910", 64 | "sha256:929928932f91082a168e36984179deddd58f8e98822ad2f33a2955d7c4eec596", 65 | "sha256:9cad35b911e150f00bb8080950c7e9f172714bbd0234f5ab74b4e3e2d9288b37", 66 | "sha256:b162c6b044960b4ea0f42be049ce2af1d18c60f82748f0a27bd5ad182a731bf3", 67 | "sha256:b2f98838f4bbc3bf23af7e97ffcad18a2dc6bbb0726796781e02b9347af6685f", 68 | "sha256:c4b1914d86c43399438518a2ac8bcba2fb64dd5a18efddded3783b9daae70933", 69 | "sha256:c8dc6aa96882df6323bf9545934e37c6e05959bd789ae4b14d50509b093907aa", 70 | "sha256:d29e72413b66df23c75b9b469253c823698ea2e00f58e9e0df64b7a50696e8ac", 71 | "sha256:da2f47e46d7a93b73891d1981378717dc73c6ad5cc4fd23c934bfea7847fa958", 72 | "sha256:e8e0e75db757e41463888939d26c8058b4ecd25e563c597e9119f512dc0ee1da", 73 | "sha256:f5c9ca457057cd5e12ddab36cded8b1f38bf1f45bf550d4ca2839b11ec57f597", 74 | "sha256:fa656dccfa9141774440575a6e7875d08b93f4a332eb5ae40877b26bed291c01" 75 | ], 76 | "index": "pypi", 77 | "version": "==1.13.3" 78 | }, 79 | "requests": { 80 | "hashes": [ 81 | "sha256:65b3a120e4329e33c9889db89c80976c5272f56ea92d3e74da8a463992e3ff54", 82 | "sha256:ea881206e59f41dbd0bd445437d792e43906703fff75ca8ff43ccdb11f33f263" 83 | ], 84 | "index": "pypi", 85 | "version": "==2.20.1" 86 | }, 87 | "scikit-learn": { 88 | "hashes": [ 89 | "sha256:13136c6e4f6b808569f7f59299d439b2cd718f85d72ea14b5b6077d44ebc7d17", 90 | "sha256:370919e3148253fd6552496c33a1e3d78290a336fc8d1b9349d9e9770fae6ec0", 91 | "sha256:3775cca4ce3f94508bb7c8a6b113044b78c16b0a30a5c169ddeb6b9fe57a8a72", 92 | "sha256:42f3c5bd893ed73bf47ccccf04dfb98fae743f397d688bb58c2238c0e6ec15d2", 93 | "sha256:56cfa19c31edf62e6414da0a337efee37a4af488b135640e67238786b9be6ab3", 94 | "sha256:5c9ff456d67ef9094e5ea272fff2be05d399a47fc30c6c8ed653b94bdf787bd1", 95 | "sha256:5ca0ad32ee04abe0d4ba02c8d89d501b4e5e0304bdf4d45c2e9875a735b323a0", 96 | "sha256:5db9e68a384ce80a17fc449d4d5d9b45025fe17cf468429599bf404eccb51049", 97 | "sha256:72c194c5092e921d6107a8de8a5adae58c35bbc54e030ba624b6f02fd823bb21", 98 | "sha256:871669cdb5b3481650fe3adff46eb97c455e30ecdc307eaf382ef90d4e2570ab", 99 | "sha256:873245b03361710f47c5410a050dc56ee8ae97b9f8dcc6e3a81521ca2b64ad10", 100 | "sha256:8b17fc29554c5c98d88142f895516a5bec2b6b61daa815e1193a64c868ad53d2", 101 | "sha256:95b155ef6bf829ddfba6026f100ba8e4218b7171ecab97b2163bc9e8d206848f", 102 | "sha256:a21cf8217e31a9e8e32c559246e05e6909981816152406945ae2e3e244dfcc1f", 103 | "sha256:ba3fd442ae1a46830789b3578867daaf2c8409dcca6bf192e30e85beeabbfc2f", 104 | "sha256:ce78bf4d10bd7e28807c36c6d2ab25a9934aaf80906ad987622a5e45627d91a2", 105 | "sha256:d384e6f9a055b7a43492f9d27779adb717eb5dcf78b0603b01d0f070a608d241", 106 | "sha256:d4da369614e55540c7e830ccdd17ab4fe5412ff8e803a4906d3ece393e2e3a63", 107 | "sha256:ddc1eb10138ae93c136cc4b5945d3977f302b5d693592a4731b2805a7d7f2a74", 108 | "sha256:e54a3dd1fe1f8124de90b93c48d120e6da2ea8df29b6895325df01ddc1bd8e26", 109 | "sha256:ee8c3b1898c728b6e5b5659c233f547700a1fea13ce876b6fe7d3434c70cc0e0", 110 | "sha256:f528c4b2bba652cf116f5cccf36f4db95a7f9cbfcd1ee549c4e8d0f8628783b5", 111 | "sha256:f9abae483f4d52acd6f660addb1b67e35dc5748655250af479de2ea6aefc6df0" 112 | ], 113 | "index": "pypi", 114 | "version": "==0.19.1" 115 | }, 116 | "scipy": { 117 | "hashes": [ 118 | "sha256:01c7040a83eb4e020ab729488637dcadef54cb728b035b76668ab92a72515d60", 119 | "sha256:046705c604c6f1d63cad3e89677c0618b7abb40ed09a4c241c671a2d8e5128a9", 120 | "sha256:08041e5336fcd57defcc78650b44b3df652eff3e3a801638d894e50494fb630d", 121 | "sha256:1f58fbd59e8d9652759df0d137832ff2a325ed708c173cba20c86589d811c210", 122 | "sha256:23a7238279ae94e088396b8b05a9795ef598dc79c5cd1adb91ad1ff87c7514fd", 123 | "sha256:3b66d5e40152175bca75cbbfd1eb5c108c50de9ae5625923f1c4f8f51cbe2dea", 124 | "sha256:424500b2fe573d30de6dea927076c01acaadb3efb3d1f40340e8cc37151ccf27", 125 | "sha256:5774adb6047983489bc81edaa72cd132e665e5680f0b2cf8ea28cd3b99e65d39", 126 | "sha256:5964dba6a3c0be226d44d2520de8fb4ba1501768bad57eec687d36d3f53b6254", 127 | "sha256:70e6fc3f2f52c9152f05e27eb9bd8543cb862cacb71f8521a571e4ffb837f450", 128 | "sha256:87ea1f11a0e9ec08c264dc64551d501fa307289460705f6fccd84cbfc7926d10", 129 | "sha256:889602ead28054a15e8c26e1a6b8420d5a4fa777cfeb3ec98cfa52b9f317d153", 130 | "sha256:912499ddb521b7ac6287ac4ccf5f296a83d38996c2d04f43c9e62a91f7b420aa", 131 | "sha256:97123a25216616723083942eb595f47fee18da6b637a88b803de5f078009003c", 132 | "sha256:9bd193686fd837472bdb6425486cb234ed0a4db76b930c141cc8d095ab213c8d", 133 | "sha256:a79b99b8b5af9a63312bd053bbb7bdb7710e6bbb9cc81617f9f6b9b1e49c72f8", 134 | "sha256:a9e479648aab5f36330da94f351ebbfe79acb4e6f5e6ac6aeddc9291eb096839", 135 | "sha256:bf36f3485e7b7291c36330a93bbfd4f5e8db23bbe4ea46c37b2839fef463f4e2", 136 | "sha256:cd23894e1cc6eaa00e6807b6b12e4ca66d5ff092986c9c3eb01e97f24e2d6462", 137 | "sha256:d84df0bc86bbdd49f0a6b6bad5cd62ccb02a3bfe546bf79263de44ae081bcd7b", 138 | "sha256:e3a5673c105eab802fdecb77f102d877352e201df9328698a265b7f57546b34b", 139 | "sha256:fa17be6c66985931d3a391f61a6ba97c902585cf26020aa3eb24604115732d22", 140 | "sha256:ff8b6637d8d2c074ed67f3d57513e62f94747c6f1210f43e60ad3d8e93a424e4" 141 | ], 142 | "index": "pypi", 143 | "version": "==1.0.0" 144 | }, 145 | "urllib3": { 146 | "hashes": [ 147 | "sha256:06330f386d6e4b195fbfc736b297f58c5a892e4440e54d294d7004e3a9bbea1b", 148 | "sha256:cc44da8e1145637334317feebd728bd869a35285b93cbb4cca2577da7e62db4f" 149 | ], 150 | "index": "pypi", 151 | "version": "==1.22" 152 | } 153 | }, 154 | "develop": { 155 | "certifi": { 156 | "hashes": [ 157 | "sha256:244be0d93b71e93fc0a0a479862051414d0e00e16435707e5bf5000f92e04694", 158 | "sha256:5ec74291ca1136b40f0379e1128ff80e866597e4e2c1e755739a913bbc3613c0" 159 | ], 160 | "index": "pypi", 161 | "version": "==2017.11.5" 162 | }, 163 | "chardet": { 164 | "hashes": [ 165 | "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", 166 | "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" 167 | ], 168 | "index": "pypi", 169 | "version": "==3.0.4" 170 | }, 171 | "coverage": { 172 | "hashes": [ 173 | "sha256:09e47c529ff77bf042ecfe858fb55c3e3eb97aac2c87f0349ab5a7efd6b3939f", 174 | "sha256:0a1f9b0eb3aa15c990c328535655847b3420231af299386cfe5efc98f9c250fe", 175 | "sha256:0cc941b37b8c2ececfed341444a456912e740ecf515d560de58b9a76562d966d", 176 | "sha256:10e8af18d1315de936d67775d3a814cc81d0747a1a0312d84e27ae5610e313b0", 177 | "sha256:1b4276550b86caa60606bd3572b52769860a81a70754a54acc8ba789ce74d607", 178 | "sha256:1e8a2627c48266c7b813975335cfdea58c706fe36f607c97d9392e61502dc79d", 179 | "sha256:2b224052bfd801beb7478b03e8a66f3f25ea56ea488922e98903914ac9ac930b", 180 | "sha256:447c450a093766744ab53bf1e7063ec82866f27bcb4f4c907da25ad293bba7e3", 181 | "sha256:46101fc20c6f6568561cdd15a54018bb42980954b79aa46da8ae6f008066a30e", 182 | "sha256:4710dc676bb4b779c4361b54eb308bc84d64a2fa3d78e5f7228921eccce5d815", 183 | "sha256:510986f9a280cd05189b42eee2b69fecdf5bf9651d4cd315ea21d24a964a3c36", 184 | "sha256:5535dda5739257effef56e49a1c51c71f1d37a6e5607bb25a5eee507c59580d1", 185 | "sha256:5a7524042014642b39b1fcae85fb37556c200e64ec90824ae9ecf7b667ccfc14", 186 | "sha256:5f55028169ef85e1fa8e4b8b1b91c0b3b0fa3297c4fb22990d46ff01d22c2d6c", 187 | "sha256:6694d5573e7790a0e8d3d177d7a416ca5f5c150742ee703f3c18df76260de794", 188 | "sha256:6831e1ac20ac52634da606b658b0b2712d26984999c9d93f0c6e59fe62ca741b", 189 | "sha256:77f0d9fa5e10d03aa4528436e33423bfa3718b86c646615f04616294c935f840", 190 | "sha256:828ad813c7cdc2e71dcf141912c685bfe4b548c0e6d9540db6418b807c345ddd", 191 | "sha256:85a06c61598b14b015d4df233d249cd5abfa61084ef5b9f64a48e997fd829a82", 192 | "sha256:8cb4febad0f0b26c6f62e1628f2053954ad2c555d67660f28dfb1b0496711952", 193 | "sha256:a5c58664b23b248b16b96253880b2868fb34358911400a7ba39d7f6399935389", 194 | "sha256:aaa0f296e503cda4bc07566f592cd7a28779d433f3a23c48082af425d6d5a78f", 195 | "sha256:ab235d9fe64833f12d1334d29b558aacedfbca2356dfb9691f2d0d38a8a7bfb4", 196 | "sha256:b3b0c8f660fae65eac74fbf003f3103769b90012ae7a460863010539bb7a80da", 197 | "sha256:bab8e6d510d2ea0f1d14f12642e3f35cefa47a9b2e4c7cea1852b52bc9c49647", 198 | "sha256:c45297bbdbc8bb79b02cf41417d63352b70bcb76f1bbb1ee7d47b3e89e42f95d", 199 | "sha256:d19bca47c8a01b92640c614a9147b081a1974f69168ecd494687c827109e8f42", 200 | "sha256:d64b4340a0c488a9e79b66ec9f9d77d02b99b772c8b8afd46c1294c1d39ca478", 201 | "sha256:da969da069a82bbb5300b59161d8d7c8d423bc4ccd3b410a9b4d8932aeefc14b", 202 | "sha256:ed02c7539705696ecb7dc9d476d861f3904a8d2b7e894bd418994920935d36bb", 203 | "sha256:ee5b8abc35b549012e03a7b1e86c09491457dba6c94112a2482b18589cc2bdb9" 204 | ], 205 | "version": "==4.5.2" 206 | }, 207 | "coveralls": { 208 | "hashes": [ 209 | "sha256:ab638e88d38916a6cedbf80a9cd8992d5fa55c77ab755e262e00b36792b7cd6d", 210 | "sha256:b2388747e2529fa4c669fb1e3e2756e4e07b6ee56c7d9fce05f35ccccc913aa0" 211 | ], 212 | "index": "pypi", 213 | "version": "==1.5.1" 214 | }, 215 | "docopt": { 216 | "hashes": [ 217 | "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491" 218 | ], 219 | "index": "pypi", 220 | "version": "==0.6.2" 221 | }, 222 | "idna": { 223 | "hashes": [ 224 | "sha256:2c6a5de3089009e3da7c5dde64a141dbc8551d5b7f6cf4ed7c2568d0cc520a8f", 225 | "sha256:8c7309c718f94b3a625cb648ace320157ad16ff131ae0af362c9f21b80ef6ec4" 226 | ], 227 | "index": "pypi", 228 | "version": "==2.6" 229 | }, 230 | "requests": { 231 | "hashes": [ 232 | "sha256:65b3a120e4329e33c9889db89c80976c5272f56ea92d3e74da8a463992e3ff54", 233 | "sha256:ea881206e59f41dbd0bd445437d792e43906703fff75ca8ff43ccdb11f33f263" 234 | ], 235 | "index": "pypi", 236 | "version": "==2.20.1" 237 | }, 238 | "toml": { 239 | "hashes": [ 240 | "sha256:8e86bd6ce8cc11b9620cb637466453d94f5d57ad86f17e98a98d1f73e3baab2d" 241 | ], 242 | "index": "pypi", 243 | "version": "==0.9.4" 244 | }, 245 | "urllib3": { 246 | "hashes": [ 247 | "sha256:06330f386d6e4b195fbfc736b297f58c5a892e4440e54d294d7004e3a9bbea1b", 248 | "sha256:cc44da8e1145637334317feebd728bd869a35285b93cbb4cca2577da7e62db4f" 249 | ], 250 | "index": "pypi", 251 | "version": "==1.22" 252 | } 253 | } 254 | } 255 | --------------------------------------------------------------------------------