cyscs:scs凸优化求解器的cython包装器。

cyscs的Python项目详细描述


#cyscs
[![构建状态](https://travis-ci.org/ajfriend/cyscs.svg?branch=master)(https://travis ci.org/ajfriend/cyscs)

`cyscs`是一个python接口,用cython编写,用于[scs](https://github.com/cvxgrp/scs),一个用c编写的数值优化包,用于解决凸锥问题。与现有的python接口相比,这个接口的主要优点是"workspace"对象,它允许重复使用矩阵分解的
,当应用
一系列相关问题时,它可以减少求解时间。

它可以解决:线性程序(lps)、二阶锥程序(socps)、
半定程序(sdps)、指数锥程序(ecps)和
幂锥程序(pcps)或这些
锥的任何组合的问题。


大多数用户不会直接与"cysc"交互。最常见的用例是
一个凸优化建模框架的后端,比如[cvxpy](http://www.cvxpy.org)。

高级用户可以参考下面的界面说明,[tutorial ipython notebook](tutorial.ipynb)或[parallel tutorial ipython notebook](parallel\u tutorial)。IPYNB)。有关输入数据格式、凸锥和输出变量的更完整定义,请参阅[`SCS README`](https://github.com/cvxgrp/scs/blob/master/readme.md)或[SCS论文](http://web.stanford.edu/~boyd/papers/scs.html)。

ploaded to pypi,所以"pip"不起作用
-`pip install cyscs`


`
-(可选,用于测试)`pip install py test`
-运行"python setup.py install--cython`在"cyscs"目录中
-(可选)使用"make test"运行测试

基本用法
基本用法与现有的scs python接口几乎相同:
``python
im将cyscs端口设置为scs
sol=scs.solve(data,cone,warm廑start=none,**settings)
`````

*两个接口上的
相同。不过,手动在它们之间进行转换是很容易的。)

我们在下面简要介绍"cyscs.solve()"的参数。有关详细信息,请参见[`SCS readme`](https://github.com/cvxgrp/scs/blob/master/readme.md)。

-`data`是一个python`dict`键:
-`'a`:`scipy.sparse.csc`矩阵,即一个压缩稀疏列格式的矩阵,具有'm'行和'n'列
-`'b`:1d`numpy`长度数组'm`
-`'c`:1d`numpy`长度数组'n`
-`cone`是一个python`dict`具有潜在键:
-`'f`:`int`线性等式约束
-`'l`:`int`线性不等式约束
-`'q`:`list`给出二阶圆锥大小
-`'s'`:`list`给出半定圆锥尺寸的'int'
-`ep'`:`int`原指数圆锥
-`ed'`:`int`双指数圆锥
-`p'`:`list`原/双幂圆锥参数
-`warm` start`是一个**可选**`numpy`数组YS(使用键"x"、"y"和"s")用于热启动解算器;如果这些值接近最终解算,则热启动可以减少SCS迭代次数
-`cyscs.solve()`还接受解算器设置的可选关键字参数:
-`use_indirect`
-`verbose`
-`normalize`
-`max-iters`
-`scale`
-`eps`
-`cg-rate`
-`alpha`
-`rho-x`
-设置作为关键字参数传递:
-`cyscs.solve(data,cone,max-iters=100)`
-`cyscs.solve(data,cone,alpha=1.4,eps=1e-5,verbose=true)`
-`cyscs.solve(data,cone,warm_start,use_indirect=true)`
-通过调用'scs可以看到默认设置。default_settings()`
-`sol`是带键的'dict':
-`'x'`:`numpy`数组
-`'y'`:`numpy"array
-`'s`:`numpy` array
-`'info`:`dict`包含解算器状态信息

必须为暖启动变量"x"、"y"和"s"的**all**提供"numpy"数组。将它们作为字典传递给'cyscs.solve()`:

``python
``ws={'x':x,'y':y,'s':s}
sol=scs.solve(data,cone,warm\u start=ws)
`````

>以前解算的输出可用于热启动未来解算:
``python
sol=scs.solve(data,cone,eps=1e-3)
sol=scs.solve(data,cone,warm_start=sol,eps=1e-4)
`````



`syscs.solve()`期望'b'、'c'、'x'、'y'和's'是一维的'numpy'数组,带有'dtype''float64'`。

`solve()`还期望'a'是'scipy.sparse.csc'矩阵,这样矩阵的值就有'dtype''float64'`,属性'a.index'和'a.indptr'是'num'。py`带'dtype``int64'的数组:

``python
>;>a.dtype
dtype('float64')
>;>a.index.dtype,a.indptr.dtype
(dtype('int64'),dtype('int64'))
````

注意,默认情况下,`scipy.sparse.csc`矩阵有'indptr'和'index`带'dty'的数组pe``int32`.如果未提前转换矩阵,"cyscs"将在内部进行转换,而不修改原始的"a"矩阵。但是,最初使用正确的"dtype"构造"a"可能更有效,而不是转换。


数据的副本将用于内部使用,并将创建新的"numpy"数组以在"sol"中返回。



在s c s的迭代过程中,这个分解依赖于输入矩阵a,而不是向量b或c。在解决许多"a"已修复但"b"和"c"已更改的问题时,`cyscs.workspace()`对象允许我们缓存初始分解并在许多解决方案中重用它,而不必重新计算它。这可以在解决许多相关问题时节省时间。

"工作区"与"cyscs.solve()"使用相同的"data"和"cone"字典实例化,以及可选设置:
`"python
work=scs.workspace(data,cone,**settings)
```

ect创建后,我们可以调用它的solve方法
``python
sol=work.solve(new_bc=none,warm_start=none,**settings)
````


,它将重新使用初始化"工作区"时计算的矩阵分解。请注意,"work.solve()"的所有参数都是可选的。` new_b c`是一个字典,它可以选择提供
更新的'b'或'c'向量(忽略任何其他键,包括'a')。

操作"work"对象中包含的数据:

-`work.data`
-`work.settings`

>用户可以在调用"work.solve"之间修改"workspace"对象的状态。


请注意,"work.data"是一个带有键"b"和"c"的"dict",但**不是**"a"。这是因为"a"在初始化时在内部复制和存储(连同其分解),并且无法修改。


由于数据复制,用户现在可以自由删除或修改传递到"cyscs.workspace"构造函数中的"a"矩阵,因为这将没有有效的t在"workspace"对象上。


-` scale`

work.fixed`提供**固定设置**的"dict"副本。如果调用"work.solve()"时"work.settings"与"work.fixed"有任何不同,则将引发"异常"。调用"work.fixed"将返回基础"dict"的**副本**,该副本无法修改。xxx:对此进行测试

可以**在调用"work.solve()"之间修改以下设置:

-`verbose`
-`max-iters`
-`eps`
-`cg-rate`
-`alpha`

-`works.info`

e
通过"sol['info']`字典。同样的信息也可以通过属性"work.info"获得。

可变的"work"状态
初始化时,"a"在内部复制、存储和分解。
事实
之后对"scipy"稀疏输入矩阵"a"所做的任何更改都不会反映在"work"对象中。
类似地,"work.cone"在初始化时是固定的,不能修改。
为了避免混淆,我们不会通过"work"对象向用户公开"a"或"cone"。


在调用解算器之前。任何更改都会写入"work"对象,并持续到以后对"work.solve()"的调用中。事实上,
``python
new b=dict(b=b)
work.solve(new=newb,eps=1e-5,α=1.1)
`````


>
``python
``python
``python
`` work.data['b']=b
work.settings['eps']=1e-5
work.work.settings['alpha']=1.1
/>work.work.solve()
````````>`````,eps=1e-5`

如果"new_bc"通过ed到"work.solve()",只有键"b"和"c"将用于更新"work.data"。如果"a"键存在,它将被忽略。

```

更高的"1e-4"公差。对"work.solve()"的第二次调用通常比我们没有提供"warm_start"时所需的迭代次数要少,而且不必重新计算矩阵因式分解也会带来好处。

``python
work=scs.workspace(data,cone)
sol=work.solve(eps=1e-3)
sol=work.solve(warm廑start=sol,eps=1e-4)
````

`cyscs`附带了一个小的示例库,
`cyscs.examples`,它演示了正确的问题输入格式,
,可用于轻松测试解算器。

`python
`import cyscs as scs
/>data,cone=scs.examples.l1(m=100,seed=0)
sol=scs.solve(data,cone)
```

解决了一个简单的最小l1范数问题。


`cyscs.solve()`、`workspace`初始化和`worksapce.solve()`都在运行底层c解算器代码时释放python gil。这允许多线程并行,因此可以在多核计算机上同时解决多个SCS问题。


可以使用例如"concurrent.futures.threadpoolexecutor"或"concurrent.futures.processpoolexecutor"接口来解决问题。
因为SCS发布了e gil,我们可以从使用"threadpoolexecutor"中获益,因为它不需要启动单独的python解释器,也不需要对进程间通信的数据进行序列化。` processpoolexecutor`需要这两种方法。

有关示例,请参阅[并行教程ipython笔记本](parallel_tutorial.ipynb)。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何从同步请求中获取响应代码   具有深度复制的类中的Java oop getter/setter   java LDAP“简单”用户身份验证(JNDI Tomcat)不稳定?   java将Jenkins jnlp代理设置为通过API以编程方式使用WebSocket   java如何获取在servlet筛选器的静态块中启动的静态类的实例?   前两个数字的java charAt循环不能循环它   java在Spring引导执行器中是否有检查子服务运行状况的标准方法?   java我可以将jacksonmapped@JsonProperties推到“顶层”吗?   json JAVA:opencsv随机读取CSV单元格   无第三方应用程序的java捆绑包JRE   使用openidConnectClient功能的WAS Liberty中出现java无效cookie标头错误   java如何在Restful Web服务中从Http Post获取数组?   java如何读取安卓开发的JSON url?   如何在java IO中打开包含汉字的文件?