Metadata-Version: 2.4
Name: scitex
Version: 2.25.3
Summary: A comprehensive Python library for scientific computing and data analysis
Project-URL: Homepage, https://github.com/ywatanabe1989/scitex-python
Project-URL: Documentation, https://scitex.readthedocs.io
Project-URL: Repository, https://github.com/ywatanabe1989/scitex-python
Project-URL: Bug Tracker, https://github.com/ywatanabe1989/scitex-python/issues
Author-email: Yusuke Watanabe <ywatanabe@scitex.ai>
License: AGPL-3.0
License-File: LICENSE
Keywords: data-analysis,machine-learning,neural-networks,research,scientific-computing,signal-processing
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Science/Research
Classifier: License :: OSI Approved :: GNU Affero General Public License v3
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Scientific/Engineering
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Classifier: Topic :: Scientific/Engineering :: Information Analysis
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Requires-Python: >=3.10
Requires-Dist: natsort
Requires-Dist: numpy
Requires-Dist: packaging
Requires-Dist: pandas
Requires-Dist: pyyaml
Requires-Dist: scitex-app>=0.1.0
Requires-Dist: scitex-audio>=0.1.0
Requires-Dist: scitex-clew>=0.1.0
Requires-Dist: scitex-dev>=0.1.0
Requires-Dist: scitex-io>=0.2.0
Requires-Dist: scitex-notification>=0.1.0
Requires-Dist: scitex-stats>=0.2.0
Requires-Dist: tqdm
Provides-Extra: ai
Requires-Dist: anthropic; extra == 'ai'
Requires-Dist: google-genai; extra == 'ai'
Requires-Dist: groq; extra == 'ai'
Requires-Dist: imbalanced-learn; extra == 'ai'
Requires-Dist: joblib; extra == 'ai'
Requires-Dist: markdown2; extra == 'ai'
Requires-Dist: matplotlib; extra == 'ai'
Requires-Dist: natsort; extra == 'ai'
Requires-Dist: openai; extra == 'ai'
Requires-Dist: pillow; extra == 'ai'
Requires-Dist: pyyaml; extra == 'ai'
Requires-Dist: requests; extra == 'ai'
Requires-Dist: ruamel-yaml; extra == 'ai'
Requires-Dist: scikit-learn; extra == 'ai'
Requires-Dist: scipy; extra == 'ai'
Requires-Dist: seaborn; extra == 'ai'
Requires-Dist: sktime>=0.21.0; extra == 'ai'
Requires-Dist: umap-learn; extra == 'ai'
Requires-Dist: xarray; extra == 'ai'
Provides-Extra: all
Requires-Dist: aiohttp; extra == 'all'
Requires-Dist: anthropic; extra == 'all'
Requires-Dist: beautifulsoup4; extra == 'all'
Requires-Dist: bibtexparser; extra == 'all'
Requires-Dist: catboost; extra == 'all'
Requires-Dist: click; extra == 'all'
Requires-Dist: connectedpapers-py; extra == 'all'
Requires-Dist: crawl4ai; extra == 'all'
Requires-Dist: crossref-local; extra == 'all'
Requires-Dist: csv2latex; extra == 'all'
Requires-Dist: feedparser; extra == 'all'
Requires-Dist: figrecipe>=0.16.0; extra == 'all'
Requires-Dist: flask>=2.0.0; extra == 'all'
Requires-Dist: geom-median; extra == 'all'
Requires-Dist: gitpython; extra == 'all'
Requires-Dist: google-genai; extra == 'all'
Requires-Dist: groq; extra == 'all'
Requires-Dist: h5py; extra == 'all'
Requires-Dist: html2text; extra == 'all'
Requires-Dist: httpx; extra == 'all'
Requires-Dist: imbalanced-learn; extra == 'all'
Requires-Dist: ipdb; extra == 'all'
Requires-Dist: ipython; extra == 'all'
Requires-Dist: jax; extra == 'all'
Requires-Dist: joblib; extra == 'all'
Requires-Dist: julius; extra == 'all'
Requires-Dist: lxml; extra == 'all'
Requires-Dist: lxml-html-clean; extra == 'all'
Requires-Dist: markdown; extra == 'all'
Requires-Dist: markdown2; extra == 'all'
Requires-Dist: matplotlib; extra == 'all'
Requires-Dist: mcp; extra == 'all'
Requires-Dist: mne; extra == 'all'
Requires-Dist: mss; extra == 'all'
Requires-Dist: myst-parser>=2.0; extra == 'all'
Requires-Dist: natsort; extra == 'all'
Requires-Dist: nest-asyncio; extra == 'all'
Requires-Dist: numcodecs; extra == 'all'
Requires-Dist: openai; extra == 'all'
Requires-Dist: openalex-local; extra == 'all'
Requires-Dist: opencv-python; extra == 'all'
Requires-Dist: openpyxl; extra == 'all'
Requires-Dist: optuna; extra == 'all'
Requires-Dist: pdfplumber; extra == 'all'
Requires-Dist: piexif; extra == 'all'
Requires-Dist: pillow; extra == 'all'
Requires-Dist: playwright; extra == 'all'
Requires-Dist: playwright>=1.40.0; extra == 'all'
Requires-Dist: plotly; extra == 'all'
Requires-Dist: psutil; extra == 'all'
Requires-Dist: psycopg2-binary; extra == 'all'
Requires-Dist: pyarrow; extra == 'all'
Requires-Dist: pydantic; extra == 'all'
Requires-Dist: pymatreader; extra == 'all'
Requires-Dist: pymed; extra == 'all'
Requires-Dist: pymupdf; extra == 'all'
Requires-Dist: pypandoc; extra == 'all'
Requires-Dist: pypdf; extra == 'all'
Requires-Dist: pypdf2; extra == 'all'
Requires-Dist: pyperclip; extra == 'all'
Requires-Dist: pytesseract; extra == 'all'
Requires-Dist: pytest-asyncio; extra == 'all'
Requires-Dist: python-docx; extra == 'all'
Requires-Dist: pytorch-pretrained-vit; extra == 'all'
Requires-Dist: pyyaml; extra == 'all'
Requires-Dist: qrcode[pil]; extra == 'all'
Requires-Dist: readability-lxml; extra == 'all'
Requires-Dist: readchar; extra == 'all'
Requires-Dist: requests; extra == 'all'
Requires-Dist: ripple-detection; extra == 'all'
Requires-Dist: ruamel-yaml; extra == 'all'
Requires-Dist: scholarly; extra == 'all'
Requires-Dist: scikit-learn; extra == 'all'
Requires-Dist: scipy; extra == 'all'
Requires-Dist: scitex-app>=0.1.0; extra == 'all'
Requires-Dist: scitex-audio>=0.1.0; extra == 'all'
Requires-Dist: scitex-io>=0.2.0; extra == 'all'
Requires-Dist: scitex-stats>=0.2.0; extra == 'all'
Requires-Dist: scitex-tunnel; extra == 'all'
Requires-Dist: scitex-writer; extra == 'all'
Requires-Dist: seaborn; extra == 'all'
Requires-Dist: selenium; extra == 'all'
Requires-Dist: sktime>=0.21.0; extra == 'all'
Requires-Dist: socialia>=0.3.1; extra == 'all'
Requires-Dist: sounddevice; extra == 'all'
Requires-Dist: sphinx-autodoc-typehints>=1.25; extra == 'all'
Requires-Dist: sphinx-copybutton>=0.5; extra == 'all'
Requires-Dist: sphinx-rtd-theme>=2.0; extra == 'all'
Requires-Dist: sphinx>=7.0; extra == 'all'
Requires-Dist: sql-manager; extra == 'all'
Requires-Dist: sqlalchemy; extra == 'all'
Requires-Dist: statsmodels; extra == 'all'
Requires-Dist: sympy; extra == 'all'
Requires-Dist: tabulate; extra == 'all'
Requires-Dist: tenacity; extra == 'all'
Requires-Dist: tensorflow; extra == 'all'
Requires-Dist: tensorpac; extra == 'all'
Requires-Dist: termplotlib; extra == 'all'
Requires-Dist: torch; extra == 'all'
Requires-Dist: torchaudio; extra == 'all'
Requires-Dist: torchsummary; extra == 'all'
Requires-Dist: torchvision; extra == 'all'
Requires-Dist: tqdm; extra == 'all'
Requires-Dist: umap-learn; extra == 'all'
Requires-Dist: watchdog; extra == 'all'
Requires-Dist: webdriver-manager; extra == 'all'
Requires-Dist: xarray; extra == 'all'
Requires-Dist: xlrd; extra == 'all'
Requires-Dist: xlsx2csv; extra == 'all'
Requires-Dist: yq; extra == 'all'
Requires-Dist: zarr; extra == 'all'
Provides-Extra: app
Requires-Dist: scitex-app>=0.1.0; extra == 'app'
Provides-Extra: audio
Requires-Dist: scitex-audio>=0.1.0; extra == 'audio'
Provides-Extra: audit
Provides-Extra: benchmark
Requires-Dist: psutil; extra == 'benchmark'
Provides-Extra: bridge
Requires-Dist: matplotlib; extra == 'bridge'
Requires-Dist: scipy; extra == 'bridge'
Provides-Extra: browser
Requires-Dist: aiohttp; extra == 'browser'
Requires-Dist: matplotlib; extra == 'browser'
Requires-Dist: playwright>=1.40.0; extra == 'browser'
Provides-Extra: canvas
Requires-Dist: figrecipe>=0.16.0; extra == 'canvas'
Provides-Extra: capture
Requires-Dist: mcp; extra == 'capture'
Requires-Dist: mss; extra == 'capture'
Requires-Dist: pillow; extra == 'capture'
Requires-Dist: playwright>=1.40.0; extra == 'capture'
Provides-Extra: clew
Provides-Extra: cli
Requires-Dist: aiohttp; extra == 'cli'
Requires-Dist: beautifulsoup4; extra == 'cli'
Requires-Dist: click; extra == 'cli'
Requires-Dist: gitpython; extra == 'cli'
Requires-Dist: playwright; extra == 'cli'
Requires-Dist: pyyaml; extra == 'cli'
Requires-Dist: requests; extra == 'cli'
Provides-Extra: cloud
Requires-Dist: matplotlib; extra == 'cloud'
Provides-Extra: compat
Provides-Extra: config
Requires-Dist: pyyaml; extra == 'config'
Provides-Extra: container
Provides-Extra: context
Provides-Extra: cv
Requires-Dist: opencv-python; extra == 'cv'
Requires-Dist: pillow; extra == 'cv'
Provides-Extra: dataset
Provides-Extra: datetime
Provides-Extra: db
Requires-Dist: psycopg2-binary; extra == 'db'
Requires-Dist: sqlalchemy; extra == 'db'
Provides-Extra: decorators
Requires-Dist: joblib; extra == 'decorators'
Requires-Dist: matplotlib; extra == 'decorators'
Requires-Dist: pytest-asyncio; extra == 'decorators'
Requires-Dist: scipy; extra == 'decorators'
Requires-Dist: tqdm; extra == 'decorators'
Requires-Dist: xarray; extra == 'decorators'
Provides-Extra: dev
Requires-Dist: build; extra == 'dev'
Requires-Dist: jedi; extra == 'dev'
Requires-Dist: line-profiler; extra == 'dev'
Requires-Dist: markdown; extra == 'dev'
Requires-Dist: markdown2; extra == 'dev'
Requires-Dist: matplotlib; extra == 'dev'
Requires-Dist: memory-profiler; extra == 'dev'
Requires-Dist: mypy; extra == 'dev'
Requires-Dist: myst-parser; extra == 'dev'
Requires-Dist: pre-commit; extra == 'dev'
Requires-Dist: pygments; extra == 'dev'
Requires-Dist: pyright; extra == 'dev'
Requires-Dist: pytest; extra == 'dev'
Requires-Dist: pytest-asyncio; extra == 'dev'
Requires-Dist: pytest-cov; extra == 'dev'
Requires-Dist: pytest-env; extra == 'dev'
Requires-Dist: pytest-json-report; extra == 'dev'
Requires-Dist: pytest-mock; extra == 'dev'
Requires-Dist: pytest-testmon; extra == 'dev'
Requires-Dist: pytest-timeout; extra == 'dev'
Requires-Dist: pytest-xdist; extra == 'dev'
Requires-Dist: python-lsp-server; extra == 'dev'
Requires-Dist: pyyaml; extra == 'dev'
Requires-Dist: rope; extra == 'dev'
Requires-Dist: ruff; extra == 'dev'
Requires-Dist: scitex-container; extra == 'dev'
Requires-Dist: scitex-tunnel; extra == 'dev'
Requires-Dist: setuptools; extra == 'dev'
Requires-Dist: sphinx; extra == 'dev'
Requires-Dist: sphinx-autobuild; extra == 'dev'
Requires-Dist: sphinx-autodoc-typehints; extra == 'dev'
Requires-Dist: sphinx-rtd-theme; extra == 'dev'
Requires-Dist: stdlib-list; extra == 'dev'
Requires-Dist: tomlkit; extra == 'dev'
Requires-Dist: twine; extra == 'dev'
Requires-Dist: types-pyyaml; extra == 'dev'
Requires-Dist: types-requests; extra == 'dev'
Requires-Dist: types-setuptools; extra == 'dev'
Requires-Dist: wheel; extra == 'dev'
Provides-Extra: devtools
Requires-Dist: joblib; extra == 'devtools'
Requires-Dist: matplotlib; extra == 'devtools'
Requires-Dist: ruamel-yaml; extra == 'devtools'
Requires-Dist: scipy; extra == 'devtools'
Requires-Dist: seaborn; extra == 'devtools'
Requires-Dist: xarray; extra == 'devtools'
Provides-Extra: diagram
Requires-Dist: pyyaml; extra == 'diagram'
Provides-Extra: dict
Provides-Extra: docs
Requires-Dist: myst-parser>=2.0; extra == 'docs'
Requires-Dist: sphinx-autodoc-typehints>=1.25; extra == 'docs'
Requires-Dist: sphinx-copybutton>=0.5; extra == 'docs'
Requires-Dist: sphinx-rtd-theme>=2.0; extra == 'docs'
Requires-Dist: sphinx>=7.0; extra == 'docs'
Provides-Extra: dsp
Requires-Dist: h5py; extra == 'dsp'
Requires-Dist: joblib; extra == 'dsp'
Requires-Dist: matplotlib; extra == 'dsp'
Requires-Dist: readchar; extra == 'dsp'
Requires-Dist: ruamel-yaml; extra == 'dsp'
Requires-Dist: scipy; extra == 'dsp'
Requires-Dist: seaborn; extra == 'dsp'
Requires-Dist: sounddevice; extra == 'dsp'
Requires-Dist: tensorpac; extra == 'dsp'
Requires-Dist: xarray; extra == 'dsp'
Provides-Extra: dt
Requires-Dist: matplotlib; extra == 'dt'
Provides-Extra: etc
Requires-Dist: readchar; extra == 'etc'
Provides-Extra: events
Provides-Extra: gen
Requires-Dist: h5py; extra == 'gen'
Requires-Dist: ipython; extra == 'gen'
Requires-Dist: joblib; extra == 'gen'
Requires-Dist: matplotlib; extra == 'gen'
Requires-Dist: pyperclip; extra == 'gen'
Requires-Dist: readchar; extra == 'gen'
Requires-Dist: requests; extra == 'gen'
Requires-Dist: scipy; extra == 'gen'
Requires-Dist: xarray; extra == 'gen'
Provides-Extra: gists
Provides-Extra: git
Requires-Dist: gitpython; extra == 'git'
Requires-Dist: matplotlib; extra == 'git'
Provides-Extra: heavy
Requires-Dist: catboost; extra == 'heavy'
Requires-Dist: jax; extra == 'heavy'
Requires-Dist: julius; extra == 'heavy'
Requires-Dist: mne; extra == 'heavy'
Requires-Dist: optuna; extra == 'heavy'
Requires-Dist: psutil; extra == 'heavy'
Requires-Dist: pytorch-pretrained-vit; extra == 'heavy'
Requires-Dist: ripple-detection; extra == 'heavy'
Requires-Dist: tensorflow; extra == 'heavy'
Requires-Dist: torch; extra == 'heavy'
Requires-Dist: torchaudio; extra == 'heavy'
Requires-Dist: torchsummary; extra == 'heavy'
Requires-Dist: torchvision; extra == 'heavy'
Requires-Dist: umap-learn; extra == 'heavy'
Provides-Extra: introspect
Provides-Extra: io
Requires-Dist: gitpython; extra == 'io'
Requires-Dist: h5py; extra == 'io'
Requires-Dist: html2text; extra == 'io'
Requires-Dist: joblib; extra == 'io'
Requires-Dist: lxml; extra == 'io'
Requires-Dist: lxml-html-clean; extra == 'io'
Requires-Dist: markdown; extra == 'io'
Requires-Dist: matplotlib; extra == 'io'
Requires-Dist: natsort; extra == 'io'
Requires-Dist: numcodecs; extra == 'io'
Requires-Dist: openpyxl; extra == 'io'
Requires-Dist: pdfplumber; extra == 'io'
Requires-Dist: piexif; extra == 'io'
Requires-Dist: pillow; extra == 'io'
Requires-Dist: plotly; extra == 'io'
Requires-Dist: pyarrow; extra == 'io'
Requires-Dist: pymatreader; extra == 'io'
Requires-Dist: pymupdf; extra == 'io'
Requires-Dist: pypdf; extra == 'io'
Requires-Dist: pypdf2; extra == 'io'
Requires-Dist: python-docx; extra == 'io'
Requires-Dist: pyyaml; extra == 'io'
Requires-Dist: qrcode[pil]; extra == 'io'
Requires-Dist: ruamel-yaml; extra == 'io'
Requires-Dist: scipy; extra == 'io'
Requires-Dist: scitex-io>=0.2.0; extra == 'io'
Requires-Dist: tqdm; extra == 'io'
Requires-Dist: xarray; extra == 'io'
Requires-Dist: xlrd; extra == 'io'
Requires-Dist: zarr; extra == 'io'
Provides-Extra: linalg
Requires-Dist: geom-median; extra == 'linalg'
Requires-Dist: joblib; extra == 'linalg'
Requires-Dist: matplotlib; extra == 'linalg'
Requires-Dist: scipy; extra == 'linalg'
Requires-Dist: sympy; extra == 'linalg'
Requires-Dist: xarray; extra == 'linalg'
Provides-Extra: logging
Requires-Dist: matplotlib; extra == 'logging'
Provides-Extra: media
Provides-Extra: ml
Requires-Dist: anthropic; extra == 'ml'
Requires-Dist: google-genai; extra == 'ml'
Requires-Dist: groq; extra == 'ml'
Requires-Dist: imbalanced-learn; extra == 'ml'
Requires-Dist: joblib; extra == 'ml'
Requires-Dist: markdown2; extra == 'ml'
Requires-Dist: matplotlib; extra == 'ml'
Requires-Dist: natsort; extra == 'ml'
Requires-Dist: openai; extra == 'ml'
Requires-Dist: pillow; extra == 'ml'
Requires-Dist: pyyaml; extra == 'ml'
Requires-Dist: requests; extra == 'ml'
Requires-Dist: ruamel-yaml; extra == 'ml'
Requires-Dist: scikit-learn; extra == 'ml'
Requires-Dist: scipy; extra == 'ml'
Requires-Dist: seaborn; extra == 'ml'
Requires-Dist: sktime>=0.21.0; extra == 'ml'
Requires-Dist: umap-learn; extra == 'ml'
Requires-Dist: xarray; extra == 'ml'
Provides-Extra: module
Provides-Extra: msword
Requires-Dist: pypandoc; extra == 'msword'
Requires-Dist: python-docx; extra == 'msword'
Provides-Extra: nn
Requires-Dist: h5py; extra == 'nn'
Requires-Dist: ipdb; extra == 'nn'
Requires-Dist: joblib; extra == 'nn'
Requires-Dist: matplotlib; extra == 'nn'
Requires-Dist: readchar; extra == 'nn'
Requires-Dist: ruamel-yaml; extra == 'nn'
Requires-Dist: seaborn; extra == 'nn'
Requires-Dist: tensorpac; extra == 'nn'
Requires-Dist: xarray; extra == 'nn'
Provides-Extra: notebook
Provides-Extra: os
Provides-Extra: parallel
Requires-Dist: tqdm; extra == 'parallel'
Provides-Extra: path
Requires-Dist: gitpython; extra == 'path'
Requires-Dist: matplotlib; extra == 'path'
Provides-Extra: pd
Requires-Dist: xarray; extra == 'pd'
Provides-Extra: plt
Requires-Dist: figrecipe>=0.16.0; extra == 'plt'
Requires-Dist: joblib; extra == 'plt'
Requires-Dist: matplotlib; extra == 'plt'
Requires-Dist: piexif; extra == 'plt'
Requires-Dist: pillow; extra == 'plt'
Requires-Dist: pyyaml; extra == 'plt'
Requires-Dist: ruamel-yaml; extra == 'plt'
Requires-Dist: scipy; extra == 'plt'
Requires-Dist: seaborn; extra == 'plt'
Requires-Dist: termplotlib; extra == 'plt'
Requires-Dist: xarray; extra == 'plt'
Provides-Extra: project
Provides-Extra: repro
Requires-Dist: matplotlib; extra == 'repro'
Provides-Extra: reproduce
Requires-Dist: matplotlib; extra == 'reproduce'
Provides-Extra: resource
Requires-Dist: h5py; extra == 'resource'
Requires-Dist: joblib; extra == 'resource'
Requires-Dist: matplotlib; extra == 'resource'
Requires-Dist: psutil; extra == 'resource'
Requires-Dist: pyyaml; extra == 'resource'
Requires-Dist: readchar; extra == 'resource'
Requires-Dist: ruamel-yaml; extra == 'resource'
Requires-Dist: scipy; extra == 'resource'
Provides-Extra: rng
Requires-Dist: matplotlib; extra == 'rng'
Provides-Extra: schema
Provides-Extra: scholar
Requires-Dist: aiohttp; extra == 'scholar'
Requires-Dist: beautifulsoup4; extra == 'scholar'
Requires-Dist: bibtexparser; extra == 'scholar'
Requires-Dist: connectedpapers-py; extra == 'scholar'
Requires-Dist: crawl4ai; extra == 'scholar'
Requires-Dist: crossref-local; extra == 'scholar'
Requires-Dist: feedparser; extra == 'scholar'
Requires-Dist: html2text; extra == 'scholar'
Requires-Dist: httpx; extra == 'scholar'
Requires-Dist: matplotlib; extra == 'scholar'
Requires-Dist: natsort; extra == 'scholar'
Requires-Dist: nest-asyncio; extra == 'scholar'
Requires-Dist: openalex-local; extra == 'scholar'
Requires-Dist: openpyxl; extra == 'scholar'
Requires-Dist: pdfplumber; extra == 'scholar'
Requires-Dist: pillow; extra == 'scholar'
Requires-Dist: playwright>=1.40.0; extra == 'scholar'
Requires-Dist: pydantic; extra == 'scholar'
Requires-Dist: pymed; extra == 'scholar'
Requires-Dist: pymupdf; extra == 'scholar'
Requires-Dist: pypdf2; extra == 'scholar'
Requires-Dist: pytesseract; extra == 'scholar'
Requires-Dist: python-docx; extra == 'scholar'
Requires-Dist: pyyaml; extra == 'scholar'
Requires-Dist: requests; extra == 'scholar'
Requires-Dist: ruamel-yaml; extra == 'scholar'
Requires-Dist: scholarly; extra == 'scholar'
Requires-Dist: scikit-learn; extra == 'scholar'
Requires-Dist: seaborn; extra == 'scholar'
Requires-Dist: selenium; extra == 'scholar'
Requires-Dist: sql-manager; extra == 'scholar'
Requires-Dist: sqlalchemy; extra == 'scholar'
Requires-Dist: tenacity; extra == 'scholar'
Requires-Dist: tqdm; extra == 'scholar'
Requires-Dist: watchdog; extra == 'scholar'
Requires-Dist: webdriver-manager; extra == 'scholar'
Provides-Extra: scholar-gui
Requires-Dist: click; extra == 'scholar-gui'
Requires-Dist: crossref-local; extra == 'scholar-gui'
Requires-Dist: flask>=2.0.0; extra == 'scholar-gui'
Requires-Dist: openalex-local; extra == 'scholar-gui'
Provides-Extra: security
Provides-Extra: session
Requires-Dist: matplotlib; extra == 'session'
Requires-Dist: pyyaml; extra == 'session'
Provides-Extra: sh
Requires-Dist: matplotlib; extra == 'sh'
Provides-Extra: social
Requires-Dist: socialia>=0.3.1; extra == 'social'
Provides-Extra: stats
Requires-Dist: matplotlib; extra == 'stats'
Requires-Dist: scipy; extra == 'stats'
Requires-Dist: scitex-stats>=0.2.0; extra == 'stats'
Requires-Dist: statsmodels; extra == 'stats'
Requires-Dist: tabulate; extra == 'stats'
Provides-Extra: str
Requires-Dist: matplotlib; extra == 'str'
Requires-Dist: natsort; extra == 'str'
Requires-Dist: xarray; extra == 'str'
Provides-Extra: template
Requires-Dist: gitpython; extra == 'template'
Requires-Dist: matplotlib; extra == 'template'
Provides-Extra: tex
Requires-Dist: matplotlib; extra == 'tex'
Provides-Extra: torch
Requires-Dist: torch; extra == 'torch'
Provides-Extra: tunnel
Requires-Dist: scitex-tunnel; extra == 'tunnel'
Provides-Extra: types
Requires-Dist: xarray; extra == 'types'
Provides-Extra: ui
Provides-Extra: utils
Requires-Dist: h5py; extra == 'utils'
Requires-Dist: matplotlib; extra == 'utils'
Requires-Dist: natsort; extra == 'utils'
Requires-Dist: tqdm; extra == 'utils'
Requires-Dist: xarray; extra == 'utils'
Provides-Extra: verify
Provides-Extra: web
Requires-Dist: aiohttp; extra == 'web'
Requires-Dist: anthropic; extra == 'web'
Requires-Dist: beautifulsoup4; extra == 'web'
Requires-Dist: google-genai; extra == 'web'
Requires-Dist: groq; extra == 'web'
Requires-Dist: joblib; extra == 'web'
Requires-Dist: markdown2; extra == 'web'
Requires-Dist: matplotlib; extra == 'web'
Requires-Dist: openai; extra == 'web'
Requires-Dist: pillow; extra == 'web'
Requires-Dist: pytest-asyncio; extra == 'web'
Requires-Dist: readability-lxml; extra == 'web'
Requires-Dist: requests; extra == 'web'
Requires-Dist: ruamel-yaml; extra == 'web'
Requires-Dist: scikit-learn; extra == 'web'
Requires-Dist: scipy; extra == 'web'
Requires-Dist: seaborn; extra == 'web'
Requires-Dist: tqdm; extra == 'web'
Requires-Dist: xarray; extra == 'web'
Provides-Extra: writer
Requires-Dist: csv2latex; extra == 'writer'
Requires-Dist: gitpython; extra == 'writer'
Requires-Dist: matplotlib; extra == 'writer'
Requires-Dist: pytest-asyncio; extra == 'writer'
Requires-Dist: scitex-writer; extra == 'writer'
Requires-Dist: xlsx2csv; extra == 'writer'
Requires-Dist: yq; extra == 'writer'
Description-Content-Type: text/markdown

<!-- ---
!-- Timestamp: 2026-03-19 01:39:46
!-- Author: ywatanabe
!-- File: /home/ywatanabe/proj/scitex-python/README.md
!-- --- -->

# SciTeX (<code>scitex</code>)

<p align="center">
  <a href="https://scitex.ai">
    <img src="docs/assets/images/scitex-logo-blue-cropped.png" alt="SciTeX" width="400">
  </a>
</p>

<p align="center"><b>Modular Python Toolkit for Scientific Research Automation</b></p>

<p align="center">
  <a href="https://badge.fury.io/py/scitex"><img src="https://badge.fury.io/py/scitex.svg" alt="PyPI version"></a>
  <a href="https://pypi.org/project/scitex/"><img src="https://img.shields.io/pypi/pyversions/scitex.svg" alt="Python Versions"></a>
  <a href="https://scitex-python.readthedocs.io"><img src="https://readthedocs.org/projects/scitex-python/badge/?version=latest" alt="Documentation"></a>
  <a href="https://github.com/ywatanabe1989/scitex-python/blob/main/LICENSE"><img src="https://img.shields.io/github/license/ywatanabe1989/scitex-python" alt="License"></a>
</p>

<p align="center">
  <a href="https://scitex-python.readthedocs.io">Docs</a> &middot;
  <a href="https://scitex-python.readthedocs.io/en/latest/quickstart.html">Quick Start</a> &middot;
  <a href="https://scitex-python.readthedocs.io/en/latest/api/index.html">API</a> &middot;
  <code>pip install scitex[all]</code>
</p>

---

This repository provides `scitex`, the orchestration layer of the SciTeX ecosystem — solving key problems in scientific research:

## Problem and Solution

| # | Problem | Solution |
|---|---------|----------|
| 1 | **Fragmented tools** -- literature search, statistics, figures, and writing each require separate tools with incompatible formats | **Unified toolkit** -- `import scitex as stx` provides 50+ modules under one namespace, accessible via Python API, CLI, and MCP |
| 2 | **No verification** -- existing tools address whether work *could* be reproduced, not whether it *has* been verified | **Cryptographic verification** -- Clew builds SHA-256 hash-chain DAGs linking every manuscript claim back to source data |
| 3 | **AI agents lack context** -- general-purpose LLMs cannot operate across the full research lifecycle without domain-specific tools | **293 MCP tools** -- AI agents run statistics, create figures, search literature, and compile manuscripts through structured tool calls |
| 4 | **No custom tooling** -- every lab needs domain-specific tools, but building and sharing them requires deep infrastructure knowledge | **App Maker and Store** -- researchers create custom apps with [scitex-app](https://github.com/ywatanabe1989/scitex-app) SDK and share via [SciTeX Cloud](https://scitex.ai) |

## Research Workflow

<p align="center">
    <img src="scripts/assets/workflow_out/workflow.png" alt="SciTeX Research Workflow" width="600">
</p>
<p align="center"><sub><b>Figure 1.</b> SciTeX research pipeline -- from literature search to manuscript compilation, with every step cryptographically linked.</sub></p>

## Demo

**40 min, minimal human intervention** — an AI agent using SciTeX completed a full research cycle: literature search, statistical analysis, publication-ready figures, a 21-page manuscript, and peer review simulation.

<p align="center">
  <a href="https://scitex.ai/demos/watch/scitex-automated-research/">
    <img src="docs/assets/images/scitex-demo.gif" alt="SciTeX Demo" width="800">
  </a>
</p>

## Installation

```bash
pip install scitex[all]                # Recommended: everything
```

<details>
<summary><strong>Per-module extras</strong></summary>

```bash
pip install scitex                     # Core only (minimal)
pip install scitex[plt,stats,scholar]  # Typical research setup
pip install scitex[plt]                # Publication-ready figures (figrecipe)
pip install scitex[stats]              # Statistical testing (23+ tests)
pip install scitex[scholar]            # Literature search, PDF download, BibTeX enrichment
pip install scitex[writer]             # LaTeX manuscript compilation
pip install scitex[audio]              # Text-to-speech
pip install scitex[ai]                 # LLM APIs (OpenAI, Anthropic, Google) + ML tools
pip install scitex[dataset]            # Scientific datasets (DANDI, OpenNeuro, PhysioNet)
pip install scitex[browser]            # Web automation (Playwright)
pip install scitex[capture]            # Screenshot capture and monitoring
pip install scitex[cloud]              # Cloud platform integration
```

Requires Python 3.10+. We recommend [uv](https://docs.astral.sh/uv/) for fast installs.
</details>

<details>
<summary><strong>Module Overview</strong></summary>

| Category | Modules | Description |
|----------|---------|-------------|
| **Core** | `session`, `io`, `config`, `clew` | Experiment tracking, file I/O, config, cryptographic verification |
| **Analysis** | `stats`, `plt`, `dsp`, `linalg` | Statistics, plotting, signal processing, linear algebra |
| **Research** | `scholar`, `writer`, `diagram`, `canvas` | Literature, manuscripts, diagrams, figure composition |
| **ML/AI** | `ai`, `nn`, `torch`, `cv`, `benchmark` | LLM APIs, neural networks, PyTorch, computer vision |
| **Data** | `pd`, `db`, `dataset`, `schema` | Pandas utilities, databases, scientific datasets |
| **Infra** | `app`, `cloud`, `tunnel`, `container` | App SDK, cloud, SSH tunnels, containers |
| **Automation** | `browser`, `capture`, `audio`, `notification` | Web automation, screenshots, TTS, notifications |
| **Dev** | `dev`, `template`, `linter`, `introspect` | Ecosystem tools, scaffolding, code analysis |

</details>

## Quick Start

<details>
<summary><strong><code>@scitex.session</code> -- Reproducible Experiment Tracking</strong></summary>

One decorator gives you: auto-CLI, YAML config injection, random seed fixation, structured output, and logging.

```python
import scitex as stx
import numpy as np

@stx.session
def main(
    data_path: str = "./data.csv",   # --data-path data.csv
    n_samples: int = 100,            # --n-samples 200
    CONFIG=stx.session.INJECTED,     # Aggregated ./config/*.yaml
    plt=stx.session.INJECTED,        # Pre-configured matplotlib
    logger=stx.session.INJECTED,     # Session logger
):
    """Analyze data. Docstring becomes --help text."""
    
    # Load
    data = stx.io.load(data_path)
    
    # Demo data
    x = np.linspace(0, 2 * np.pi, n_samples)
    y = np.sin(x) + np.random.randn(n_samples) * 0.1
    
    # FigRecipe Plot
    fig, ax = stx.plt.subplots()
    ax.plot(x, y)
    ax.set_xyt("Time", "Amplitude", "Noisy Sine Wave")
    
    # Save sine.png + sine.csv with logging message
    stx.io.save(fig, "sine.png")
    
    return 0

if __name__ == "__main__":
    main()
```

```bash
$ python script.py --data-path experiment.csv --n-samples 200
$ python script.py --help
# usage: script.py [-h] [--data-path DATA_PATH] [--n-samples N_SAMPLES]
# Analyze data. Docstring becomes --help text.
```

```
script_out/FINISHED_SUCCESS/2026-03-18_14-30-00_Z5MR/
├── sine.png, sine.csv         # Figure + auto-exported plot data
├── CONFIGS/CONFIG.yaml        # Frozen parameters
└── logs/{stdout,stderr}.log   # Execution logs
```
</details>

<details>
<summary><strong><code>scitex.clew</code> -- Cryptographic Verification for AI-Driven Science</strong></summary>

As AI agents produce research at scale, the question shifts from *"could this be reproduced?"* to *"has this been verified?"*. Clew builds a **SHA-256 hash-chain DAG** linking every manuscript claim back to source data.

```python
import scitex as stx

# Every stx.io.load/save automatically records file hashes -- zero config
stx.clew.status()                          # {'verified': 12, 'mismatched': 0, 'missing': 0}
stx.clew.chain("results/figure1.png")      # Trace one file back to source data
stx.clew.dag(claims=True)                  # Verify all manuscript claims

# Register traceable assertions
stx.clew.add_claim(
    file_path="paper/main.tex", claim_type="statistic", line_number=142,
    claim_value="t(58) = 2.34, p = .021",
    source_session="2026-03-18_14-30-00_Z5MR", source_file="results/stats.csv",
)

stx.clew.mermaid(claims=True)              # Visualize provenance DAG
```

| Mode | Function | Answers |
|------|----------|---------|
| **Project** | `clew.dag()` | Is the whole project intact? |
| **File** | `clew.chain("output.csv")` | Can I trust this specific file? |
| **Claim** | `clew.verify_claim("Fig 1")` | Is this manuscript assertion valid? |

**L1** hash comparison (ms) / **L2** sandbox re-execution (min) / **L3** registered timestamp proof (optional).

<p align="center">
  <img src="docs/clew-dag.png" alt="Clew DAG" width="300">
</p>
<p align="center"><sub><b>Figure 2.</b> Clew verification DAG -- green nodes are verified (hash match), red nodes have mismatches. Each node shows its SHA-256 hash prefix.</sub></p>

</details>

<details>
<summary><strong><code>scitex.io</code> -- Unified File I/O (50+ Formats)</strong></summary>

```python
import scitex as stx

# Save and load -- format detected from extension
stx.io.save(df, "results.csv")
df = stx.io.load("results.csv")

stx.io.save(arr, "data.npy")
arr = stx.io.load("data.npy")

stx.io.save(fig, "figure.png")       # Also exports figure data as CSV
stx.io.save(config, "config.yaml")
stx.io.save(model, "model.pkl")

# Aggregate ./config/*.yaml into a single DotDict
CONFIG = stx.io.load_configs(config_dir="./config")
print(CONFIG.MODEL.hidden_size)      # Dot-notation access

# Register custom formats
@stx.io.register_saver(".custom")
def save_custom(obj, path, **kw):
    with open(path, "w") as f:
        f.write(str(obj))

@stx.io.register_loader(".custom")
def load_custom(path, **kw):
    with open(path) as f:
        return f.read()
```

Supports: CSV, JSON, YAML, TOML, HDF5, NPY, NPZ, PKL, PNG, JPG, SVG, PDF, Excel, Parquet, Zarr, INI, TXT, MAT, WAV, MP3, BibTeX, and more.
</details>

<details>
<summary><strong><code>scitex.plt</code> -- Reproducible, Restylable Figures</strong></summary>

Powered by [figrecipe](https://github.com/ywatanabe1989/figrecipe). Figures are **reproducible nodes** in the Clew verification DAG -- scientific data and visual style are decomposed, so figures can be restyled (fonts, colors, layout) without altering the underlying data hash. Every figure auto-exports its data as CSV + a YAML recipe for exact reproduction.

```python
import scitex as stx
fig, axes = stx.plt.subplots(1, 3)
axes[0].stx_line(x, y)
axes[0].set_xyt("Time", "Value", "Line")

axes[1].stx_violin([g1, g2, g3])
axes[1].set_xyt("Group", "Score", "Violin")

axes[2].stx_heatmap(corr_matrix)
axes[2].set_xyt("X", "Y", "Heatmap")
stx.io.save(fig, "analysis.png")  # Saves analysis.png + analysis.csv + analysis.yaml

# Restyle without changing data (hash stays valid for Clew verification)
stx.plt.reproduce("analysis.yaml", style="nature")
```
</details>

<details>
<summary><strong><code>scitex.stats</code> -- Publication-Ready Statistics (23+ Tests)</strong></summary>

```python
import scitex as stx
result = stx.stats.run_test("ttest_ind", group1, group2, return_as="dataframe")
# Returns: p-value, effect size (Cohen's d), CI, normality check, power
recommendations = stx.stats.recommend_tests(data)
stx.stats.format_results(result, style="apa")   # "t(58) = 2.34, p = .021, d = 0.60"
```
</details>

<details>
<summary><strong><code>scitex.scholar</code> -- Literature Management</strong></summary>

Search, download, enrich papers. Backed by local CrossRef (167M+) and OpenAlex (250M+) databases.

```python
import scitex as stx
papers = stx.scholar.search("neural oscillations working memory", n=20)
stx.scholar.fetch("10.1038/s41586-024-07804-3")
stx.scholar.enrich_bibtex("references.bib", output="enriched.bib")
```

```bash
scitex scholar search "neural oscillations" --n 20
scitex scholar bibtex references.bib --output enriched.bib
```
</details>

<details>
<summary><strong><code>scitex.writer</code> -- LaTeX Manuscript Compilation</strong></summary>

```python
import scitex as stx
stx.writer.compile_manuscript("paper/")
stx.writer.add_figure("paper/", "results.png", caption="Main results")
stx.writer.add_table("paper/", "stats.csv", caption="Statistical summary")
```
</details>

<details>
<summary><strong><code>scitex.notification</code> -- Multi-Backend Notifications</strong></summary>

Get notified when experiments finish -- via desktop, phone call, SMS, or email -- with automatic fallback.

```python
import scitex as stx
stx.notification.alert("Experiment complete: accuracy = 94.2%")
stx.notification.call("Training diverged -- loss is NaN")
stx.notification.sms("GPU job finished on node-42")

@stx.session(notify=True)   # Notifies on completion or failure
def main(CONFIG=stx.session.INJECTED): ...
```
</details>

> **[Full API reference](https://scitex-python.readthedocs.io/en/latest/api/index.html)** &middot; **[Examples](./examples/)** &middot; **[Module status](./docs/04_MODULE_STATUS.md)**

<details>
<summary><strong>CLI Commands</strong></summary>

```bash
scitex --help-recursive                  # Show all commands
scitex scholar search "topic"            # Search literature
scitex scholar fetch "10.1038/..."       # Download paper by DOI
scitex stats recommend                   # Suggest statistical tests
scitex clew status                       # Project verification overview
scitex clew dag --claims                 # Verify all manuscript claims
scitex audio speak "Analysis complete"   # Text-to-speech
scitex notification alert "Job finished" # Multi-backend notification
scitex template clone research my_proj   # Scaffold a project
scitex dev versions                      # Check ecosystem versions
scitex mcp list-tools                    # List all MCP tools (293)
```

> **[Full CLI reference](./docs/01_CLI_COMMANDS.md)**
</details>

<details>
<summary><strong>MCP Server (293 tools across 23 modules)</strong></summary>

Turn AI agents into autonomous researchers via [MCP](https://modelcontextprotocol.io/).

| Category | Tools | | Category | Tools | | Category | Tools |
|----------|-------|-|----------|-------|-|----------|-------|
| plt | 73 | | crossref | 15 | | io | 5 |
| cloud | 50 | | dev | 13 | | template | 4 |
| writer | 38 | | introspect | 12 | | openalex | 4 |
| scholar | 22 | | stats | 10 | | linter | 3 |
| clew | 9 | | dataset | 8 | | social | 3 |
| project | 6 | | notify | 5 | | tunnel | 3 |
| docs | 4 | | ui | 2 | | usage | 2 |

```json
{"mcpServers": {"scitex": {"command": "scitex", "args": ["mcp", "start"],
  "env": {"SCITEX_ENV_SRC": "${SCITEX_ENV_SRC}"}}}}
```

> **[Full MCP reference](./docs/02_MCP_TOOLS.md)**
</details>

## Configuration

```bash
cp -r .env.d.examples .env.d   # 1. Copy examples
$EDITOR .env.d/                # 2. Edit credentials
source .env.d/entry.src        # 3. Source in shell
```

> **[Full configuration reference](./.env.d.examples/README.md)**


## SciTeX Ecosystem

[`scitex-cloud`](https://github.com/ywatanabe1989/scitex-cloud) is a self-hosted web application that serves as a collaborative research workspace — with a built-in Writer, Scholar, and App Store where researchers build custom tools using [`scitex-app`](https://github.com/ywatanabe1989/scitex-app) SDK and [`scitex-ui`](https://github.com/ywatanabe1989/scitex-ui) components, then share them with the community. A live instance is hosted at [scitex.ai](https://scitex.ai).

<details>
<summary><strong>Full Ecosystem (17 packages)</strong></summary>

| Package | Module | Description |
|---------|--------|-------------|
| [scitex-clew](https://github.com/ywatanabe1989/scitex-clew) | `stx.clew` | SHA-256 hash-chain DAG for provenance |
| [scitex-io](https://github.com/ywatanabe1989/scitex-io) | `stx.io` | Unified file I/O (30+ formats) |
| [scitex-stats](https://github.com/ywatanabe1989/scitex-stats) | `stx.stats` | Publication-ready statistics |
| [figrecipe](https://github.com/ywatanabe1989/figrecipe) | `stx.plt` | Publication-ready matplotlib figures |
| [scitex-writer](https://github.com/ywatanabe1989/scitex-writer) | `stx.writer` | LaTeX manuscript compilation |
| [scitex-scholar](https://github.com/ywatanabe1989/scitex-scholar) | `stx.scholar` | Literature management |
| [scitex-notification](https://github.com/ywatanabe1989/scitex-notification) | `stx.notification` | Multi-backend notifications |
| [scitex-audio](https://github.com/ywatanabe1989/scitex-audio) | `stx.audio` | Text-to-speech and audio |
| [scitex-dev](https://github.com/ywatanabe1989/scitex-dev) | `stx.dev` | Developer tools, ecosystem management |
| [scitex-linter](https://github.com/ywatanabe1989/scitex-linter) | `stx.linter` | AST-based code pattern checking |
| [scitex-dataset](https://github.com/ywatanabe1989/scitex-dataset) | `stx.dataset` | Scientific datasets |
| [scitex-cloud](https://github.com/ywatanabe1989/scitex-cloud) | `stx.cloud` | Self-hosted research platform |
| [scitex-app](https://github.com/ywatanabe1989/scitex-app) | `stx.app` | Runtime SDK for research apps |
| [scitex-ui](https://github.com/ywatanabe1989/scitex-ui) | `stx.ui` | React/TS frontend components |
| [crossref-local](https://github.com/ywatanabe1989/crossref-local) | `stx.scholar` | Local CrossRef (167M+ papers) |
| [openalex-local](https://github.com/ywatanabe1989/openalex-local) | `stx.scholar` | Local OpenAlex (250M+ works) |
| [socialia](https://github.com/ywatanabe1989/socialia) | `stx.social` | Social media (Twitter, LinkedIn) |
</details>

>Four Freedoms for Research
>
>0. The freedom to **run** your research anywhere -- your machine, your terms.
>1. The freedom to **study** how every step works -- from raw data to final manuscript.
>2. The freedom to **redistribute** your workflows, not just your papers.
>3. The freedom to **modify** any module and share improvements with the community.
>
>AGPL-3.0 -- because research infrastructure deserves the same freedoms as the software it runs on.

---

<p align="center">
  <a href="https://star-history.com/#ywatanabe1989/scitex-python&Date">
    <img alt="Star History" src="https://api.star-history.com/svg?repos=ywatanabe1989/scitex-python&type=Date" />
  </a>
</p>

<p align="center">
  <a href="https://scitex.ai"><img src="docs/assets/images/scitex-icon-navy-inverted.png" alt="SciTeX" width="40"/></a>
</p>

<!-- EOF -->