File size: 3,975 Bytes
fb74ade
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
================================================================================
  PYWAVELETS - USER GUIDE (Android Python STB) - Generated by RIMI
================================================================================

PyWavelets 1.10.0 for Android (CPython 3.12, API 24)
----------------------------------------------------
PyWavelets (import name: pywt) is a wavelet transform library for Python:
discrete and stationary wavelet transforms (1D, 2D, nD), wavelet packets,
continuous wavelet transform (CWT), thresholding, and multilevel analysis.

Provided wheels (C extensions, cross-compiled with NDK r26):
  pywavelets-1.10.0-cp312-cp312-android_24_arm64_v8a.whl  (real ARM64 phones)
  pywavelets-1.10.0-cp312-cp312-android_24_x86_64.whl     (x86_64 emulators)

Installation
------------
1. Install the numpy 2.5.2 Android wheel FIRST (from its own package
   folder — do NOT look for numpy in the pywavelets folder):
     numpy-2.5.2-cp312-cp312-android_24_<arch>.whl
2. Install the matching pywavelets STANDALONE wheel:
     pywavelets-1.10.0-cp312-cp312-android_24_<arch>.whl
   pip resolves the `numpy<3,>=1.26.4` runtime dependency from the
   already-installed numpy (both wheels share the same Python 3.12 ABI).
3. Run Test_PyWavelets.py from the Scripts folder; expect ALL PASSED.

Quick start
-----------
  import pywt
  import numpy as np

  x = np.arange(16, dtype=float)

  # 1D discrete transform and perfect reconstruction
  cA, cD = pywt.dwt(x, 'db1')
  y = pywt.idwt(cA, cD, 'db1')

  # Multilevel decomposition
  coeffs = pywt.wavedec(x, 'db2', level=2)
  y = pywt.waverec(coeffs, 'db2')

  # Stationary (undecimated) transform
  swt = pywt.swt(x, 'haar', level=1)
  y = pywt.iswt(swt, 'haar')

  # 2D transform
  img = np.arange(64, dtype=float).reshape(8, 8)
  cA, (cH, cV, cD) = pywt.dwt2(img, 'haar')
  rec = pywt.idwt2((cA, (cH, cV, cD)), 'haar')

  # Denoising-style thresholding
  t = pywt.threshold(np.linspace(-2, 2, 32), 1.0, mode='soft')

  print(pywt.wavelist()[:5])   # ['bior1.1', 'bior1.3', ...]

Android-specific notes
----------------------
* The 4 native modules (pywt/_extensions/_cwt, _dwt, _pywt, _swt,
  named *.cpython-312.so) link only against librimi.so + system
  libm/libdl/libc. No C++ runtime is needed (pure C + Cython).
* 16 KB page aligned, no GNU_RELRO: safe on Android 13+ (no dlopen
  `can't enable GNU RELRO protection` crash).
* No OPENBLAS/Fortran dependency — unlike numpy/scipy this wheel is
  small (~4.3 MB) and has no native deps besides numpy's headers
  at build time.
* Shell `python3` on device cannot load these modules (librimi.so needs
  the app JVM context); always test inside the app via Scripts.

Known upstream quirk (NOT a build defect)
-----------------------------------------
The 1.10.0 source distribution ships util/version_utils.py with the
version constants still at 1.8.0, so `pywt.__version__` reports '1.8.0'
— the official PyPI 1.10.0 wheels do exactly the same. The *wheel*
version (pywavelets-1.10.0.dist-info) is 1.10.0. The device test
therefore checks only that the version string is present.

Tested features (device script Test_PyWavelets.py, 10 checks)
--------------------------------------------------------------
  import pywt + numpy / version string / Wavelet('db1') object /
  wavelist contents (db1, db2, haar, sym2) / dwt+idwt roundtrip /
  wavedec+waverec roundtrip (db2, level 2) / swt+iswt roundtrip (haar) /
  dwt2+idwt2 roundtrip (haar, 8x8) / soft+hard threshold smoke /
  pywt.data.camera() load.

Runtime dependency
------------------
  numpy<3,>=1.26.4 (declared in METADATA Requires-Dist; install the
  numpy 2.5.2 Android wheel from its own package folder separately).

================================================================================
  Generated by RIMI
================================================================================