LAPACK

2013-02-13 42 views
64

का उपयोग कर साइथन आधारित एक्सटेंशन वितरित करना मैं एक पायथन मॉड्यूल लिख रहा हूं जिसमें साइथन एक्सटेंशन शामिल हैं और LAPACK (और BLAS) का उपयोग करता है। मैं clapack या lapacke या किसी प्रकार के f2c या f2py समाधान का उपयोग करने के लिए खोलने के लिए खुला हूं। महत्वपूर्ण बात यह है कि मैं पाइथन कॉल ओवरहेड के बिना सख्त लूप में lapack और blas रूटीन को कॉल करने में सक्षम हूं।LAPACK

मुझे एक उदाहरण मिला है here। हालांकि, वह उदाहरण एसएजी पर निर्भर करता है। मैं चाहता हूं कि मेरा मॉड्यूल SAGE इंस्टॉल किए बिना इंस्टॉल करने योग्य हो, क्योंकि मेरे उपयोगकर्ता किसी और चीज़ के लिए SAGE की आवश्यकता या आवश्यकता नहीं है। मेरे उपयोगकर्ताओं के पास numpy, scipy, pandas, और scikit सीखने जैसे संकुल होने की संभावना है, इसलिए वे उचित निर्भरताएं होंगी। उपयोग करने के लिए इंटरफेस का सबसे अच्छा संयोजन क्या है, और कम से कम setup.py फ़ाइल कैसा दिखता है जो संकलन के लिए आवश्यक जानकारी (numpy, scipy, आदि से) ला सकता है?

संपादित करें: यहां मैं क्या कर रहा हूं। यह मेरी मैकबुक पर काम करता है, लेकिन मुझे नहीं पता कि यह कितना पोर्टेबल है। निश्चित रूप से एक बेहतर तरीका है।

from distutils.core import setup 
from distutils.extension import Extension 
from Cython.Distutils import build_ext 
import numpy 
from Cython.Build import cythonize 
from numpy.distutils.system_info import get_info 

# TODO: This cannot be the right way 
blas_include = get_info('blas_opt')['extra_compile_args'][1][2:] 
includes = [blas_include,numpy.get_include()] 

setup(
    cmdclass = {'build_ext': build_ext}, 
    ext_modules = cythonize([Extension("cylapack", ["cylapack.pyx"], 
             include_dirs = includes, 
             libraries=['blas','lapack']) 
        ]) 
) 

यह काम करता है, क्योंकि मेरे मैकबुक पर, clapack.h हेडर फाइल cblas.h रूप में एक ही निर्देशिका में है। मैं तो मेरे सिक्कों के नमूने रखने का बक्स फ़ाइल में ऐसा कर सकते हैं:

ctypedef np.int32_t integer 

cdef extern from "cblas.h": 
    double cblas_dnrm2(int N,double *X, int incX) 
cdef extern from "clapack.h": 
    integer dgelsy_(integer *m, integer *n, integer *nrhs, 
    double *a, integer *lda, double *b, integer *ldb, integer * 
    jpvt, double *rcond, integer *rank, double *work, integer * 
    lwork, integer *info) 

उत्तर

4

मैं सही ढंग से सवाल को समझ लिया है, तो आप BLAS और LAPACK दिनचर्या के लिए SciPy के Cython रैपर का उपयोग कर सकता। ये रैपर यहाँ प्रलेखित रहे हैं:

प्रलेखन राज्यों के रूप में, आप यह जांच करना कि किसी भी सरणियों है कि आप इन कार्यों के लिए पारित सही ढंग से फोरट्रान दिनचर्या के लिए गठबंधन कर रहे हैं के लिए जिम्मेदार हैं। आप अपनी .pyx फ़ाइल में आवश्यकतानुसार इन कार्यों को आयात और उपयोग कर सकते हैं। उदाहरण के लिए:

from scipy.linalg.cython_blas cimport dnrm2 
from scipy.linalg.cython_lapack cimport dgelsy 

यह देखते हुए कि इस, अच्छी तरह से परीक्षण किया व्यापक रूप से इस्तेमाल कोड है कि विभिन्न प्लेटफार्मों पर चलाता है, मैं बहस चाहते हैं यह मज़बूती से Cython एक्सटेंशन कि सीधे BLAS और LAPACK दिनचर्या फोन के वितरण के लिए एक अच्छे उम्मीदवार है कि ।


आप अपने कोड SciPy की सम्पूर्णता पर निर्भरता है नहीं करना चाहते हैं, तो आप SciPy के linalg निर्देशिका here में इन आवरण कार्यों के लिए प्रासंगिक फ़ाइलों के कई पा सकते हैं। एक उपयोगी संदर्भ these lines of setup.py है जो स्रोत और शीर्षलेख फ़ाइलों को सूचीबद्ध करता है। ध्यान दें कि एक फोरट्रान कंपाइलर की आवश्यकता है!

सिद्धांत में केवल बीएसएएस और लैपैक साइथन रैपर को संकलित करने के लिए आवश्यक स्रोत फ़ाइलों को अलग करना संभव है और फिर उन्हें अपने मॉड्यूल के साथ एक स्वतंत्र एक्सटेंशन के रूप में बंडल करना संभव होना चाहिए।

अभ्यास यह बहुत ही मुश्किल है। लिनलग सबमिशन के लिए निर्माण प्रक्रिया के लिए कुछ पायथन कार्यों की आवश्यकता होती है ताकि विभिन्न प्लेटफार्मों पर संकलन में सहायता मिल सके (उदा। here से)।भवन अन्य सी और फोरट्रान स्रोत फ़ाइलों (here) पर भी निर्भर करता है, जिनके पथ इन पायथन कार्यों में हार्ड-कोड किए गए हैं।

स्पष्ट रूप से यह सुनिश्चित करने में बहुत सारे काम चल गए हैं कि SciPy विभिन्न ऑपरेटिंग सिस्टम और आर्किटेक्चर पर ठीक से संकलित करता है।

मुझे यकीन है कि ऐसा करना संभव है, लेकिन फ़ाइलों के बारे में फ़ाइलों को झुकाव के बाद, मुझे अभी तक शेष विज्ञान से स्वतंत्र रूप से लिनलग सबमिशन के इस हिस्से को बनाने का सही तरीका नहीं मिला है। क्या मुझे सही तरीका मिलना चाहिए, मैं इस जवाब को अपडेट करना सुनिश्चित कर दूंगा।

+0

मेरी धारणा यह है कि प्रश्न इस बात के बारे में अधिक है कि स्वाद/numpy के साथ आने वाले ब्लैस से कैसे लिंक करें और यह प्रत्येक कंप्यूटर पर दोबारा उपयोग किए बिना एकाधिक कंप्यूटरों (scipy/numpy इंस्टॉल के साथ) पर काम करता है। लेकिन scipy प्रदान रैपर का उपयोग करने की सलाह अच्छी है। – DavidW

+0

आह, आप वहां सही हो सकते हैं। यदि ओपी और स्पष्टीकरण प्रदान करता है तो मैं आवश्यकतानुसार इस उत्तर को परिष्कृत या हटा सकता हूं (या इसे किसी टिप्पणी में परिवर्तित कर सकता हूं)। –

+0

यह करने का यह एक शानदार तरीका है। @ डेविडड सही है कि मैं ऐसे समाधान की तलाश में था जो पोर्टेबल है और उपयोगकर्ताओं को अतिरिक्त पुस्तकालय स्थापित करने की आवश्यकता नहीं है। मुझे लगता है कि यह उन चीजों को उचित setup.py फ़ाइल के साथ है। एजेसीआर, क्या आप एक उदाहरण setup.py जोड़ सकते हैं जो दिखाता है कि किसी भी आवश्यक निर्देशिका को कैसे प्राप्त करें? मुझे लगता है कि numpy.get_include() सब कुछ जरूरी है? – jcrudy