WindowsへのPySPQRのインストール

less than 1 minute read

Published:

PySPQRのWindows 10へのインストール方法について説明します。

なぜPySPQRか

  • ScipyにはSparse matrix向けのQR分解がありません.
  • Dense matrix向けはありますが,todense()するとメモリで死んでしまいます.
  • SuiteSparseを使うとできるけどpythonで使えない.
  • Python wrapperのPySPQRを使う.

環境

  • Windows 10
  • Microsoft Visual Studio 14.0 (SuiteSparseのコンパイルにいる)
  • Python 3.5 (2.7でも成功しました)

SuiteSparseをインストール

公式にはないけど,windows用のインストール用CMakeがある.

  • suitesparse-metis-for-windowsを使う.以下のURLの手順に従う.
  • https://github.com/jlblancoc/suitesparse-metis-for-windows
  • (4)CMakeで必ず自分のVisual StudioのVersionを選ぶこと.(4)の他のステップはしなくてもよかった.
  • (5)Visual Studioでコンパイルすると,build/lib/Releaseフォルダができて,そこにlibファイルができる(あとで使う)

PySPQRをインストール

  • とりあえずdirect installを試す.
    • 色々とやり方https://github.com/yig/PySPQRが書いてありますが,Directlyを選びます.
    • つまり,PySPQRのプロジェクトをダウンロードし,sparseqrのフォルダをPythonのプロジェクトにぶち込みます.
    • pythonのファイルからimport sparseqrしてpythonを実行してみます.
  • ヘッダファイルが無いよというエラーが出ます.
    C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\cl.exe
    /c /nologo /Ox /W3 /GL /DNDEBUG /MD -I/usr/include/suitesparse
    -IC:\Users\(なんとかかんとか)\include (なんとかかんとか)
    "SuiteSparseQR_C.h" (そんなファイル無い的な)
    
    • suitesparse-metis-for-windowsのフォルダのどこかにヘッダファイルがあります.
    • 探してエラーメッセージ中のC:\Users(なんとかかんとか)\includeとかに入れてあげます.
    • 必要なヘッダファイルは1つではありません.pythonを実行して,エラーがなくなるまで入れ続けます.
  • ヘッダファイルを全部入れるとlibファイルが無いよと言ってきます.

    C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\link.exe /nologo
    /INCREMENTAL:NO /LTCG /DLL /MANIFEST:EMBED,ID=2   /MANIFESTUAC:NO /LIBPATH:C:\Users\(なんとかかんとか)\libs
    /LIBPATH:C:(なんとかかんとか)LINK : fatal error LNK1181: 入力ファイル 'spqr.lib' を開けません。
    
    • このlibファイルは前述のbuild/lib/Releaseフォルダ以下のlibファイルです.ファイル名の冒頭に余計なlibがついているので消してコピーします.
  • しかしまだうまく行きません.

    ライブラリ .\Release\sparseqr\_sparseqr.cp35-win_amd64.lib とオブジェクト
      .\Release\sparseqr\_sparseqr.cp35-win_amd64.exp を作成中
    _sparseqr.obj : error LNK2001: 外部シンボル "cholmod_l_check_triplet" は未解決です。...
    
    • PySPQRのsparsesqrフォルダにあるparseqr_gen.pyを編集します.
    • 19行目のlibrariesでspqrだけ指定されていますが,ぶちこんだlibを全部指定します.
    libraries=['amd','btf','camd','ccolamd','cholmod','colamd','cxsparse','klu','lapack','ldl','lumfpack','metis',
    'suitesparseconfig','spqr','libblas'])
    
  • DLLが無いとか言ってくるんですが...

    • suitesparse-metis-for-windowsのlib64\lapack_blas_windowsの中のdllを全部sparseqrのフォルダにぶち込む.
  • これでpythonを実行すればうまく行きました.お疲れさまでした.

  • PySPQRのissueに回答しました.