scitex 2.14.0__py3-none-any.whl โ 2.15.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- scitex/__init__.py +47 -0
- scitex/_env_loader.py +156 -0
- scitex/_mcp_resources/__init__.py +37 -0
- scitex/_mcp_resources/_cheatsheet.py +135 -0
- scitex/_mcp_resources/_figrecipe.py +138 -0
- scitex/_mcp_resources/_formats.py +102 -0
- scitex/_mcp_resources/_modules.py +337 -0
- scitex/_mcp_resources/_session.py +149 -0
- scitex/_mcp_tools/__init__.py +4 -0
- scitex/_mcp_tools/audio.py +66 -0
- scitex/_mcp_tools/diagram.py +11 -95
- scitex/_mcp_tools/introspect.py +191 -0
- scitex/_mcp_tools/plt.py +260 -305
- scitex/_mcp_tools/scholar.py +74 -0
- scitex/_mcp_tools/social.py +244 -0
- scitex/_mcp_tools/writer.py +21 -204
- scitex/ai/_gen_ai/_PARAMS.py +10 -7
- scitex/ai/classification/reporters/_SingleClassificationReporter.py +45 -1603
- scitex/ai/classification/reporters/_mixins/__init__.py +36 -0
- scitex/ai/classification/reporters/_mixins/_constants.py +67 -0
- scitex/ai/classification/reporters/_mixins/_cv_summary.py +387 -0
- scitex/ai/classification/reporters/_mixins/_feature_importance.py +119 -0
- scitex/ai/classification/reporters/_mixins/_metrics.py +275 -0
- scitex/ai/classification/reporters/_mixins/_plotting.py +179 -0
- scitex/ai/classification/reporters/_mixins/_reports.py +153 -0
- scitex/ai/classification/reporters/_mixins/_storage.py +160 -0
- scitex/audio/README.md +40 -36
- scitex/audio/__init__.py +127 -59
- scitex/audio/_branding.py +185 -0
- scitex/audio/_mcp/__init__.py +32 -0
- scitex/audio/_mcp/handlers.py +59 -6
- scitex/audio/_mcp/speak_handlers.py +238 -0
- scitex/audio/_relay.py +225 -0
- scitex/audio/engines/elevenlabs_engine.py +6 -1
- scitex/audio/mcp_server.py +228 -75
- scitex/canvas/README.md +1 -1
- scitex/canvas/editor/_dearpygui/__init__.py +25 -0
- scitex/canvas/editor/_dearpygui/_editor.py +147 -0
- scitex/canvas/editor/_dearpygui/_handlers.py +476 -0
- scitex/canvas/editor/_dearpygui/_panels/__init__.py +17 -0
- scitex/canvas/editor/_dearpygui/_panels/_control.py +119 -0
- scitex/canvas/editor/_dearpygui/_panels/_element_controls.py +190 -0
- scitex/canvas/editor/_dearpygui/_panels/_preview.py +43 -0
- scitex/canvas/editor/_dearpygui/_panels/_sections.py +390 -0
- scitex/canvas/editor/_dearpygui/_plotting.py +187 -0
- scitex/canvas/editor/_dearpygui/_rendering.py +504 -0
- scitex/canvas/editor/_dearpygui/_selection.py +295 -0
- scitex/canvas/editor/_dearpygui/_state.py +93 -0
- scitex/canvas/editor/_dearpygui/_utils.py +61 -0
- scitex/canvas/editor/flask_editor/templates/__init__.py +32 -70
- scitex/cli/__init__.py +38 -43
- scitex/cli/audio.py +76 -27
- scitex/cli/capture.py +13 -20
- scitex/cli/introspect.py +443 -0
- scitex/cli/main.py +198 -109
- scitex/cli/mcp.py +60 -34
- scitex/cli/scholar/__init__.py +8 -0
- scitex/cli/scholar/_crossref_scitex.py +296 -0
- scitex/cli/scholar/_fetch.py +25 -3
- scitex/cli/social.py +314 -0
- scitex/cli/writer.py +117 -0
- scitex/config/README.md +1 -1
- scitex/config/__init__.py +16 -2
- scitex/config/_env_registry.py +191 -0
- scitex/diagram/__init__.py +42 -19
- scitex/diagram/mcp_server.py +13 -125
- scitex/introspect/__init__.py +75 -0
- scitex/introspect/_call_graph.py +303 -0
- scitex/introspect/_class_hierarchy.py +163 -0
- scitex/introspect/_core.py +42 -0
- scitex/introspect/_docstring.py +131 -0
- scitex/introspect/_examples.py +113 -0
- scitex/introspect/_imports.py +271 -0
- scitex/introspect/_mcp/__init__.py +37 -0
- scitex/introspect/_mcp/handlers.py +208 -0
- scitex/introspect/_members.py +151 -0
- scitex/introspect/_resolve.py +89 -0
- scitex/introspect/_signature.py +131 -0
- scitex/introspect/_source.py +80 -0
- scitex/introspect/_type_hints.py +172 -0
- scitex/io/bundle/README.md +1 -1
- scitex/mcp_server.py +98 -5
- scitex/plt/__init__.py +248 -550
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_wrappers.py +5 -10
- scitex/plt/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
- scitex/plt/gallery/README.md +1 -1
- scitex/plt/utils/_hitmap/__init__.py +82 -0
- scitex/plt/utils/_hitmap/_artist_extraction.py +343 -0
- scitex/plt/utils/_hitmap/_color_application.py +346 -0
- scitex/plt/utils/_hitmap/_color_conversion.py +121 -0
- scitex/plt/utils/_hitmap/_constants.py +40 -0
- scitex/plt/utils/_hitmap/_hitmap_core.py +334 -0
- scitex/plt/utils/_hitmap/_path_extraction.py +357 -0
- scitex/plt/utils/_hitmap/_query.py +113 -0
- scitex/plt/utils/_hitmap.py +46 -1616
- scitex/plt/utils/_metadata/__init__.py +80 -0
- scitex/plt/utils/_metadata/_artists/__init__.py +25 -0
- scitex/plt/utils/_metadata/_artists/_base.py +195 -0
- scitex/plt/utils/_metadata/_artists/_collections.py +356 -0
- scitex/plt/utils/_metadata/_artists/_extract.py +57 -0
- scitex/plt/utils/_metadata/_artists/_images.py +80 -0
- scitex/plt/utils/_metadata/_artists/_lines.py +261 -0
- scitex/plt/utils/_metadata/_artists/_patches.py +247 -0
- scitex/plt/utils/_metadata/_artists/_text.py +106 -0
- scitex/plt/utils/_metadata/_csv.py +416 -0
- scitex/plt/utils/_metadata/_detect.py +225 -0
- scitex/plt/utils/_metadata/_legend.py +127 -0
- scitex/plt/utils/_metadata/_rounding.py +117 -0
- scitex/plt/utils/_metadata/_verification.py +202 -0
- scitex/schema/README.md +1 -1
- scitex/scholar/__init__.py +8 -0
- scitex/scholar/_mcp/crossref_handlers.py +265 -0
- scitex/scholar/core/Scholar.py +63 -1700
- scitex/scholar/core/_mixins/__init__.py +36 -0
- scitex/scholar/core/_mixins/_enrichers.py +270 -0
- scitex/scholar/core/_mixins/_library_handlers.py +100 -0
- scitex/scholar/core/_mixins/_loaders.py +103 -0
- scitex/scholar/core/_mixins/_pdf_download.py +375 -0
- scitex/scholar/core/_mixins/_pipeline.py +312 -0
- scitex/scholar/core/_mixins/_project_handlers.py +125 -0
- scitex/scholar/core/_mixins/_savers.py +69 -0
- scitex/scholar/core/_mixins/_search.py +103 -0
- scitex/scholar/core/_mixins/_services.py +88 -0
- scitex/scholar/core/_mixins/_url_finding.py +105 -0
- scitex/scholar/crossref_scitex.py +367 -0
- scitex/scholar/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
- scitex/scholar/examples/00_run_all.sh +120 -0
- scitex/scholar/jobs/_executors.py +27 -3
- scitex/scholar/pdf_download/ScholarPDFDownloader.py +38 -416
- scitex/scholar/pdf_download/_cli.py +154 -0
- scitex/scholar/pdf_download/strategies/__init__.py +11 -8
- scitex/scholar/pdf_download/strategies/manual_download_fallback.py +80 -3
- scitex/scholar/pipelines/ScholarPipelineBibTeX.py +73 -121
- scitex/scholar/pipelines/ScholarPipelineParallel.py +80 -138
- scitex/scholar/pipelines/ScholarPipelineSingle.py +43 -63
- scitex/scholar/pipelines/_single_steps.py +71 -36
- scitex/scholar/storage/_LibraryManager.py +97 -1695
- scitex/scholar/storage/_mixins/__init__.py +30 -0
- scitex/scholar/storage/_mixins/_bibtex_handlers.py +128 -0
- scitex/scholar/storage/_mixins/_library_operations.py +218 -0
- scitex/scholar/storage/_mixins/_metadata_conversion.py +226 -0
- scitex/scholar/storage/_mixins/_paper_saving.py +456 -0
- scitex/scholar/storage/_mixins/_resolution.py +376 -0
- scitex/scholar/storage/_mixins/_storage_helpers.py +121 -0
- scitex/scholar/storage/_mixins/_symlink_handlers.py +226 -0
- scitex/scholar/url_finder/.tmp/open_url/KNOWN_RESOLVERS.py +462 -0
- scitex/scholar/url_finder/.tmp/open_url/README.md +223 -0
- scitex/scholar/url_finder/.tmp/open_url/_DOIToURLResolver.py +694 -0
- scitex/scholar/url_finder/.tmp/open_url/_OpenURLResolver.py +1160 -0
- scitex/scholar/url_finder/.tmp/open_url/_ResolverLinkFinder.py +344 -0
- scitex/scholar/url_finder/.tmp/open_url/__init__.py +24 -0
- scitex/security/README.md +3 -3
- scitex/session/README.md +1 -1
- scitex/sh/README.md +1 -1
- scitex/social/__init__.py +153 -0
- scitex/social/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
- scitex/template/README.md +1 -1
- scitex/template/clone_writer_directory.py +5 -5
- scitex/writer/README.md +1 -1
- scitex/writer/_mcp/handlers.py +11 -744
- scitex/writer/_mcp/tool_schemas.py +5 -335
- scitex-2.15.1.dist-info/METADATA +648 -0
- {scitex-2.14.0.dist-info โ scitex-2.15.1.dist-info}/RECORD +166 -111
- scitex/canvas/editor/flask_editor/templates/_scripts.py +0 -4933
- scitex/canvas/editor/flask_editor/templates/_styles.py +0 -1658
- scitex/dev/plt/data/mpl/PLOTTING_FUNCTIONS.yaml +0 -90
- scitex/dev/plt/data/mpl/PLOTTING_SIGNATURES.yaml +0 -1571
- scitex/dev/plt/data/mpl/PLOTTING_SIGNATURES_DETAILED.yaml +0 -6262
- scitex/dev/plt/data/mpl/SIGNATURES_FLATTENED.yaml +0 -1274
- scitex/dev/plt/data/mpl/dir_ax.txt +0 -459
- scitex/diagram/_compile.py +0 -312
- scitex/diagram/_diagram.py +0 -355
- scitex/diagram/_mcp/__init__.py +0 -4
- scitex/diagram/_mcp/handlers.py +0 -400
- scitex/diagram/_mcp/tool_schemas.py +0 -157
- scitex/diagram/_presets.py +0 -173
- scitex/diagram/_schema.py +0 -182
- scitex/diagram/_split.py +0 -278
- scitex/plt/_mcp/__init__.py +0 -4
- scitex/plt/_mcp/_handlers_annotation.py +0 -102
- scitex/plt/_mcp/_handlers_figure.py +0 -195
- scitex/plt/_mcp/_handlers_plot.py +0 -252
- scitex/plt/_mcp/_handlers_style.py +0 -219
- scitex/plt/_mcp/handlers.py +0 -74
- scitex/plt/_mcp/tool_schemas.py +0 -497
- scitex/plt/mcp_server.py +0 -231
- scitex/scholar/data/.gitkeep +0 -0
- scitex/scholar/data/README.md +0 -44
- scitex/scholar/data/bib_files/bibliography.bib +0 -1952
- scitex/scholar/data/bib_files/neurovista.bib +0 -277
- scitex/scholar/data/bib_files/neurovista_enriched.bib +0 -441
- scitex/scholar/data/bib_files/neurovista_enriched_enriched.bib +0 -441
- scitex/scholar/data/bib_files/neurovista_processed.bib +0 -338
- scitex/scholar/data/bib_files/openaccess.bib +0 -89
- scitex/scholar/data/bib_files/pac-seizure_prediction_enriched.bib +0 -2178
- scitex/scholar/data/bib_files/pac.bib +0 -698
- scitex/scholar/data/bib_files/pac_enriched.bib +0 -1061
- scitex/scholar/data/bib_files/pac_processed.bib +0 -0
- scitex/scholar/data/bib_files/pac_titles.txt +0 -75
- scitex/scholar/data/bib_files/paywalled.bib +0 -98
- scitex/scholar/data/bib_files/related-papers-by-coauthors.bib +0 -58
- scitex/scholar/data/bib_files/related-papers-by-coauthors_enriched.bib +0 -87
- scitex/scholar/data/bib_files/seizure_prediction.bib +0 -694
- scitex/scholar/data/bib_files/seizure_prediction_processed.bib +0 -0
- scitex/scholar/data/bib_files/test_complete_enriched.bib +0 -437
- scitex/scholar/data/bib_files/test_final_enriched.bib +0 -437
- scitex/scholar/data/bib_files/test_seizure.bib +0 -46
- scitex/scholar/data/impact_factor/JCR_IF_2022.xlsx +0 -0
- scitex/scholar/data/impact_factor/JCR_IF_2024.db +0 -0
- scitex/scholar/data/impact_factor/JCR_IF_2024.xlsx +0 -0
- scitex/scholar/data/impact_factor/JCR_IF_2024_v01.db +0 -0
- scitex/scholar/data/impact_factor.db +0 -0
- scitex/scholar/examples/SUGGESTIONS.md +0 -865
- scitex/scholar/examples/dev.py +0 -38
- scitex-2.14.0.dist-info/METADATA +0 -1238
- {scitex-2.14.0.dist-info โ scitex-2.15.1.dist-info}/WHEEL +0 -0
- {scitex-2.14.0.dist-info โ scitex-2.15.1.dist-info}/entry_points.txt +0 -0
- {scitex-2.14.0.dist-info โ scitex-2.15.1.dist-info}/licenses/LICENSE +0 -0
scitex-2.14.0.dist-info/METADATA
DELETED
|
@@ -1,1238 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: scitex
|
|
3
|
-
Version: 2.14.0
|
|
4
|
-
Summary: A comprehensive Python library for scientific computing and data analysis
|
|
5
|
-
Project-URL: Homepage, https://github.com/ywatanabe1989/scitex-code
|
|
6
|
-
Project-URL: Documentation, https://scitex.readthedocs.io
|
|
7
|
-
Project-URL: Repository, https://github.com/ywatanabe1989/scitex-code
|
|
8
|
-
Project-URL: Bug Tracker, https://github.com/ywatanabe1989/scitex-code/issues
|
|
9
|
-
Author-email: Yusuke Watanabe <ywatanabe@scitex.ai>
|
|
10
|
-
License: AGPL-3.0
|
|
11
|
-
License-File: LICENSE
|
|
12
|
-
Keywords: data-analysis,machine-learning,neural-networks,research,scientific-computing,signal-processing
|
|
13
|
-
Classifier: Development Status :: 4 - Beta
|
|
14
|
-
Classifier: Intended Audience :: Developers
|
|
15
|
-
Classifier: Intended Audience :: Science/Research
|
|
16
|
-
Classifier: License :: OSI Approved :: GNU Affero General Public License v3
|
|
17
|
-
Classifier: Operating System :: OS Independent
|
|
18
|
-
Classifier: Programming Language :: Python :: 3
|
|
19
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
20
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
-
Classifier: Programming Language :: Python :: 3.13
|
|
23
|
-
Classifier: Topic :: Scientific/Engineering
|
|
24
|
-
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
25
|
-
Classifier: Topic :: Scientific/Engineering :: Information Analysis
|
|
26
|
-
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
27
|
-
Requires-Python: >=3.10
|
|
28
|
-
Requires-Dist: natsort
|
|
29
|
-
Requires-Dist: numpy
|
|
30
|
-
Requires-Dist: packaging
|
|
31
|
-
Requires-Dist: pandas
|
|
32
|
-
Requires-Dist: pyyaml
|
|
33
|
-
Requires-Dist: tqdm
|
|
34
|
-
Provides-Extra: ai
|
|
35
|
-
Requires-Dist: anthropic; extra == 'ai'
|
|
36
|
-
Requires-Dist: google-genai; extra == 'ai'
|
|
37
|
-
Requires-Dist: groq; extra == 'ai'
|
|
38
|
-
Requires-Dist: imbalanced-learn; extra == 'ai'
|
|
39
|
-
Requires-Dist: joblib; extra == 'ai'
|
|
40
|
-
Requires-Dist: markdown2; extra == 'ai'
|
|
41
|
-
Requires-Dist: matplotlib; extra == 'ai'
|
|
42
|
-
Requires-Dist: natsort; extra == 'ai'
|
|
43
|
-
Requires-Dist: openai; extra == 'ai'
|
|
44
|
-
Requires-Dist: pillow; extra == 'ai'
|
|
45
|
-
Requires-Dist: pyyaml; extra == 'ai'
|
|
46
|
-
Requires-Dist: requests; extra == 'ai'
|
|
47
|
-
Requires-Dist: ruamel-yaml; extra == 'ai'
|
|
48
|
-
Requires-Dist: scikit-learn; extra == 'ai'
|
|
49
|
-
Requires-Dist: scipy; extra == 'ai'
|
|
50
|
-
Requires-Dist: seaborn; extra == 'ai'
|
|
51
|
-
Requires-Dist: sktime; extra == 'ai'
|
|
52
|
-
Requires-Dist: umap-learn; extra == 'ai'
|
|
53
|
-
Requires-Dist: xarray; extra == 'ai'
|
|
54
|
-
Provides-Extra: all
|
|
55
|
-
Requires-Dist: accelerate; extra == 'all'
|
|
56
|
-
Requires-Dist: aiohttp; extra == 'all'
|
|
57
|
-
Requires-Dist: anthropic; extra == 'all'
|
|
58
|
-
Requires-Dist: beautifulsoup4; extra == 'all'
|
|
59
|
-
Requires-Dist: bibtexparser; extra == 'all'
|
|
60
|
-
Requires-Dist: bitsandbytes; extra == 'all'
|
|
61
|
-
Requires-Dist: catboost; extra == 'all'
|
|
62
|
-
Requires-Dist: celery; extra == 'all'
|
|
63
|
-
Requires-Dist: click; extra == 'all'
|
|
64
|
-
Requires-Dist: crawl4ai; extra == 'all'
|
|
65
|
-
Requires-Dist: csv2latex; extra == 'all'
|
|
66
|
-
Requires-Dist: dearpygui; extra == 'all'
|
|
67
|
-
Requires-Dist: einops; extra == 'all'
|
|
68
|
-
Requires-Dist: elevenlabs; extra == 'all'
|
|
69
|
-
Requires-Dist: fairscale; extra == 'all'
|
|
70
|
-
Requires-Dist: fastapi; extra == 'all'
|
|
71
|
-
Requires-Dist: feedparser; extra == 'all'
|
|
72
|
-
Requires-Dist: figrecipe; extra == 'all'
|
|
73
|
-
Requires-Dist: flask; extra == 'all'
|
|
74
|
-
Requires-Dist: geom-median; extra == 'all'
|
|
75
|
-
Requires-Dist: gitpython; extra == 'all'
|
|
76
|
-
Requires-Dist: google-genai; extra == 'all'
|
|
77
|
-
Requires-Dist: groq; extra == 'all'
|
|
78
|
-
Requires-Dist: gtts; extra == 'all'
|
|
79
|
-
Requires-Dist: h5py; extra == 'all'
|
|
80
|
-
Requires-Dist: html2text; extra == 'all'
|
|
81
|
-
Requires-Dist: httpx; extra == 'all'
|
|
82
|
-
Requires-Dist: imbalanced-learn; extra == 'all'
|
|
83
|
-
Requires-Dist: ipdb; extra == 'all'
|
|
84
|
-
Requires-Dist: ipykernel; extra == 'all'
|
|
85
|
-
Requires-Dist: ipython; extra == 'all'
|
|
86
|
-
Requires-Dist: joblib; extra == 'all'
|
|
87
|
-
Requires-Dist: julius; extra == 'all'
|
|
88
|
-
Requires-Dist: jupyter-collaboration; extra == 'all'
|
|
89
|
-
Requires-Dist: jupyterlab; extra == 'all'
|
|
90
|
-
Requires-Dist: jupytext; extra == 'all'
|
|
91
|
-
Requires-Dist: llvmlite>=0.39.0; extra == 'all'
|
|
92
|
-
Requires-Dist: lxml; extra == 'all'
|
|
93
|
-
Requires-Dist: lxml-html-clean; extra == 'all'
|
|
94
|
-
Requires-Dist: markdown; extra == 'all'
|
|
95
|
-
Requires-Dist: matplotlib; extra == 'all'
|
|
96
|
-
Requires-Dist: mcp; extra == 'all'
|
|
97
|
-
Requires-Dist: mne; extra == 'all'
|
|
98
|
-
Requires-Dist: mss; extra == 'all'
|
|
99
|
-
Requires-Dist: natsort; extra == 'all'
|
|
100
|
-
Requires-Dist: nbsphinx; extra == 'all'
|
|
101
|
-
Requires-Dist: nest-asyncio; extra == 'all'
|
|
102
|
-
Requires-Dist: numcodecs; extra == 'all'
|
|
103
|
-
Requires-Dist: obspy; extra == 'all'
|
|
104
|
-
Requires-Dist: openai; extra == 'all'
|
|
105
|
-
Requires-Dist: opencv-python; extra == 'all'
|
|
106
|
-
Requires-Dist: openpyxl; extra == 'all'
|
|
107
|
-
Requires-Dist: optuna; extra == 'all'
|
|
108
|
-
Requires-Dist: papermill; extra == 'all'
|
|
109
|
-
Requires-Dist: pdfplumber; extra == 'all'
|
|
110
|
-
Requires-Dist: piexif; extra == 'all'
|
|
111
|
-
Requires-Dist: pillow; extra == 'all'
|
|
112
|
-
Requires-Dist: playwright>=1.40.0; extra == 'all'
|
|
113
|
-
Requires-Dist: plotly; extra == 'all'
|
|
114
|
-
Requires-Dist: psutil; extra == 'all'
|
|
115
|
-
Requires-Dist: psycopg2-binary; extra == 'all'
|
|
116
|
-
Requires-Dist: pybids; extra == 'all'
|
|
117
|
-
Requires-Dist: pydantic; extra == 'all'
|
|
118
|
-
Requires-Dist: pydub; extra == 'all'
|
|
119
|
-
Requires-Dist: pyedflib; extra == 'all'
|
|
120
|
-
Requires-Dist: pymatreader; extra == 'all'
|
|
121
|
-
Requires-Dist: pymed; extra == 'all'
|
|
122
|
-
Requires-Dist: pymupdf; extra == 'all'
|
|
123
|
-
Requires-Dist: pypandoc; extra == 'all'
|
|
124
|
-
Requires-Dist: pypdf; extra == 'all'
|
|
125
|
-
Requires-Dist: pypdf2; extra == 'all'
|
|
126
|
-
Requires-Dist: pyperclip; extra == 'all'
|
|
127
|
-
Requires-Dist: pyqt6; extra == 'all'
|
|
128
|
-
Requires-Dist: pytesseract; extra == 'all'
|
|
129
|
-
Requires-Dist: python-docx; extra == 'all'
|
|
130
|
-
Requires-Dist: pytorch-optimizer; extra == 'all'
|
|
131
|
-
Requires-Dist: pytorch-pretrained-vit; extra == 'all'
|
|
132
|
-
Requires-Dist: pyttsx3; extra == 'all'
|
|
133
|
-
Requires-Dist: qrcode[pil]; extra == 'all'
|
|
134
|
-
Requires-Dist: readability-lxml; extra == 'all'
|
|
135
|
-
Requires-Dist: readchar; extra == 'all'
|
|
136
|
-
Requires-Dist: requests; extra == 'all'
|
|
137
|
-
Requires-Dist: ripple-detection; extra == 'all'
|
|
138
|
-
Requires-Dist: ruamel-yaml; extra == 'all'
|
|
139
|
-
Requires-Dist: scholarly; extra == 'all'
|
|
140
|
-
Requires-Dist: scikit-image; extra == 'all'
|
|
141
|
-
Requires-Dist: scikit-learn; extra == 'all'
|
|
142
|
-
Requires-Dist: scipy; extra == 'all'
|
|
143
|
-
Requires-Dist: seaborn; extra == 'all'
|
|
144
|
-
Requires-Dist: selenium; extra == 'all'
|
|
145
|
-
Requires-Dist: sktime; extra == 'all'
|
|
146
|
-
Requires-Dist: sounddevice; extra == 'all'
|
|
147
|
-
Requires-Dist: sqlalchemy; extra == 'all'
|
|
148
|
-
Requires-Dist: statsmodels; extra == 'all'
|
|
149
|
-
Requires-Dist: streamlit; extra == 'all'
|
|
150
|
-
Requires-Dist: sympy; extra == 'all'
|
|
151
|
-
Requires-Dist: tenacity; extra == 'all'
|
|
152
|
-
Requires-Dist: tensorpac; extra == 'all'
|
|
153
|
-
Requires-Dist: termplotlib; extra == 'all'
|
|
154
|
-
Requires-Dist: torch; extra == 'all'
|
|
155
|
-
Requires-Dist: torchaudio; extra == 'all'
|
|
156
|
-
Requires-Dist: torchsummary; extra == 'all'
|
|
157
|
-
Requires-Dist: torchvision; extra == 'all'
|
|
158
|
-
Requires-Dist: transformers; extra == 'all'
|
|
159
|
-
Requires-Dist: umap-learn>=0.5.4; extra == 'all'
|
|
160
|
-
Requires-Dist: watchdog; extra == 'all'
|
|
161
|
-
Requires-Dist: webdriver-manager; extra == 'all'
|
|
162
|
-
Requires-Dist: xarray; extra == 'all'
|
|
163
|
-
Requires-Dist: xlrd; extra == 'all'
|
|
164
|
-
Requires-Dist: xlsx2csv; extra == 'all'
|
|
165
|
-
Requires-Dist: yq; extra == 'all'
|
|
166
|
-
Requires-Dist: zarr; extra == 'all'
|
|
167
|
-
Provides-Extra: audio
|
|
168
|
-
Requires-Dist: elevenlabs; extra == 'audio'
|
|
169
|
-
Requires-Dist: gtts; extra == 'audio'
|
|
170
|
-
Requires-Dist: mcp; extra == 'audio'
|
|
171
|
-
Requires-Dist: pydub; extra == 'audio'
|
|
172
|
-
Requires-Dist: pytest-asyncio; extra == 'audio'
|
|
173
|
-
Requires-Dist: pyttsx3; extra == 'audio'
|
|
174
|
-
Provides-Extra: benchmark
|
|
175
|
-
Requires-Dist: psutil; extra == 'benchmark'
|
|
176
|
-
Provides-Extra: bridge
|
|
177
|
-
Requires-Dist: matplotlib; extra == 'bridge'
|
|
178
|
-
Requires-Dist: scipy; extra == 'bridge'
|
|
179
|
-
Provides-Extra: browser
|
|
180
|
-
Requires-Dist: aiohttp; extra == 'browser'
|
|
181
|
-
Requires-Dist: matplotlib; extra == 'browser'
|
|
182
|
-
Requires-Dist: playwright>=1.40.0; extra == 'browser'
|
|
183
|
-
Provides-Extra: capture
|
|
184
|
-
Requires-Dist: mcp; extra == 'capture'
|
|
185
|
-
Requires-Dist: mss; extra == 'capture'
|
|
186
|
-
Requires-Dist: pillow; extra == 'capture'
|
|
187
|
-
Requires-Dist: playwright>=1.40.0; extra == 'capture'
|
|
188
|
-
Provides-Extra: cli
|
|
189
|
-
Requires-Dist: aiohttp; extra == 'cli'
|
|
190
|
-
Requires-Dist: beautifulsoup4; extra == 'cli'
|
|
191
|
-
Requires-Dist: click; extra == 'cli'
|
|
192
|
-
Requires-Dist: gitpython; extra == 'cli'
|
|
193
|
-
Requires-Dist: playwright; extra == 'cli'
|
|
194
|
-
Requires-Dist: pyyaml; extra == 'cli'
|
|
195
|
-
Requires-Dist: requests; extra == 'cli'
|
|
196
|
-
Provides-Extra: cloud
|
|
197
|
-
Requires-Dist: matplotlib; extra == 'cloud'
|
|
198
|
-
Provides-Extra: config
|
|
199
|
-
Requires-Dist: pyyaml; extra == 'config'
|
|
200
|
-
Provides-Extra: db
|
|
201
|
-
Requires-Dist: psycopg2-binary; extra == 'db'
|
|
202
|
-
Requires-Dist: sqlalchemy; extra == 'db'
|
|
203
|
-
Provides-Extra: decorators
|
|
204
|
-
Requires-Dist: joblib; extra == 'decorators'
|
|
205
|
-
Requires-Dist: matplotlib; extra == 'decorators'
|
|
206
|
-
Requires-Dist: pytest-asyncio; extra == 'decorators'
|
|
207
|
-
Requires-Dist: scipy; extra == 'decorators'
|
|
208
|
-
Requires-Dist: tqdm; extra == 'decorators'
|
|
209
|
-
Requires-Dist: xarray; extra == 'decorators'
|
|
210
|
-
Provides-Extra: dev
|
|
211
|
-
Requires-Dist: build; extra == 'dev'
|
|
212
|
-
Requires-Dist: jedi; extra == 'dev'
|
|
213
|
-
Requires-Dist: line-profiler; extra == 'dev'
|
|
214
|
-
Requires-Dist: markdown; extra == 'dev'
|
|
215
|
-
Requires-Dist: markdown2; extra == 'dev'
|
|
216
|
-
Requires-Dist: matplotlib; extra == 'dev'
|
|
217
|
-
Requires-Dist: memory-profiler; extra == 'dev'
|
|
218
|
-
Requires-Dist: mypy; extra == 'dev'
|
|
219
|
-
Requires-Dist: myst-parser; extra == 'dev'
|
|
220
|
-
Requires-Dist: pre-commit; extra == 'dev'
|
|
221
|
-
Requires-Dist: pygments; extra == 'dev'
|
|
222
|
-
Requires-Dist: pyright; extra == 'dev'
|
|
223
|
-
Requires-Dist: pytest; extra == 'dev'
|
|
224
|
-
Requires-Dist: pytest-asyncio; extra == 'dev'
|
|
225
|
-
Requires-Dist: pytest-cov; extra == 'dev'
|
|
226
|
-
Requires-Dist: pytest-env; extra == 'dev'
|
|
227
|
-
Requires-Dist: pytest-json-report; extra == 'dev'
|
|
228
|
-
Requires-Dist: pytest-mock; extra == 'dev'
|
|
229
|
-
Requires-Dist: pytest-testmon; extra == 'dev'
|
|
230
|
-
Requires-Dist: pytest-timeout; extra == 'dev'
|
|
231
|
-
Requires-Dist: pytest-xdist; extra == 'dev'
|
|
232
|
-
Requires-Dist: python-lsp-server; extra == 'dev'
|
|
233
|
-
Requires-Dist: pyyaml; extra == 'dev'
|
|
234
|
-
Requires-Dist: rope; extra == 'dev'
|
|
235
|
-
Requires-Dist: ruff; extra == 'dev'
|
|
236
|
-
Requires-Dist: setuptools; extra == 'dev'
|
|
237
|
-
Requires-Dist: sphinx; extra == 'dev'
|
|
238
|
-
Requires-Dist: sphinx-autobuild; extra == 'dev'
|
|
239
|
-
Requires-Dist: sphinx-autodoc-typehints; extra == 'dev'
|
|
240
|
-
Requires-Dist: sphinx-rtd-theme; extra == 'dev'
|
|
241
|
-
Requires-Dist: stdlib-list; extra == 'dev'
|
|
242
|
-
Requires-Dist: tomlkit; extra == 'dev'
|
|
243
|
-
Requires-Dist: twine; extra == 'dev'
|
|
244
|
-
Requires-Dist: types-pyyaml; extra == 'dev'
|
|
245
|
-
Requires-Dist: types-requests; extra == 'dev'
|
|
246
|
-
Requires-Dist: types-setuptools; extra == 'dev'
|
|
247
|
-
Requires-Dist: wheel; extra == 'dev'
|
|
248
|
-
Provides-Extra: devtools
|
|
249
|
-
Requires-Dist: joblib; extra == 'devtools'
|
|
250
|
-
Requires-Dist: matplotlib; extra == 'devtools'
|
|
251
|
-
Requires-Dist: ruamel-yaml; extra == 'devtools'
|
|
252
|
-
Requires-Dist: scipy; extra == 'devtools'
|
|
253
|
-
Requires-Dist: seaborn; extra == 'devtools'
|
|
254
|
-
Requires-Dist: xarray; extra == 'devtools'
|
|
255
|
-
Provides-Extra: diagram
|
|
256
|
-
Requires-Dist: pyyaml; extra == 'diagram'
|
|
257
|
-
Provides-Extra: dsp
|
|
258
|
-
Requires-Dist: h5py; extra == 'dsp'
|
|
259
|
-
Requires-Dist: joblib; extra == 'dsp'
|
|
260
|
-
Requires-Dist: matplotlib; extra == 'dsp'
|
|
261
|
-
Requires-Dist: readchar; extra == 'dsp'
|
|
262
|
-
Requires-Dist: ruamel-yaml; extra == 'dsp'
|
|
263
|
-
Requires-Dist: scipy; extra == 'dsp'
|
|
264
|
-
Requires-Dist: seaborn; extra == 'dsp'
|
|
265
|
-
Requires-Dist: sounddevice; extra == 'dsp'
|
|
266
|
-
Requires-Dist: tensorpac; extra == 'dsp'
|
|
267
|
-
Requires-Dist: xarray; extra == 'dsp'
|
|
268
|
-
Provides-Extra: dt
|
|
269
|
-
Requires-Dist: matplotlib; extra == 'dt'
|
|
270
|
-
Provides-Extra: gen
|
|
271
|
-
Requires-Dist: h5py; extra == 'gen'
|
|
272
|
-
Requires-Dist: ipython; extra == 'gen'
|
|
273
|
-
Requires-Dist: joblib; extra == 'gen'
|
|
274
|
-
Requires-Dist: matplotlib; extra == 'gen'
|
|
275
|
-
Requires-Dist: pyperclip; extra == 'gen'
|
|
276
|
-
Requires-Dist: readchar; extra == 'gen'
|
|
277
|
-
Requires-Dist: requests; extra == 'gen'
|
|
278
|
-
Requires-Dist: scipy; extra == 'gen'
|
|
279
|
-
Requires-Dist: xarray; extra == 'gen'
|
|
280
|
-
Provides-Extra: git
|
|
281
|
-
Requires-Dist: gitpython; extra == 'git'
|
|
282
|
-
Requires-Dist: matplotlib; extra == 'git'
|
|
283
|
-
Provides-Extra: heavy
|
|
284
|
-
Requires-Dist: catboost; extra == 'heavy'
|
|
285
|
-
Requires-Dist: jax; extra == 'heavy'
|
|
286
|
-
Requires-Dist: julius; extra == 'heavy'
|
|
287
|
-
Requires-Dist: mne; extra == 'heavy'
|
|
288
|
-
Requires-Dist: optuna; extra == 'heavy'
|
|
289
|
-
Requires-Dist: psutil; extra == 'heavy'
|
|
290
|
-
Requires-Dist: pytorch-pretrained-vit; extra == 'heavy'
|
|
291
|
-
Requires-Dist: ripple-detection; extra == 'heavy'
|
|
292
|
-
Requires-Dist: tensorflow; extra == 'heavy'
|
|
293
|
-
Requires-Dist: torch; extra == 'heavy'
|
|
294
|
-
Requires-Dist: torchaudio; extra == 'heavy'
|
|
295
|
-
Requires-Dist: torchsummary; extra == 'heavy'
|
|
296
|
-
Requires-Dist: torchvision; extra == 'heavy'
|
|
297
|
-
Requires-Dist: umap-learn; extra == 'heavy'
|
|
298
|
-
Provides-Extra: io
|
|
299
|
-
Requires-Dist: gitpython; extra == 'io'
|
|
300
|
-
Requires-Dist: h5py; extra == 'io'
|
|
301
|
-
Requires-Dist: html2text; extra == 'io'
|
|
302
|
-
Requires-Dist: joblib; extra == 'io'
|
|
303
|
-
Requires-Dist: lxml; extra == 'io'
|
|
304
|
-
Requires-Dist: lxml-html-clean; extra == 'io'
|
|
305
|
-
Requires-Dist: markdown; extra == 'io'
|
|
306
|
-
Requires-Dist: matplotlib; extra == 'io'
|
|
307
|
-
Requires-Dist: natsort; extra == 'io'
|
|
308
|
-
Requires-Dist: numcodecs; extra == 'io'
|
|
309
|
-
Requires-Dist: openpyxl; extra == 'io'
|
|
310
|
-
Requires-Dist: pdfplumber; extra == 'io'
|
|
311
|
-
Requires-Dist: piexif; extra == 'io'
|
|
312
|
-
Requires-Dist: pillow; extra == 'io'
|
|
313
|
-
Requires-Dist: plotly; extra == 'io'
|
|
314
|
-
Requires-Dist: pyarrow; extra == 'io'
|
|
315
|
-
Requires-Dist: pymatreader; extra == 'io'
|
|
316
|
-
Requires-Dist: pymupdf; extra == 'io'
|
|
317
|
-
Requires-Dist: pypdf; extra == 'io'
|
|
318
|
-
Requires-Dist: pypdf2; extra == 'io'
|
|
319
|
-
Requires-Dist: python-docx; extra == 'io'
|
|
320
|
-
Requires-Dist: pyyaml; extra == 'io'
|
|
321
|
-
Requires-Dist: qrcode[pil]; extra == 'io'
|
|
322
|
-
Requires-Dist: ruamel-yaml; extra == 'io'
|
|
323
|
-
Requires-Dist: scipy; extra == 'io'
|
|
324
|
-
Requires-Dist: tqdm; extra == 'io'
|
|
325
|
-
Requires-Dist: xarray; extra == 'io'
|
|
326
|
-
Requires-Dist: xlrd; extra == 'io'
|
|
327
|
-
Requires-Dist: zarr; extra == 'io'
|
|
328
|
-
Provides-Extra: linalg
|
|
329
|
-
Requires-Dist: geom-median; extra == 'linalg'
|
|
330
|
-
Requires-Dist: joblib; extra == 'linalg'
|
|
331
|
-
Requires-Dist: matplotlib; extra == 'linalg'
|
|
332
|
-
Requires-Dist: scipy; extra == 'linalg'
|
|
333
|
-
Requires-Dist: sympy; extra == 'linalg'
|
|
334
|
-
Requires-Dist: xarray; extra == 'linalg'
|
|
335
|
-
Provides-Extra: logging
|
|
336
|
-
Requires-Dist: matplotlib; extra == 'logging'
|
|
337
|
-
Provides-Extra: msword
|
|
338
|
-
Requires-Dist: pypandoc; extra == 'msword'
|
|
339
|
-
Requires-Dist: python-docx; extra == 'msword'
|
|
340
|
-
Provides-Extra: nn
|
|
341
|
-
Requires-Dist: h5py; extra == 'nn'
|
|
342
|
-
Requires-Dist: ipdb; extra == 'nn'
|
|
343
|
-
Requires-Dist: joblib; extra == 'nn'
|
|
344
|
-
Requires-Dist: matplotlib; extra == 'nn'
|
|
345
|
-
Requires-Dist: readchar; extra == 'nn'
|
|
346
|
-
Requires-Dist: ruamel-yaml; extra == 'nn'
|
|
347
|
-
Requires-Dist: seaborn; extra == 'nn'
|
|
348
|
-
Requires-Dist: tensorpac; extra == 'nn'
|
|
349
|
-
Requires-Dist: xarray; extra == 'nn'
|
|
350
|
-
Provides-Extra: parallel
|
|
351
|
-
Requires-Dist: tqdm; extra == 'parallel'
|
|
352
|
-
Provides-Extra: path
|
|
353
|
-
Requires-Dist: gitpython; extra == 'path'
|
|
354
|
-
Requires-Dist: matplotlib; extra == 'path'
|
|
355
|
-
Provides-Extra: pd
|
|
356
|
-
Requires-Dist: xarray; extra == 'pd'
|
|
357
|
-
Provides-Extra: plt
|
|
358
|
-
Requires-Dist: joblib; extra == 'plt'
|
|
359
|
-
Requires-Dist: matplotlib; extra == 'plt'
|
|
360
|
-
Requires-Dist: piexif; extra == 'plt'
|
|
361
|
-
Requires-Dist: pillow; extra == 'plt'
|
|
362
|
-
Requires-Dist: pyyaml; extra == 'plt'
|
|
363
|
-
Requires-Dist: ruamel-yaml; extra == 'plt'
|
|
364
|
-
Requires-Dist: scipy; extra == 'plt'
|
|
365
|
-
Requires-Dist: seaborn; extra == 'plt'
|
|
366
|
-
Requires-Dist: termplotlib; extra == 'plt'
|
|
367
|
-
Requires-Dist: xarray; extra == 'plt'
|
|
368
|
-
Provides-Extra: repro
|
|
369
|
-
Requires-Dist: matplotlib; extra == 'repro'
|
|
370
|
-
Provides-Extra: resource
|
|
371
|
-
Requires-Dist: h5py; extra == 'resource'
|
|
372
|
-
Requires-Dist: joblib; extra == 'resource'
|
|
373
|
-
Requires-Dist: matplotlib; extra == 'resource'
|
|
374
|
-
Requires-Dist: psutil; extra == 'resource'
|
|
375
|
-
Requires-Dist: pyyaml; extra == 'resource'
|
|
376
|
-
Requires-Dist: readchar; extra == 'resource'
|
|
377
|
-
Requires-Dist: ruamel-yaml; extra == 'resource'
|
|
378
|
-
Requires-Dist: scipy; extra == 'resource'
|
|
379
|
-
Provides-Extra: scholar
|
|
380
|
-
Requires-Dist: aiohttp; extra == 'scholar'
|
|
381
|
-
Requires-Dist: beautifulsoup4; extra == 'scholar'
|
|
382
|
-
Requires-Dist: bibtexparser; extra == 'scholar'
|
|
383
|
-
Requires-Dist: crawl4ai; extra == 'scholar'
|
|
384
|
-
Requires-Dist: feedparser; extra == 'scholar'
|
|
385
|
-
Requires-Dist: html2text; extra == 'scholar'
|
|
386
|
-
Requires-Dist: httpx; extra == 'scholar'
|
|
387
|
-
Requires-Dist: matplotlib; extra == 'scholar'
|
|
388
|
-
Requires-Dist: natsort; extra == 'scholar'
|
|
389
|
-
Requires-Dist: nest-asyncio; extra == 'scholar'
|
|
390
|
-
Requires-Dist: openpyxl; extra == 'scholar'
|
|
391
|
-
Requires-Dist: pdfplumber; extra == 'scholar'
|
|
392
|
-
Requires-Dist: pillow; extra == 'scholar'
|
|
393
|
-
Requires-Dist: playwright>=1.40.0; extra == 'scholar'
|
|
394
|
-
Requires-Dist: pydantic; extra == 'scholar'
|
|
395
|
-
Requires-Dist: pymed; extra == 'scholar'
|
|
396
|
-
Requires-Dist: pymupdf; extra == 'scholar'
|
|
397
|
-
Requires-Dist: pypdf2; extra == 'scholar'
|
|
398
|
-
Requires-Dist: pytesseract; extra == 'scholar'
|
|
399
|
-
Requires-Dist: python-docx; extra == 'scholar'
|
|
400
|
-
Requires-Dist: pyyaml; extra == 'scholar'
|
|
401
|
-
Requires-Dist: requests; extra == 'scholar'
|
|
402
|
-
Requires-Dist: ruamel-yaml; extra == 'scholar'
|
|
403
|
-
Requires-Dist: scholarly; extra == 'scholar'
|
|
404
|
-
Requires-Dist: scikit-learn; extra == 'scholar'
|
|
405
|
-
Requires-Dist: seaborn; extra == 'scholar'
|
|
406
|
-
Requires-Dist: selenium; extra == 'scholar'
|
|
407
|
-
Requires-Dist: sql-manager; extra == 'scholar'
|
|
408
|
-
Requires-Dist: sqlalchemy; extra == 'scholar'
|
|
409
|
-
Requires-Dist: tenacity; extra == 'scholar'
|
|
410
|
-
Requires-Dist: tqdm; extra == 'scholar'
|
|
411
|
-
Requires-Dist: watchdog; extra == 'scholar'
|
|
412
|
-
Requires-Dist: webdriver-manager; extra == 'scholar'
|
|
413
|
-
Provides-Extra: session
|
|
414
|
-
Requires-Dist: matplotlib; extra == 'session'
|
|
415
|
-
Requires-Dist: pyyaml; extra == 'session'
|
|
416
|
-
Provides-Extra: sh
|
|
417
|
-
Requires-Dist: matplotlib; extra == 'sh'
|
|
418
|
-
Provides-Extra: stats
|
|
419
|
-
Requires-Dist: matplotlib; extra == 'stats'
|
|
420
|
-
Requires-Dist: scipy; extra == 'stats'
|
|
421
|
-
Requires-Dist: statsmodels; extra == 'stats'
|
|
422
|
-
Requires-Dist: tabulate; extra == 'stats'
|
|
423
|
-
Provides-Extra: str
|
|
424
|
-
Requires-Dist: matplotlib; extra == 'str'
|
|
425
|
-
Requires-Dist: natsort; extra == 'str'
|
|
426
|
-
Requires-Dist: xarray; extra == 'str'
|
|
427
|
-
Provides-Extra: tex
|
|
428
|
-
Requires-Dist: matplotlib; extra == 'tex'
|
|
429
|
-
Provides-Extra: torch
|
|
430
|
-
Requires-Dist: torch; extra == 'torch'
|
|
431
|
-
Provides-Extra: types
|
|
432
|
-
Requires-Dist: xarray; extra == 'types'
|
|
433
|
-
Provides-Extra: utils
|
|
434
|
-
Requires-Dist: h5py; extra == 'utils'
|
|
435
|
-
Requires-Dist: matplotlib; extra == 'utils'
|
|
436
|
-
Requires-Dist: natsort; extra == 'utils'
|
|
437
|
-
Requires-Dist: tqdm; extra == 'utils'
|
|
438
|
-
Requires-Dist: xarray; extra == 'utils'
|
|
439
|
-
Provides-Extra: web
|
|
440
|
-
Requires-Dist: aiohttp; extra == 'web'
|
|
441
|
-
Requires-Dist: anthropic; extra == 'web'
|
|
442
|
-
Requires-Dist: beautifulsoup4; extra == 'web'
|
|
443
|
-
Requires-Dist: google-genai; extra == 'web'
|
|
444
|
-
Requires-Dist: groq; extra == 'web'
|
|
445
|
-
Requires-Dist: joblib; extra == 'web'
|
|
446
|
-
Requires-Dist: markdown2; extra == 'web'
|
|
447
|
-
Requires-Dist: matplotlib; extra == 'web'
|
|
448
|
-
Requires-Dist: openai; extra == 'web'
|
|
449
|
-
Requires-Dist: pillow; extra == 'web'
|
|
450
|
-
Requires-Dist: pytest-asyncio; extra == 'web'
|
|
451
|
-
Requires-Dist: readability-lxml; extra == 'web'
|
|
452
|
-
Requires-Dist: requests; extra == 'web'
|
|
453
|
-
Requires-Dist: ruamel-yaml; extra == 'web'
|
|
454
|
-
Requires-Dist: scikit-learn; extra == 'web'
|
|
455
|
-
Requires-Dist: scipy; extra == 'web'
|
|
456
|
-
Requires-Dist: seaborn; extra == 'web'
|
|
457
|
-
Requires-Dist: tqdm; extra == 'web'
|
|
458
|
-
Requires-Dist: xarray; extra == 'web'
|
|
459
|
-
Provides-Extra: writer
|
|
460
|
-
Requires-Dist: csv2latex; extra == 'writer'
|
|
461
|
-
Requires-Dist: gitpython; extra == 'writer'
|
|
462
|
-
Requires-Dist: matplotlib; extra == 'writer'
|
|
463
|
-
Requires-Dist: pytest-asyncio; extra == 'writer'
|
|
464
|
-
Requires-Dist: xlsx2csv; extra == 'writer'
|
|
465
|
-
Requires-Dist: yq; extra == 'writer'
|
|
466
|
-
Description-Content-Type: text/markdown
|
|
467
|
-
|
|
468
|
-
<!-- ---
|
|
469
|
-
!-- Timestamp: 2026-01-09 13:47:53
|
|
470
|
-
!-- Author: ywatanabe
|
|
471
|
-
!-- File: /home/ywatanabe/proj/scitex-code/README.md
|
|
472
|
-
!-- --- -->
|
|
473
|
-
|
|
474
|
-
# SciTeX
|
|
475
|
-
|
|
476
|
-
A Python framework for scientific research that makes the entire research pipeline more standardized, structured, and reproducible by automating repetitive processes.
|
|
477
|
-
|
|
478
|
-
Part of the fully open-source SciTeX project: https://scitex.ai
|
|
479
|
-
|
|
480
|
-
## ๐ Status
|
|
481
|
-
|
|
482
|
-
<!-- badges -->
|
|
483
|
-
<div align="center">
|
|
484
|
-
<table>
|
|
485
|
-
<tr>
|
|
486
|
-
<td align="center"><strong>Package</strong></td>
|
|
487
|
-
<td>
|
|
488
|
-
<a href="https://badge.fury.io/py/scitex"><img src="https://badge.fury.io/py/scitex.svg" alt="PyPI version"></a>
|
|
489
|
-
<a href="https://pypi.org/project/scitex/"><img src="https://img.shields.io/pypi/pyversions/scitex.svg" alt="Python Versions"></a>
|
|
490
|
-
<a href="https://github.com/ywatanabe1989/SciTeX-Code/blob/main/LICENSE"><img src="https://img.shields.io/github/license/ywatanabe1989/SciTeX-Code" alt="License"></a>
|
|
491
|
-
</td>
|
|
492
|
-
</tr>
|
|
493
|
-
<tr>
|
|
494
|
-
<td align="center"><strong>Install</strong></td>
|
|
495
|
-
<td>
|
|
496
|
-
<img src="https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/core.json&label=core" alt="Core Install Time">
|
|
497
|
-
<img src="https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/all.json&label=all" alt="All Install Time">
|
|
498
|
-
<img src="https://img.shields.io/endpoint?url=https://ywatanabe1989.github.io/scitex-code/badges/heavy.json&label=heavy" alt="Heavy Install Time">
|
|
499
|
-
<img src="https://img.shields.io/badge/uv-recommended-blue" alt="uv recommended">
|
|
500
|
-
</td>
|
|
501
|
-
</tr>
|
|
502
|
-
</table>
|
|
503
|
-
</div>
|
|
504
|
-
|
|
505
|
-
<details>
|
|
506
|
-
<summary><strong>Module Status - Tests & Installation</strong></summary>
|
|
507
|
-
|
|
508
|
-
### Core Modules
|
|
509
|
-
|
|
510
|
-
| Module | Description | Install (Time) | Tests |
|
|
511
|
-
|--------|-------------|----------------|-------|
|
|
512
|
-
| [`io`](./src/scitex/io#readme) | Universal I/O (30+ formats) | `scitex[io]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-io.yml) |
|
|
513
|
-
| [`path`](./src/scitex/path#readme) | Path utilities | `scitex[path]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-path.yml) |
|
|
514
|
-
| [`str`](./src/scitex/str#readme) | String processing | `scitex[str]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-str.yml) |
|
|
515
|
-
| [`dict`](./src/scitex/dict#readme) | Dictionary utilities | core  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-dict.yml) |
|
|
516
|
-
| [`types`](./src/scitex/types#readme) | Type checking | core  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-types.yml) |
|
|
517
|
-
| [`config`](./src/scitex/config#readme) | Configuration management | `scitex[config]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-config.yml) |
|
|
518
|
-
| [`utils`](./src/scitex/utils#readme) | General utilities | `scitex[utils]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-utils.yml) |
|
|
519
|
-
| [`decorators`](./src/scitex/decorators#readme) | Function decorators | `scitex[decorators]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-decorators.yml) |
|
|
520
|
-
| [`logging`](./src/scitex/logging#readme) | Structured logging | `scitex[logging]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-logging.yml) |
|
|
521
|
-
| [`gen`](./src/scitex/gen#readme) | Project setup | `scitex[gen]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-gen.yml) |
|
|
522
|
-
|
|
523
|
-
### Data Science & Statistics
|
|
524
|
-
|
|
525
|
-
| Module | Description | Install (Time) | Tests |
|
|
526
|
-
|--------|-------------|----------------|-------|
|
|
527
|
-
| [`stats`](./src/scitex/stats#readme) | Statistical tests & analysis | `scitex[stats]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-stats.yml) |
|
|
528
|
-
| [`pd`](./src/scitex/pd#readme) | Pandas extensions | `scitex[pd]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-pd.yml) |
|
|
529
|
-
| [`linalg`](./src/scitex/linalg#readme) | Linear algebra | `scitex[linalg]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-linalg.yml) |
|
|
530
|
-
| [`plt`](./src/scitex/plt#readme) | Enhanced matplotlib | `scitex[plt]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-plt.yml) |
|
|
531
|
-
| [`dsp`](./src/scitex/dsp#readme) | Signal processing | `scitex[dsp]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-dsp.yml) |
|
|
532
|
-
|
|
533
|
-
### AI & Machine Learning
|
|
534
|
-
|
|
535
|
-
| Module | Description | Install (Time) | Tests |
|
|
536
|
-
|--------|-------------|----------------|-------|
|
|
537
|
-
| [`ai`](./src/scitex/ai#readme) | GenAI (7 providers) | `scitex[ai]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-ai.yml) |
|
|
538
|
-
| [`nn`](./src/scitex/nn#readme) | Neural network layers | `scitex[nn]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-nn.yml) |
|
|
539
|
-
| [`torch`](./src/scitex/torch#readme) | PyTorch utilities | `scitex[torch]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-torch.yml) |
|
|
540
|
-
|
|
541
|
-
### System & Tools
|
|
542
|
-
|
|
543
|
-
| Module | Description | Install (Time) | Tests |
|
|
544
|
-
|--------|-------------|----------------|-------|
|
|
545
|
-
| [`cli`](./src/scitex/cli#readme) | Command-line tools | `scitex[cli]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-cli.yml) |
|
|
546
|
-
| [`sh`](./src/scitex/sh#readme) | Shell utilities | `scitex[sh]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-sh.yml) |
|
|
547
|
-
| [`git`](./src/scitex/git#readme) | Git operations | `scitex[git]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-git.yml) |
|
|
548
|
-
| [`session`](./src/scitex/session#readme) | Session management | `scitex[session]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-session.yml) |
|
|
549
|
-
| [`resource`](./src/scitex/resource#readme) | System monitoring | `scitex[resource]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-resource.yml) |
|
|
550
|
-
| [`db`](./src/scitex/db#readme) | Database abstractions | `scitex[db]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-db.yml) |
|
|
551
|
-
|
|
552
|
-
### Research & Publishing
|
|
553
|
-
|
|
554
|
-
| Module | Description | Install (Time) | Tests |
|
|
555
|
-
|--------|-------------|----------------|-------|
|
|
556
|
-
| [`writer`](./src/scitex/writer#readme) | Document generation | `scitex[writer]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-writer.yml) |
|
|
557
|
-
| [`tex`](./src/scitex/tex#readme) | LaTeX processing | `scitex[tex]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-tex.yml) |
|
|
558
|
-
| [`msword`](./src/scitex/msword#readme) | MS Word conversion | `scitex[msword]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-msword.yml) |
|
|
559
|
-
| [`scholar`](./src/scitex/scholar#readme) | Literature management | `scitex[scholar]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-scholar.yml) |
|
|
560
|
-
| [`diagram`](./src/scitex/diagram#readme) | Diagram generation | `scitex[diagram]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-diagram.yml) |
|
|
561
|
-
|
|
562
|
-
### Web & Automation
|
|
563
|
-
|
|
564
|
-
| Module | Description | Install (Time) | Tests |
|
|
565
|
-
|--------|-------------|----------------|-------|
|
|
566
|
-
| [`web`](./src/scitex/web#readme) | Web scraping | `scitex[web]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-web.yml) |
|
|
567
|
-
| [`browser`](./src/scitex/browser#readme) | Browser automation | `scitex[browser]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-browser.yml) |
|
|
568
|
-
|
|
569
|
-
### Other Modules
|
|
570
|
-
|
|
571
|
-
| Module | Description | Install (Time) | Tests |
|
|
572
|
-
|--------|-------------|----------------|-------|
|
|
573
|
-
| [`audio`](./src/scitex/audio#readme) | Audio processing | `scitex[audio]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-audio.yml) |
|
|
574
|
-
| [`capture`](./src/scitex/capture#readme) | Screen capture | `scitex[capture]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-capture.yml) |
|
|
575
|
-
| [`repro`](./src/scitex/repro#readme) | Reproducibility | `scitex[repro]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-repro.yml) |
|
|
576
|
-
| [`benchmark`](./src/scitex/benchmark#readme) | Performance testing | `scitex[benchmark]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-benchmark.yml) |
|
|
577
|
-
| [`security`](./src/scitex/security#readme) | Security utilities | `scitex[security]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-security.yml) |
|
|
578
|
-
| [`dt`](./src/scitex/dt#readme) | Datetime utilities | `scitex[dt]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-dt.yml) |
|
|
579
|
-
| [`dev`](./src/scitex/dev#readme) | Development tools | `scitex[dev]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-dev.yml) |
|
|
580
|
-
| [`schema`](./src/scitex/schema#readme) | Data schemas | `scitex[schema]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-schema.yml) |
|
|
581
|
-
| [`bridge`](./src/scitex/bridge#readme) | Module integration | `scitex[bridge]`  | [](https://github.com/ywatanabe1989/scitex-code/actions/workflows/test-bridge.yml) |
|
|
582
|
-
|
|
583
|
-
</details>
|
|
584
|
-
|
|
585
|
-
## ๐ฆ Installation
|
|
586
|
-
|
|
587
|
-
``` bash
|
|
588
|
-
uv pip install scitex[all] # Recommended: Full installation with all modules
|
|
589
|
-
uv pip install scitex # Core only (numpy, pandas, PyYAML, tqdm)
|
|
590
|
-
uv pip install scitex[heavy] # Include heavy deps (torch, mne, optuna, etc.)
|
|
591
|
-
```
|
|
592
|
-
|
|
593
|
-
> **Note**: Heavy dependencies (torch, mne, optuna, catboost, jax, tensorflow, umap-learn)
|
|
594
|
-
> are optional and NOT included by default. Install with `scitex[heavy]` if needed.
|
|
595
|
-
> Modules gracefully handle missing dependencies with `*_AVAILABLE` flags.
|
|
596
|
-
|
|
597
|
-
<details>
|
|
598
|
-
<summary><strong>Arial Font Setup for Figures</strong></summary>
|
|
599
|
-
|
|
600
|
-
``` bash
|
|
601
|
-
# Ubuntu
|
|
602
|
-
sudo apt update
|
|
603
|
-
sudo apt-get install ttf-mscorefonts-installer
|
|
604
|
-
sudo DEBIAN_FRONTEND=noninteractive \
|
|
605
|
-
apt install -y ttf-mscorefonts-installer
|
|
606
|
-
sudo mkdir -p /usr/share/fonts/truetype/custom
|
|
607
|
-
sudo cp /mnt/c/Windows/Fonts/arial*.ttf /usr/share/fonts/truetype/custom/
|
|
608
|
-
sudo fc-cache -fv
|
|
609
|
-
rm ~/.cache/matplotlib -rf
|
|
610
|
-
|
|
611
|
-
# WSL
|
|
612
|
-
mkdir -p ~/.local/share/fonts/windows
|
|
613
|
-
cp /mnt/c/Windows/Fonts/arial*.ttf ~/.local/share/fonts/windows/
|
|
614
|
-
fc-cache -fv ~/.local/share/fonts/windows
|
|
615
|
-
rm ~/.cache/matplotlib -rf
|
|
616
|
-
```
|
|
617
|
-
|
|
618
|
-
``` python
|
|
619
|
-
# Check
|
|
620
|
-
import matplotlib
|
|
621
|
-
print(matplotlib.rcParams['font.family'])
|
|
622
|
-
|
|
623
|
-
import matplotlib.font_manager as fm
|
|
624
|
-
fonts = fm.findSystemFonts()
|
|
625
|
-
print("Arial found:", any("Arial" in f or "arial" in f for f in fonts))
|
|
626
|
-
[a for a in fonts if "Arial" in a or "arial" in a][:5]
|
|
627
|
-
|
|
628
|
-
import matplotlib as mpl
|
|
629
|
-
import matplotlib.pyplot as plt
|
|
630
|
-
|
|
631
|
-
mpl.rcParams["font.family"] = "Arial"
|
|
632
|
-
mpl.rcParams["font.sans-serif"] = ["Arial"] # ๅฟตใฎใใ
|
|
633
|
-
|
|
634
|
-
fig, ax = plt.subplots(figsize=(3, 2))
|
|
635
|
-
ax.text(0.5, 0.5, "Arial Test", fontsize=32, ha="center", va="center")
|
|
636
|
-
ax.set_axis_off()
|
|
637
|
-
|
|
638
|
-
fig.savefig("arial_test.png", dpi=300)
|
|
639
|
-
plt.close(fig)
|
|
640
|
-
```
|
|
641
|
-
|
|
642
|
-
</details>
|
|
643
|
-
|
|
644
|
-
## Why SciTeX?
|
|
645
|
-
|
|
646
|
-
SciTeX automates research analysis code.
|
|
647
|
-
|
|
648
|
-
<details>
|
|
649
|
-
<summary><strong><code>@scitex.session</code></strong> โ Reproducible Experiment Tracking + Auto-CLI</summary>
|
|
650
|
-
|
|
651
|
-
Standardized outputs with automatic logging. Scripts and outputs closely linked for full traceability.
|
|
652
|
-
|
|
653
|
-
**Auto-CLI Generation**: Function arguments automatically become argparse options:
|
|
654
|
-
|
|
655
|
-
```python
|
|
656
|
-
# /path/to/script.py
|
|
657
|
-
import scitex as stx
|
|
658
|
-
|
|
659
|
-
@stx.session
|
|
660
|
-
def main(
|
|
661
|
-
# arg1, # Required: -a ARG1, --arg1 ARG1
|
|
662
|
-
# kwarg1="value1", # Optional: -k KWARG1, --kwarg1 KWARG1 (default: value1)
|
|
663
|
-
CONFIG=stx.INJECTED, # Auto-injected from $(pwd)/config/*.yaml files
|
|
664
|
-
plt=stx.INJECTED, # Pre-configured matplotlib
|
|
665
|
-
COLORS=stx.INJECTED, # Color palette
|
|
666
|
-
rng=stx.INJECTED, # Seeded random generator
|
|
667
|
-
logger=stx.INJECTED, # Session logger
|
|
668
|
-
):
|
|
669
|
-
"""This docstring becomes --help description."""
|
|
670
|
-
|
|
671
|
-
stx.io.save(results, "results.csv", symlink_to="./data/")
|
|
672
|
-
# SUCC: Saved to: /path/to/script_out/tmp.txt (4.0 B)
|
|
673
|
-
# SUCC: Symlinked: /path/to/script_out/tmp.txt ->
|
|
674
|
-
# SUCC: ./data/tmp.txt
|
|
675
|
-
|
|
676
|
-
return 0
|
|
677
|
-
```
|
|
678
|
-
|
|
679
|
-
```bash
|
|
680
|
-
$ python script.py --help
|
|
681
|
-
usage: script.py [-a ARG1] [-k KWARG1]
|
|
682
|
-
-a ARG1, --arg1 ARG1 (required)
|
|
683
|
-
-k KWARG1, --kwarg1 KWARG1 (default: value1)
|
|
684
|
-
|
|
685
|
-
$ python script.py -a myvalue
|
|
686
|
-
# Runs with arg1="myvalue", kwarg1="value1"
|
|
687
|
-
```
|
|
688
|
-
|
|
689
|
-
**Output Structure**:
|
|
690
|
-
```bash
|
|
691
|
-
/path/to/script.py
|
|
692
|
-
/path/to/script_out/
|
|
693
|
-
โโโ FINISHED_SUCCESS/
|
|
694
|
-
โ โโโ 2025-01-08_12-30-00_AbC1/ # Session ID allocated
|
|
695
|
-
โ โโโ results.csv
|
|
696
|
-
โ โโโ CONFIGS/
|
|
697
|
-
โ โ โโโ CONFIG.pkl # Python object
|
|
698
|
-
โ โ โโโ CONFIG.yaml # Human-readable
|
|
699
|
-
โ โโโ logs/
|
|
700
|
-
โ โโโ stderr.log # Standard Errors
|
|
701
|
-
โ โโโ stdout.log # Standard Outputs
|
|
702
|
-
โโโ FINISHED_FAILED/
|
|
703
|
-
โ โโโ ...
|
|
704
|
-
โโโ RUNNING/
|
|
705
|
-
โโโ ...
|
|
706
|
-
```
|
|
707
|
-
|
|
708
|
-
</details>
|
|
709
|
-
|
|
710
|
-
<details>
|
|
711
|
-
<summary><strong><code>scitex.plt</code></strong> โ Auto-Export Figures with Data</summary>
|
|
712
|
-
|
|
713
|
-
Figures and data always together. CSV auto-exported from every plot.
|
|
714
|
-
|
|
715
|
-
```python
|
|
716
|
-
import scitex as stx
|
|
717
|
-
|
|
718
|
-
fig, ax = stx.plt.subplots()
|
|
719
|
-
ax.plot_line(x, y) # Data tracked automatically
|
|
720
|
-
stx.io.save(fig, "plot.png")
|
|
721
|
-
# Creates: plot.png + plot.csv
|
|
722
|
-
```
|
|
723
|
-
|
|
724
|
-
</details>
|
|
725
|
-
|
|
726
|
-
<details>
|
|
727
|
-
<summary><strong><code>scitex.io</code></strong> โ Universal File I/O (30+ formats)</summary>
|
|
728
|
-
|
|
729
|
-
One API for all formats: CSV, JSON, YAML, pickle, NumPy, HDF5, Zarr, PyTorch, images, PDFs, EEG formats.
|
|
730
|
-
|
|
731
|
-
```python
|
|
732
|
-
import scitex as stx
|
|
733
|
-
|
|
734
|
-
# Unified API Call for +30 formats
|
|
735
|
-
stx.io.save(df, "output.csv")
|
|
736
|
-
stx.io.save(arr, "output.npy")
|
|
737
|
-
stx.io.save(fig, "output.jpg")
|
|
738
|
-
|
|
739
|
-
# Round Trip Loading
|
|
740
|
-
df = stx.io.load("output.csv")
|
|
741
|
-
arr = stx.io.load("output.npy")
|
|
742
|
-
```
|
|
743
|
-
|
|
744
|
-
</details>
|
|
745
|
-
|
|
746
|
-
<details>
|
|
747
|
-
<summary><strong><code>scitex.stats</code></strong> โ Publication-Ready Statistics (23 tests)</summary>
|
|
748
|
-
|
|
749
|
-
Automatic assumption checking, effect sizes, multiple comparison corrections, 9 export formats.
|
|
750
|
-
|
|
751
|
-
```python
|
|
752
|
-
import scitex as stx
|
|
753
|
-
|
|
754
|
-
result = stx.stats.test_ttest_ind(
|
|
755
|
-
group1, group2,
|
|
756
|
-
return_as="dataframe" # or "latex", "markdown", "excel"
|
|
757
|
-
)
|
|
758
|
-
# Includes: p-value, effect size, CI, normality check, power analysis
|
|
759
|
-
```
|
|
760
|
-
|
|
761
|
-
</details>
|
|
762
|
-
|
|
763
|
-
<details>
|
|
764
|
-
<summary><strong><code>scitex.scholar</code></strong> โ Literature Management & BibTeX Enrichment</summary>
|
|
765
|
-
|
|
766
|
-
BibTeX enrichment with abstracts for LLM context, DOI resolution, PDF download, Impact Factor.
|
|
767
|
-
|
|
768
|
-
```bash
|
|
769
|
-
scitex scholar bibtex papers.bib --project myresearch --num-workers 8
|
|
770
|
-
```
|
|
771
|
-
|
|
772
|
-
```bibtex
|
|
773
|
-
# Before: Minimal BibTeX
|
|
774
|
-
@article{Smith2024,
|
|
775
|
-
title = {Neural Networks},
|
|
776
|
-
author = {Smith, John},
|
|
777
|
-
doi = {10.1038/s41586-024-00001-1}
|
|
778
|
-
}
|
|
779
|
-
|
|
780
|
-
# After: Enriched with abstract for LLM context
|
|
781
|
-
@article{Smith2024,
|
|
782
|
-
title = {Neural Networks for Brain Signal Analysis},
|
|
783
|
-
author = {Smith, John and Lee, Alice},
|
|
784
|
-
doi = {10.1038/s41586-024-00001-1},
|
|
785
|
-
journal = {Nature},
|
|
786
|
-
year = {2024},
|
|
787
|
-
abstract = {We present a novel deep learning approach...}, # Rich context for LLMs
|
|
788
|
-
impact_factor = {64.8}
|
|
789
|
-
}
|
|
790
|
-
```
|
|
791
|
-
|
|
792
|
-
</details>
|
|
793
|
-
|
|
794
|
-
<details>
|
|
795
|
-
<summary><strong><code>scitex.writer</code></strong> โ LaTeX Manuscript Management</summary>
|
|
796
|
-
|
|
797
|
-
Python interface for LaTeX manuscripts with git-based version control.
|
|
798
|
-
|
|
799
|
-
```python
|
|
800
|
-
from scitex.writer import Writer
|
|
801
|
-
|
|
802
|
-
writer = Writer("my_paper")
|
|
803
|
-
intro = writer.manuscript.contents.introduction
|
|
804
|
-
|
|
805
|
-
lines = intro.read()
|
|
806
|
-
intro.write(lines + ["New paragraph..."])
|
|
807
|
-
intro.commit("Update introduction")
|
|
808
|
-
|
|
809
|
-
result = writer.compile_manuscript()
|
|
810
|
-
```
|
|
811
|
-
|
|
812
|
-
</details>
|
|
813
|
-
|
|
814
|
-
<details>
|
|
815
|
-
<summary><strong><code>scitex.ai</code></strong> โ Unified AI/ML Interface (7 providers)</summary>
|
|
816
|
-
|
|
817
|
-
Single API for OpenAI, Anthropic, Google, Perplexity, DeepSeek, Groq, local models.
|
|
818
|
-
|
|
819
|
-
```python
|
|
820
|
-
from scitex.ai.genai import GenAI
|
|
821
|
-
|
|
822
|
-
ai = GenAI(provider="openai")
|
|
823
|
-
response = ai("Explain this data pattern")
|
|
824
|
-
|
|
825
|
-
# Switch providers instantly
|
|
826
|
-
ai = GenAI(provider="anthropic", model="claude-3-opus-20240229")
|
|
827
|
-
```
|
|
828
|
-
|
|
829
|
-
</details>
|
|
830
|
-
|
|
831
|
-
## ๐ฅ๏ธ CLI Commands
|
|
832
|
-
|
|
833
|
-
SciTeX provides a comprehensive command-line interface:
|
|
834
|
-
|
|
835
|
-
<details>
|
|
836
|
-
<summary><strong>CLI Commands</strong></summary>
|
|
837
|
-
|
|
838
|
-
```bash
|
|
839
|
-
# SciTeX Cloud (https://scitex.ai)
|
|
840
|
-
scitex cloud login # Login to SciTeX Cloud
|
|
841
|
-
scitex cloud clone user/project # Clone from cloud
|
|
842
|
-
scitex cloud create my-project # Create new repository
|
|
843
|
-
scitex cloud enrich -i refs.bib -o enriched.bib # BibTeX enrichment API
|
|
844
|
-
|
|
845
|
-
# Configuration
|
|
846
|
-
scitex config list # Show all configured paths
|
|
847
|
-
scitex config init # Initialize directories
|
|
848
|
-
|
|
849
|
-
# Research Tools
|
|
850
|
-
scitex scholar bibtex papers.bib # Process BibTeX, download PDFs
|
|
851
|
-
scitex scholar single --doi "10.1038/nature12373"
|
|
852
|
-
|
|
853
|
-
# TIP: Get BibTeX from Scholar QA (https://scholarqa.allen.ai/chat/)
|
|
854
|
-
# Ask questions โ Export All Citations โ Save as .bib file
|
|
855
|
-
scitex stats recommend --data data.csv
|
|
856
|
-
|
|
857
|
-
# Media
|
|
858
|
-
scitex audio speak "Hello world"
|
|
859
|
-
scitex capture snap --output screenshot.jpg
|
|
860
|
-
|
|
861
|
-
# Document Processing
|
|
862
|
-
scitex tex compile manuscript.tex
|
|
863
|
-
scitex writer compile my_paper
|
|
864
|
-
|
|
865
|
-
# Utilities
|
|
866
|
-
scitex resource usage # System resource monitoring
|
|
867
|
-
scitex security check --save # Security audit
|
|
868
|
-
scitex web get-urls https://example.com
|
|
869
|
-
scitex completion # Enable tab completion
|
|
870
|
-
```
|
|
871
|
-
|
|
872
|
-
</details>
|
|
873
|
-
|
|
874
|
-
## ๐ MCP Servers
|
|
875
|
-
|
|
876
|
-
<details>
|
|
877
|
-
<summary><strong>Model Context Protocol (MCP) servers for AI agent integration</strong></summary>
|
|
878
|
-
|
|
879
|
-
SciTeX provides Model Context Protocol (MCP) servers for AI agent integration:
|
|
880
|
-
|
|
881
|
-
| Server | Description |
|
|
882
|
-
|--------|-------------|
|
|
883
|
-
| `scitex-audio` | Text-to-speech for agent feedback |
|
|
884
|
-
| `scitex-capture` | Screen monitoring and capture |
|
|
885
|
-
| `scitex-plt` | Matplotlib figure creation |
|
|
886
|
-
| `scitex-stats` | Automated statistical testing |
|
|
887
|
-
| `scitex-scholar` | PDF download and metadata enrichment |
|
|
888
|
-
| `scitex-diagram` | Mermaid and flowchart creation |
|
|
889
|
-
| `scitex-template` | Project scaffolding |
|
|
890
|
-
| `scitex-canvas` | Scientific figure canvas |
|
|
891
|
-
|
|
892
|
-
### All-in-One Server (Recommended)
|
|
893
|
-
|
|
894
|
-
Use `scitex-mcp-server` to load all MCP modules with a single server:
|
|
895
|
-
|
|
896
|
-
**Claude Desktop Configuration** (`~/.config/claude/claude_desktop_config.json`):
|
|
897
|
-
|
|
898
|
-
```json
|
|
899
|
-
{
|
|
900
|
-
"mcpServers": {
|
|
901
|
-
"scitex": {
|
|
902
|
-
"command": "scitex-mcp-server"
|
|
903
|
-
}
|
|
904
|
-
}
|
|
905
|
-
}
|
|
906
|
-
```
|
|
907
|
-
|
|
908
|
-
Tools are prefixed by module (e.g., `audio_speak`, `capture_screenshot`, `scholar_enrich_bibtex`).
|
|
909
|
-
|
|
910
|
-
### Individual Servers
|
|
911
|
-
|
|
912
|
-
For selective module loading, configure servers individually:
|
|
913
|
-
|
|
914
|
-
```json
|
|
915
|
-
{
|
|
916
|
-
"mcpServers": {
|
|
917
|
-
"scitex-audio": {
|
|
918
|
-
"command": "scitex-audio"
|
|
919
|
-
},
|
|
920
|
-
"scitex-capture": {
|
|
921
|
-
"command": "scitex-capture"
|
|
922
|
-
},
|
|
923
|
-
"scitex-scholar": {
|
|
924
|
-
"command": "scitex-scholar"
|
|
925
|
-
}
|
|
926
|
-
}
|
|
927
|
-
}
|
|
928
|
-
```
|
|
929
|
-
|
|
930
|
-
</details>
|
|
931
|
-
|
|
932
|
-
## ๐ Quick Start
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
### Research Analysis with **70% Less Code**
|
|
936
|
-
|
|
937
|
-
Compare these two implementations that produce **identical research outputs**:
|
|
938
|
-
|
|
939
|
-
#### With SciTeX ([57 Lines of Code]((./examples/demo_session_plt_io.py)))
|
|
940
|
-
|
|
941
|
-
```python
|
|
942
|
-
#!/usr/bin/env python3
|
|
943
|
-
# -*- coding: utf-8 -*-
|
|
944
|
-
# Timestamp: "2025-11-18 09:34:36 (ywatanabe)"
|
|
945
|
-
# File: /home/ywatanabe/proj/scitex-code/examples/demo_session_plt_io.py
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
"""Minimal Demonstration for scitex.{session,io,plt}"""
|
|
949
|
-
|
|
950
|
-
import numpy as np
|
|
951
|
-
import scitex as stx
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
def demo(filename, verbose=False):
|
|
955
|
-
"""Show metadata without QR code (just embedded)."""
|
|
956
|
-
|
|
957
|
-
# matplotlib.pyplot wrapper.
|
|
958
|
-
fig, ax = stx.plt.subplots()
|
|
959
|
-
|
|
960
|
-
t = np.linspace(0, 2, 1000)
|
|
961
|
-
signal = np.sin(2 * np.pi * 5 * t) * np.exp(-t / 2)
|
|
962
|
-
|
|
963
|
-
ax.plot_line(t, signal) # Original plot for automatic CSV export
|
|
964
|
-
ax.set_xyt(
|
|
965
|
-
"Time (s)",
|
|
966
|
-
"Amplitude",
|
|
967
|
-
"Clean Figure (metadata embedded, no QR overlay)",
|
|
968
|
-
)
|
|
969
|
-
|
|
970
|
-
# Saving: stx.io.save(obj, rel_path, **kwargs)
|
|
971
|
-
stx.io.save(
|
|
972
|
-
fig,
|
|
973
|
-
filename,
|
|
974
|
-
metadata={"exp": "s01", "subj": "S001"}, # with meatadata embedding
|
|
975
|
-
symlink_to="./data", # Symlink for centralized outputs
|
|
976
|
-
verbose=verbose, # Automatic terminal logging (no manual print())
|
|
977
|
-
)
|
|
978
|
-
fig.close()
|
|
979
|
-
|
|
980
|
-
# Loading: stx.io.load(path)
|
|
981
|
-
ldir = __file__.replace(".py", "_out")
|
|
982
|
-
img, meta = stx.io.load(
|
|
983
|
-
f"{ldir}/{filename}",
|
|
984
|
-
verbose=verbose,
|
|
985
|
-
)
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
@stx.session
|
|
989
|
-
def main(filename="demo.jpg", verbose=True):
|
|
990
|
-
"""Run demo for scitex.{session,plt,io}."""
|
|
991
|
-
|
|
992
|
-
demo(filename, verbose=verbose)
|
|
993
|
-
|
|
994
|
-
return 0
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
if __name__ == "__main__":
|
|
998
|
-
main()
|
|
999
|
-
```
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
<details>
|
|
1003
|
-
<summary><strong>Equivalent Script without SciTeX ([188 Lines of Code](./examples/demo_session_plt_io_pure_python.py)), requiring 3.3ร more code</strong></summary>
|
|
1004
|
-
|
|
1005
|
-
```python
|
|
1006
|
-
#!/usr/bin/env python3
|
|
1007
|
-
# -*- coding: utf-8 -*-
|
|
1008
|
-
# Timestamp: "2025-11-18 09:34:51 (ywatanabe)"
|
|
1009
|
-
# File: /home/ywatanabe/proj/scitex-code/examples/demo_session_plt_io_pure_python.py
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
"""Minimal Demonstration - Pure Python Version"""
|
|
1013
|
-
|
|
1014
|
-
import argparse
|
|
1015
|
-
import json
|
|
1016
|
-
import logging
|
|
1017
|
-
import os
|
|
1018
|
-
import shutil
|
|
1019
|
-
import sys
|
|
1020
|
-
from datetime import datetime
|
|
1021
|
-
from pathlib import Path
|
|
1022
|
-
import random
|
|
1023
|
-
import string
|
|
1024
|
-
|
|
1025
|
-
import matplotlib.pyplot as plt
|
|
1026
|
-
import numpy as np
|
|
1027
|
-
from PIL import Image
|
|
1028
|
-
from PIL.PngImagePlugin import PngInfo
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
def generate_session_id():
|
|
1032
|
-
"""Generate unique session ID."""
|
|
1033
|
-
timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
|
|
1034
|
-
random_suffix = ''.join(random.choices(string.ascii_uppercase + string.digits, k=4))
|
|
1035
|
-
return f"{timestamp}_{random_suffix}"
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
def setup_logging(log_dir):
|
|
1039
|
-
"""Set up logging infrastructure."""
|
|
1040
|
-
log_dir.mkdir(parents=True, exist_ok=True)
|
|
1041
|
-
logger = logging.getLogger(__name__)
|
|
1042
|
-
logger.setLevel(logging.INFO)
|
|
1043
|
-
|
|
1044
|
-
stdout_handler = logging.FileHandler(log_dir / "stdout.log")
|
|
1045
|
-
stderr_handler = logging.FileHandler(log_dir / "stderr.log")
|
|
1046
|
-
console_handler = logging.StreamHandler(sys.stdout)
|
|
1047
|
-
|
|
1048
|
-
formatter = logging.Formatter('%(levelname)s: %(message)s')
|
|
1049
|
-
stdout_handler.setFormatter(formatter)
|
|
1050
|
-
stderr_handler.setFormatter(formatter)
|
|
1051
|
-
console_handler.setFormatter(formatter)
|
|
1052
|
-
|
|
1053
|
-
logger.addHandler(stdout_handler)
|
|
1054
|
-
logger.addHandler(stderr_handler)
|
|
1055
|
-
logger.addHandler(console_handler)
|
|
1056
|
-
|
|
1057
|
-
return logger
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
def save_plot_data_to_csv(fig, output_path):
|
|
1061
|
-
"""Extract and save plot data."""
|
|
1062
|
-
csv_path = output_path.with_suffix('.csv')
|
|
1063
|
-
data_lines = ["ax_00_plot_line_0_line_x,ax_00_plot_line_0_line_y"]
|
|
1064
|
-
|
|
1065
|
-
for ax in fig.get_axes():
|
|
1066
|
-
for line in ax.get_lines():
|
|
1067
|
-
x_data = line.get_xdata()
|
|
1068
|
-
y_data = line.get_ydata()
|
|
1069
|
-
for x, y in zip(x_data, y_data):
|
|
1070
|
-
data_lines.append(f"{x},{y}")
|
|
1071
|
-
|
|
1072
|
-
csv_path.write_text('\n'.join(data_lines))
|
|
1073
|
-
return csv_path, csv_path.stat().st_size / 1024
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
def embed_metadata_in_image(image_path, metadata):
|
|
1077
|
-
"""Embed metadata into image file."""
|
|
1078
|
-
img = Image.open(image_path)
|
|
1079
|
-
|
|
1080
|
-
if image_path.suffix.lower() in ['.png']:
|
|
1081
|
-
pnginfo = PngInfo()
|
|
1082
|
-
for key, value in metadata.items():
|
|
1083
|
-
pnginfo.add_text(key, str(value))
|
|
1084
|
-
img.save(image_path, pnginfo=pnginfo)
|
|
1085
|
-
elif image_path.suffix.lower() in ['.jpg', '.jpeg']:
|
|
1086
|
-
json_path = image_path.with_suffix(image_path.suffix + '.meta.json')
|
|
1087
|
-
json_path.write_text(json.dumps(metadata, indent=2))
|
|
1088
|
-
img.save(image_path, quality=95)
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
def save_figure(fig, output_path, metadata=None, symlink_to=None, logger=None):
|
|
1092
|
-
"""Save figure with metadata and symlink."""
|
|
1093
|
-
output_path = Path(output_path)
|
|
1094
|
-
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
1095
|
-
|
|
1096
|
-
if metadata is None:
|
|
1097
|
-
metadata = {}
|
|
1098
|
-
metadata['url'] = 'https://scitex.ai'
|
|
1099
|
-
|
|
1100
|
-
if logger:
|
|
1101
|
-
logger.info(f"๐ Saving figure with metadata to: {output_path}")
|
|
1102
|
-
logger.info(f" โข Embedded metadata: {metadata}")
|
|
1103
|
-
|
|
1104
|
-
csv_path, csv_size = save_plot_data_to_csv(fig, output_path)
|
|
1105
|
-
if logger:
|
|
1106
|
-
logger.info(f"โ
Saved to: {csv_path} ({csv_size:.1f} KiB)")
|
|
1107
|
-
|
|
1108
|
-
fig.savefig(output_path, dpi=150, bbox_inches='tight')
|
|
1109
|
-
embed_metadata_in_image(output_path, metadata)
|
|
1110
|
-
|
|
1111
|
-
if symlink_to:
|
|
1112
|
-
symlink_dir = Path(symlink_to)
|
|
1113
|
-
symlink_dir.mkdir(parents=True, exist_ok=True)
|
|
1114
|
-
symlink_path = symlink_dir / output_path.name
|
|
1115
|
-
if symlink_path.exists() or symlink_path.is_symlink():
|
|
1116
|
-
symlink_path.unlink()
|
|
1117
|
-
symlink_path.symlink_to(output_path.resolve())
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
def demo(output_dir, filename, verbose=False, logger=None):
|
|
1121
|
-
"""Generate, plot, and save signal."""
|
|
1122
|
-
fig, ax = plt.subplots(figsize=(8, 6))
|
|
1123
|
-
|
|
1124
|
-
t = np.linspace(0, 2, 1000)
|
|
1125
|
-
signal = np.sin(2 * np.pi * 5 * t) * np.exp(-t / 2)
|
|
1126
|
-
|
|
1127
|
-
ax.plot(t, signal)
|
|
1128
|
-
ax.set_xlabel("Time (s)")
|
|
1129
|
-
ax.set_ylabel("Amplitude")
|
|
1130
|
-
ax.set_title("Damped Oscillation")
|
|
1131
|
-
ax.grid(True, alpha=0.3)
|
|
1132
|
-
|
|
1133
|
-
output_path = output_dir / filename
|
|
1134
|
-
save_figure(fig, output_path, metadata={"exp": "s01", "subj": "S001"},
|
|
1135
|
-
symlink_to=output_dir.parent / "data", logger=logger)
|
|
1136
|
-
plt.close(fig)
|
|
1137
|
-
|
|
1138
|
-
return 0
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
def main():
|
|
1142
|
-
"""Run demo - Pure Python Version."""
|
|
1143
|
-
parser = argparse.ArgumentParser(description="Run demo - Pure Python Version")
|
|
1144
|
-
parser.add_argument('-f', '--filename', default='demo.jpg')
|
|
1145
|
-
parser.add_argument('-v', '--verbose', type=bool, default=True)
|
|
1146
|
-
args = parser.parse_args()
|
|
1147
|
-
|
|
1148
|
-
session_id = generate_session_id()
|
|
1149
|
-
script_path = Path(__file__).resolve()
|
|
1150
|
-
output_base = script_path.parent / (script_path.stem + "_out")
|
|
1151
|
-
running_dir = output_base / "RUNNING" / session_id
|
|
1152
|
-
logs_dir = running_dir / "logs"
|
|
1153
|
-
config_dir = running_dir / "CONFIGS"
|
|
1154
|
-
|
|
1155
|
-
logger = setup_logging(logs_dir)
|
|
1156
|
-
|
|
1157
|
-
print("=" * 40)
|
|
1158
|
-
print(f"Pure Python Demo")
|
|
1159
|
-
print(f"{session_id} (PID: {os.getpid()})")
|
|
1160
|
-
print(f"\n{script_path}")
|
|
1161
|
-
print(f"\nArguments:")
|
|
1162
|
-
print(f" filename: {args.filename}")
|
|
1163
|
-
print(f" verbose: {args.verbose}")
|
|
1164
|
-
print("=" * 40)
|
|
1165
|
-
|
|
1166
|
-
config_dir.mkdir(parents=True, exist_ok=True)
|
|
1167
|
-
config_data = {
|
|
1168
|
-
'ID': session_id,
|
|
1169
|
-
'FILE': str(script_path),
|
|
1170
|
-
'SDIR_OUT': str(output_base),
|
|
1171
|
-
'SDIR_RUN': str(running_dir),
|
|
1172
|
-
'PID': os.getpid(),
|
|
1173
|
-
'ARGS': vars(args)
|
|
1174
|
-
}
|
|
1175
|
-
(config_dir / "CONFIG.json").write_text(json.dumps(config_data, indent=2))
|
|
1176
|
-
|
|
1177
|
-
try:
|
|
1178
|
-
result = demo(output_base, args.filename, args.verbose, logger)
|
|
1179
|
-
success_dir = output_base / "FINISHED_SUCCESS" / session_id
|
|
1180
|
-
success_dir.parent.mkdir(parents=True, exist_ok=True)
|
|
1181
|
-
shutil.move(str(running_dir), str(success_dir))
|
|
1182
|
-
logger.info(f"\nโ
Script completed: {success_dir}")
|
|
1183
|
-
return result
|
|
1184
|
-
except Exception as e:
|
|
1185
|
-
error_dir = output_base / "FINISHED_ERROR" / session_id
|
|
1186
|
-
error_dir.parent.mkdir(parents=True, exist_ok=True)
|
|
1187
|
-
shutil.move(str(running_dir), str(error_dir))
|
|
1188
|
-
logger.error(f"\nโ Error: {e}", exc_info=True)
|
|
1189
|
-
raise
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
if __name__ == "__main__":
|
|
1193
|
-
sys.exit(main())
|
|
1194
|
-
```
|
|
1195
|
-
|
|
1196
|
-
</details>
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
## ๐ Documentation
|
|
1200
|
-
|
|
1201
|
-
<details>
|
|
1202
|
-
<summary><strong>Resources</strong></summary>
|
|
1203
|
-
|
|
1204
|
-
### Online Documentation
|
|
1205
|
-
- **[Read the Docs](https://scitex.readthedocs.io/)**: Complete API reference and guides
|
|
1206
|
-
- **[Interactive Examples](https://scitex.readthedocs.io/en/latest/examples/index.html)**: Browse all tutorial notebooks
|
|
1207
|
-
- **[Quick Start Guide](https://scitex.readthedocs.io/en/latest/getting_started.html)**: Get up and running quickly
|
|
1208
|
-
|
|
1209
|
-
### Local Resources
|
|
1210
|
-
- **[Master Tutorial Index](./examples/00_SCITEX_MASTER_INDEX.ipynb)**: Comprehensive guide to all features
|
|
1211
|
-
- **[Examples Directory](./examples/)**: 25+ Jupyter notebooks covering all modules
|
|
1212
|
-
- **[Module List](./docs/scitex_modules.csv)**: Complete list of all functions
|
|
1213
|
-
- **(Experimental) [MCP Servers Documentation](./mcp_servers/README.md)**
|
|
1214
|
-
|
|
1215
|
-
### Key Tutorials
|
|
1216
|
-
1. **[I/O Operations](./examples/01_scitex_io.ipynb)**: Essential file handling (start here!)
|
|
1217
|
-
2. **[Plotting](./examples/14_scitex_plt.ipynb)**: Publication-ready visualizations
|
|
1218
|
-
3. **[Statistics](./examples/11_scitex_stats.ipynb)**: Research-grade statistical analysis
|
|
1219
|
-
4. **[Scholar](./examples/16_scitex_scholar.ipynb)**: Literature management with impact factors
|
|
1220
|
-
5. **[AI/ML](./examples/16_scitex_ai.ipynb)**: Complete machine learning toolkit
|
|
1221
|
-
|
|
1222
|
-
</details>
|
|
1223
|
-
|
|
1224
|
-
## ๐ค Contributing
|
|
1225
|
-
|
|
1226
|
-
We welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details.
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
---
|
|
1231
|
-
|
|
1232
|
-
<p align="center">
|
|
1233
|
-
<a href="https://scitex.ai" target="_blank"><img src="docs/scitex-icon-navy-inverted.png" alt="SciTeX" width="40"/></a>
|
|
1234
|
-
<br>
|
|
1235
|
-
AGPL-3.0 ยท ywatanabe@scitex.ai
|
|
1236
|
-
</p>
|
|
1237
|
-
|
|
1238
|
-
<!-- EOF -->
|