scitex 2.0.0__py2.py3-none-any.whl → 2.1.0__py2.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 +53 -15
- scitex/__main__.py +72 -26
- scitex/__version__.py +1 -1
- scitex/_sh.py +145 -23
- scitex/ai/__init__.py +30 -16
- scitex/ai/_gen_ai/_Anthropic.py +5 -7
- scitex/ai/_gen_ai/_BaseGenAI.py +2 -2
- scitex/ai/_gen_ai/_DeepSeek.py +10 -2
- scitex/ai/_gen_ai/_Google.py +2 -2
- scitex/ai/_gen_ai/_Llama.py +2 -2
- scitex/ai/_gen_ai/_OpenAI.py +2 -2
- scitex/ai/_gen_ai/_PARAMS.py +51 -65
- scitex/ai/_gen_ai/_Perplexity.py +2 -2
- scitex/ai/_gen_ai/__init__.py +25 -14
- scitex/ai/_gen_ai/_format_output_func.py +4 -4
- scitex/ai/classification/{classifier_server.py → Classifier.py} +5 -5
- scitex/ai/classification/CrossValidationExperiment.py +374 -0
- scitex/ai/classification/__init__.py +43 -4
- scitex/ai/classification/reporters/_BaseClassificationReporter.py +281 -0
- scitex/ai/classification/reporters/_ClassificationReporter.py +773 -0
- scitex/ai/classification/reporters/_MultiClassificationReporter.py +406 -0
- scitex/ai/classification/reporters/_SingleClassificationReporter.py +1834 -0
- scitex/ai/classification/reporters/__init__.py +11 -0
- scitex/ai/classification/reporters/reporter_utils/_Plotter.py +1028 -0
- scitex/ai/classification/reporters/reporter_utils/__init__.py +80 -0
- scitex/ai/classification/reporters/reporter_utils/aggregation.py +457 -0
- scitex/ai/classification/reporters/reporter_utils/data_models.py +313 -0
- scitex/ai/classification/reporters/reporter_utils/reporting.py +1056 -0
- scitex/ai/classification/reporters/reporter_utils/storage.py +221 -0
- scitex/ai/classification/reporters/reporter_utils/validation.py +395 -0
- scitex/ai/classification/timeseries/_TimeSeriesBlockingSplit.py +568 -0
- scitex/ai/classification/timeseries/_TimeSeriesCalendarSplit.py +688 -0
- scitex/ai/classification/timeseries/_TimeSeriesMetadata.py +139 -0
- scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +1716 -0
- scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit_v01-not-using-n_splits.py +1685 -0
- scitex/ai/classification/timeseries/_TimeSeriesStrategy.py +84 -0
- scitex/ai/classification/timeseries/_TimeSeriesStratifiedSplit.py +610 -0
- scitex/ai/classification/timeseries/__init__.py +39 -0
- scitex/ai/classification/timeseries/_normalize_timestamp.py +436 -0
- scitex/ai/clustering/_umap.py +2 -2
- scitex/ai/feature_extraction/vit.py +1 -0
- scitex/ai/feature_selection/__init__.py +30 -0
- scitex/ai/feature_selection/feature_selection.py +364 -0
- scitex/ai/loss/multi_task_loss.py +1 -1
- scitex/ai/metrics/__init__.py +51 -4
- scitex/ai/metrics/_calc_bacc.py +61 -0
- scitex/ai/metrics/_calc_bacc_from_conf_mat.py +38 -0
- scitex/ai/metrics/_calc_clf_report.py +78 -0
- scitex/ai/metrics/_calc_conf_mat.py +93 -0
- scitex/ai/metrics/_calc_feature_importance.py +183 -0
- scitex/ai/metrics/_calc_mcc.py +61 -0
- scitex/ai/metrics/_calc_pre_rec_auc.py +116 -0
- scitex/ai/metrics/_calc_roc_auc.py +110 -0
- scitex/ai/metrics/_calc_seizure_prediction_metrics.py +490 -0
- scitex/ai/metrics/{silhoute_score_block.py → _calc_silhouette_score.py} +15 -8
- scitex/ai/metrics/_normalize_labels.py +83 -0
- scitex/ai/plt/__init__.py +47 -8
- scitex/ai/plt/{_conf_mat.py → _plot_conf_mat.py} +158 -87
- scitex/ai/plt/_plot_feature_importance.py +323 -0
- scitex/ai/plt/_plot_learning_curve.py +345 -0
- scitex/ai/plt/_plot_optuna_study.py +225 -0
- scitex/ai/plt/_plot_pre_rec_curve.py +290 -0
- scitex/ai/plt/_plot_roc_curve.py +255 -0
- scitex/ai/training/{learning_curve_logger.py → _LearningCurveLogger.py} +197 -213
- scitex/ai/training/__init__.py +2 -2
- scitex/ai/utils/grid_search.py +3 -3
- scitex/benchmark/__init__.py +52 -0
- scitex/benchmark/benchmark.py +400 -0
- scitex/benchmark/monitor.py +370 -0
- scitex/benchmark/profiler.py +297 -0
- scitex/browser/__init__.py +48 -0
- scitex/browser/automation/CookieHandler.py +216 -0
- scitex/browser/automation/__init__.py +7 -0
- scitex/browser/collaboration/__init__.py +55 -0
- scitex/browser/collaboration/auth_helpers.py +94 -0
- scitex/browser/collaboration/collaborative_agent.py +136 -0
- scitex/browser/collaboration/credential_manager.py +188 -0
- scitex/browser/collaboration/interactive_panel.py +400 -0
- scitex/browser/collaboration/persistent_browser.py +170 -0
- scitex/browser/collaboration/shared_session.py +383 -0
- scitex/browser/collaboration/standard_interactions.py +246 -0
- scitex/browser/collaboration/visual_feedback.py +181 -0
- scitex/browser/core/BrowserMixin.py +326 -0
- scitex/browser/core/ChromeProfileManager.py +446 -0
- scitex/browser/core/__init__.py +9 -0
- scitex/browser/debugging/__init__.py +18 -0
- scitex/browser/debugging/_browser_logger.py +657 -0
- scitex/browser/debugging/_highlight_element.py +143 -0
- scitex/browser/debugging/_show_grid.py +154 -0
- scitex/browser/interaction/__init__.py +24 -0
- scitex/browser/interaction/click_center.py +149 -0
- scitex/browser/interaction/click_with_fallbacks.py +206 -0
- scitex/browser/interaction/close_popups.py +498 -0
- scitex/browser/interaction/fill_with_fallbacks.py +209 -0
- scitex/browser/pdf/__init__.py +14 -0
- scitex/browser/pdf/click_download_for_chrome_pdf_viewer.py +200 -0
- scitex/browser/pdf/detect_chrome_pdf_viewer.py +198 -0
- scitex/browser/remote/CaptchaHandler.py +434 -0
- scitex/browser/remote/ZenRowsAPIClient.py +347 -0
- scitex/browser/remote/ZenRowsBrowserManager.py +570 -0
- scitex/browser/remote/__init__.py +11 -0
- scitex/browser/stealth/HumanBehavior.py +344 -0
- scitex/browser/stealth/StealthManager.py +1008 -0
- scitex/browser/stealth/__init__.py +9 -0
- scitex/browser/template.py +122 -0
- scitex/capture/__init__.py +110 -0
- scitex/capture/__main__.py +25 -0
- scitex/capture/capture.py +848 -0
- scitex/capture/cli.py +233 -0
- scitex/capture/gif.py +344 -0
- scitex/capture/mcp_server.py +961 -0
- scitex/capture/session.py +70 -0
- scitex/capture/utils.py +705 -0
- scitex/cli/__init__.py +17 -0
- scitex/cli/cloud.py +447 -0
- scitex/cli/main.py +42 -0
- scitex/cli/scholar.py +280 -0
- scitex/context/_suppress_output.py +5 -3
- scitex/db/__init__.py +30 -3
- scitex/db/__main__.py +75 -0
- scitex/db/_check_health.py +381 -0
- scitex/db/_delete_duplicates.py +25 -386
- scitex/db/_inspect.py +335 -114
- scitex/db/_inspect_optimized.py +301 -0
- scitex/db/{_PostgreSQL.py → _postgresql/_PostgreSQL.py} +3 -3
- scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_BackupMixin.py +1 -1
- scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_BatchMixin.py +1 -1
- scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_BlobMixin.py +1 -1
- scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_ConnectionMixin.py +1 -1
- scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_MaintenanceMixin.py +1 -1
- scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_QueryMixin.py +1 -1
- scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_SchemaMixin.py +1 -1
- scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_TransactionMixin.py +1 -1
- scitex/db/_postgresql/__init__.py +6 -0
- scitex/db/_sqlite3/_SQLite3.py +210 -0
- scitex/db/_sqlite3/_SQLite3Mixins/_ArrayMixin.py +581 -0
- scitex/db/_sqlite3/_SQLite3Mixins/_ArrayMixin_v01-need-_hash-col.py +517 -0
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_BatchMixin.py +1 -1
- scitex/db/_sqlite3/_SQLite3Mixins/_BlobMixin.py +281 -0
- scitex/db/_sqlite3/_SQLite3Mixins/_ColumnMixin.py +548 -0
- scitex/db/_sqlite3/_SQLite3Mixins/_ColumnMixin_v01-indentation-issues.py +583 -0
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_ConnectionMixin.py +29 -13
- scitex/db/_sqlite3/_SQLite3Mixins/_GitMixin.py +583 -0
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_ImportExportMixin.py +1 -1
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_IndexMixin.py +1 -1
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_MaintenanceMixin.py +2 -1
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_QueryMixin.py +37 -10
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_RowMixin.py +46 -6
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_TableMixin.py +56 -10
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_TransactionMixin.py +1 -1
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/__init__.py +14 -2
- scitex/db/_sqlite3/__init__.py +7 -0
- scitex/db/_sqlite3/_delete_duplicates.py +274 -0
- scitex/decorators/__init__.py +2 -0
- scitex/decorators/_cache_disk.py +13 -5
- scitex/decorators/_cache_disk_async.py +49 -0
- scitex/decorators/_deprecated.py +175 -10
- scitex/decorators/_timeout.py +1 -1
- scitex/dev/_analyze_code_flow.py +2 -2
- scitex/dict/_DotDict.py +73 -15
- scitex/dict/_DotDict_v01-not-handling-recursive-instantiations.py +442 -0
- scitex/dict/_DotDict_v02-not-serializing-Path-object.py +446 -0
- scitex/dict/__init__.py +2 -0
- scitex/dict/_flatten.py +27 -0
- scitex/dsp/_crop.py +2 -2
- scitex/dsp/_demo_sig.py +2 -2
- scitex/dsp/_detect_ripples.py +2 -2
- scitex/dsp/_hilbert.py +2 -2
- scitex/dsp/_listen.py +6 -6
- scitex/dsp/_modulation_index.py +2 -2
- scitex/dsp/_pac.py +1 -1
- scitex/dsp/_psd.py +2 -2
- scitex/dsp/_resample.py +2 -1
- scitex/dsp/_time.py +3 -2
- scitex/dsp/_wavelet.py +3 -2
- scitex/dsp/add_noise.py +2 -2
- scitex/dsp/example.py +1 -0
- scitex/dsp/filt.py +10 -9
- scitex/dsp/template.py +3 -2
- scitex/dsp/utils/_differential_bandpass_filters.py +1 -1
- scitex/dsp/utils/pac.py +2 -2
- scitex/dt/_normalize_timestamp.py +432 -0
- scitex/errors.py +572 -0
- scitex/gen/_DimHandler.py +2 -2
- scitex/gen/__init__.py +37 -7
- scitex/gen/_deprecated_close.py +80 -0
- scitex/gen/_deprecated_start.py +26 -0
- scitex/gen/_detect_environment.py +152 -0
- scitex/gen/_detect_notebook_path.py +169 -0
- scitex/gen/_embed.py +6 -2
- scitex/gen/_get_notebook_path.py +257 -0
- scitex/gen/_less.py +1 -1
- scitex/gen/_list_packages.py +2 -2
- scitex/gen/_norm.py +44 -9
- scitex/gen/_norm_cache.py +269 -0
- scitex/gen/_src.py +3 -5
- scitex/gen/_title_case.py +3 -3
- scitex/io/__init__.py +28 -6
- scitex/io/_glob.py +13 -7
- scitex/io/_load.py +108 -21
- scitex/io/_load_cache.py +303 -0
- scitex/io/_load_configs.py +40 -15
- scitex/io/{_H5Explorer.py → _load_modules/_H5Explorer.py} +80 -17
- scitex/io/_load_modules/_ZarrExplorer.py +114 -0
- scitex/io/_load_modules/_bibtex.py +207 -0
- scitex/io/_load_modules/_hdf5.py +53 -178
- scitex/io/_load_modules/_json.py +5 -3
- scitex/io/_load_modules/_pdf.py +871 -16
- scitex/io/_load_modules/_sqlite3.py +15 -0
- scitex/io/_load_modules/_txt.py +41 -12
- scitex/io/_load_modules/_yaml.py +4 -3
- scitex/io/_load_modules/_zarr.py +126 -0
- scitex/io/_save.py +429 -171
- scitex/io/_save_modules/__init__.py +6 -0
- scitex/io/_save_modules/_bibtex.py +194 -0
- scitex/io/_save_modules/_csv.py +8 -4
- scitex/io/_save_modules/_excel.py +174 -15
- scitex/io/_save_modules/_hdf5.py +251 -226
- scitex/io/_save_modules/_image.py +1 -3
- scitex/io/_save_modules/_json.py +49 -4
- scitex/io/_save_modules/_listed_dfs_as_csv.py +1 -3
- scitex/io/_save_modules/_listed_scalars_as_csv.py +1 -3
- scitex/io/_save_modules/_tex.py +277 -0
- scitex/io/_save_modules/_yaml.py +42 -3
- scitex/io/_save_modules/_zarr.py +160 -0
- scitex/io/utils/__init__.py +20 -0
- scitex/io/utils/h5_to_zarr.py +616 -0
- scitex/linalg/_geometric_median.py +6 -2
- scitex/{gen/_tee.py → logging/_Tee.py} +43 -84
- scitex/logging/__init__.py +122 -0
- scitex/logging/_config.py +158 -0
- scitex/logging/_context.py +103 -0
- scitex/logging/_formatters.py +128 -0
- scitex/logging/_handlers.py +64 -0
- scitex/logging/_levels.py +35 -0
- scitex/logging/_logger.py +163 -0
- scitex/logging/_print_capture.py +95 -0
- scitex/ml/__init__.py +69 -0
- scitex/{ai/genai/anthropic.py → ml/_gen_ai/_Anthropic.py} +13 -19
- scitex/{ai/genai/base_genai.py → ml/_gen_ai/_BaseGenAI.py} +5 -5
- scitex/{ai/genai/deepseek.py → ml/_gen_ai/_DeepSeek.py} +11 -16
- scitex/{ai/genai/google.py → ml/_gen_ai/_Google.py} +7 -15
- scitex/{ai/genai/groq.py → ml/_gen_ai/_Groq.py} +1 -8
- scitex/{ai/genai/llama.py → ml/_gen_ai/_Llama.py} +3 -16
- scitex/{ai/genai/openai.py → ml/_gen_ai/_OpenAI.py} +3 -3
- scitex/{ai/genai/params.py → ml/_gen_ai/_PARAMS.py} +51 -65
- scitex/{ai/genai/perplexity.py → ml/_gen_ai/_Perplexity.py} +3 -14
- scitex/ml/_gen_ai/__init__.py +43 -0
- scitex/{ai/genai/calc_cost.py → ml/_gen_ai/_calc_cost.py} +1 -1
- scitex/{ai/genai/format_output_func.py → ml/_gen_ai/_format_output_func.py} +4 -4
- scitex/{ai/genai/genai_factory.py → ml/_gen_ai/_genai_factory.py} +8 -8
- scitex/ml/activation/__init__.py +8 -0
- scitex/ml/activation/_define.py +11 -0
- scitex/{ai/classifier_server.py → ml/classification/Classifier.py} +5 -5
- scitex/ml/classification/CrossValidationExperiment.py +374 -0
- scitex/ml/classification/__init__.py +46 -0
- scitex/ml/classification/reporters/_BaseClassificationReporter.py +281 -0
- scitex/ml/classification/reporters/_ClassificationReporter.py +773 -0
- scitex/ml/classification/reporters/_MultiClassificationReporter.py +406 -0
- scitex/ml/classification/reporters/_SingleClassificationReporter.py +1834 -0
- scitex/ml/classification/reporters/__init__.py +11 -0
- scitex/ml/classification/reporters/reporter_utils/_Plotter.py +1028 -0
- scitex/ml/classification/reporters/reporter_utils/__init__.py +80 -0
- scitex/ml/classification/reporters/reporter_utils/aggregation.py +457 -0
- scitex/ml/classification/reporters/reporter_utils/data_models.py +313 -0
- scitex/ml/classification/reporters/reporter_utils/reporting.py +1056 -0
- scitex/ml/classification/reporters/reporter_utils/storage.py +221 -0
- scitex/ml/classification/reporters/reporter_utils/validation.py +395 -0
- scitex/ml/classification/timeseries/_TimeSeriesBlockingSplit.py +568 -0
- scitex/ml/classification/timeseries/_TimeSeriesCalendarSplit.py +688 -0
- scitex/ml/classification/timeseries/_TimeSeriesMetadata.py +139 -0
- scitex/ml/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +1716 -0
- scitex/ml/classification/timeseries/_TimeSeriesSlidingWindowSplit_v01-not-using-n_splits.py +1685 -0
- scitex/ml/classification/timeseries/_TimeSeriesStrategy.py +84 -0
- scitex/ml/classification/timeseries/_TimeSeriesStratifiedSplit.py +610 -0
- scitex/ml/classification/timeseries/__init__.py +39 -0
- scitex/ml/classification/timeseries/_normalize_timestamp.py +436 -0
- scitex/ml/clustering/__init__.py +11 -0
- scitex/ml/clustering/_pca.py +115 -0
- scitex/ml/clustering/_umap.py +376 -0
- scitex/ml/feature_extraction/__init__.py +56 -0
- scitex/ml/feature_extraction/vit.py +149 -0
- scitex/ml/feature_selection/__init__.py +30 -0
- scitex/ml/feature_selection/feature_selection.py +364 -0
- scitex/ml/loss/_L1L2Losses.py +34 -0
- scitex/ml/loss/__init__.py +12 -0
- scitex/ml/loss/multi_task_loss.py +47 -0
- scitex/ml/metrics/__init__.py +56 -0
- scitex/ml/metrics/_calc_bacc.py +61 -0
- scitex/ml/metrics/_calc_bacc_from_conf_mat.py +38 -0
- scitex/ml/metrics/_calc_clf_report.py +78 -0
- scitex/ml/metrics/_calc_conf_mat.py +93 -0
- scitex/ml/metrics/_calc_feature_importance.py +183 -0
- scitex/ml/metrics/_calc_mcc.py +61 -0
- scitex/ml/metrics/_calc_pre_rec_auc.py +116 -0
- scitex/ml/metrics/_calc_roc_auc.py +110 -0
- scitex/ml/metrics/_calc_seizure_prediction_metrics.py +490 -0
- scitex/ml/metrics/_calc_silhouette_score.py +503 -0
- scitex/ml/metrics/_normalize_labels.py +83 -0
- scitex/ml/optim/Ranger_Deep_Learning_Optimizer/__init__.py +0 -0
- scitex/ml/optim/Ranger_Deep_Learning_Optimizer/ranger/__init__.py +3 -0
- scitex/ml/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger.py +207 -0
- scitex/ml/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger2020.py +238 -0
- scitex/ml/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger913A.py +215 -0
- scitex/ml/optim/Ranger_Deep_Learning_Optimizer/ranger/rangerqh.py +184 -0
- scitex/ml/optim/Ranger_Deep_Learning_Optimizer/setup.py +24 -0
- scitex/ml/optim/__init__.py +13 -0
- scitex/ml/optim/_get_set.py +31 -0
- scitex/ml/optim/_optimizers.py +71 -0
- scitex/ml/plt/__init__.py +60 -0
- scitex/ml/plt/_plot_conf_mat.py +663 -0
- scitex/ml/plt/_plot_feature_importance.py +323 -0
- scitex/ml/plt/_plot_learning_curve.py +345 -0
- scitex/ml/plt/_plot_optuna_study.py +225 -0
- scitex/ml/plt/_plot_pre_rec_curve.py +290 -0
- scitex/ml/plt/_plot_roc_curve.py +255 -0
- scitex/ml/sk/__init__.py +11 -0
- scitex/ml/sk/_clf.py +58 -0
- scitex/ml/sk/_to_sktime.py +100 -0
- scitex/ml/sklearn/__init__.py +26 -0
- scitex/ml/sklearn/clf.py +58 -0
- scitex/ml/sklearn/to_sktime.py +100 -0
- scitex/{ai/training/early_stopping.py → ml/training/_EarlyStopping.py} +1 -2
- scitex/{ai → ml/training}/_LearningCurveLogger.py +198 -242
- scitex/ml/training/__init__.py +7 -0
- scitex/ml/utils/__init__.py +22 -0
- scitex/ml/utils/_check_params.py +50 -0
- scitex/ml/utils/_default_dataset.py +46 -0
- scitex/ml/utils/_format_samples_for_sktime.py +26 -0
- scitex/ml/utils/_label_encoder.py +134 -0
- scitex/ml/utils/_merge_labels.py +22 -0
- scitex/ml/utils/_sliding_window_data_augmentation.py +11 -0
- scitex/ml/utils/_under_sample.py +51 -0
- scitex/ml/utils/_verify_n_gpus.py +16 -0
- scitex/ml/utils/grid_search.py +148 -0
- scitex/nn/_BNet.py +15 -9
- scitex/nn/_Filters.py +2 -2
- scitex/nn/_ModulationIndex.py +2 -2
- scitex/nn/_PAC.py +1 -1
- scitex/nn/_Spectrogram.py +12 -3
- scitex/nn/__init__.py +9 -10
- scitex/path/__init__.py +18 -0
- scitex/path/_clean.py +4 -0
- scitex/path/_find.py +9 -4
- scitex/path/_symlink.py +348 -0
- scitex/path/_version.py +4 -3
- scitex/pd/__init__.py +2 -0
- scitex/pd/_get_unique.py +99 -0
- scitex/plt/__init__.py +114 -5
- scitex/plt/_subplots/_AxesWrapper.py +1 -3
- scitex/plt/_subplots/_AxisWrapper.py +7 -3
- scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py +47 -13
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin.py +160 -2
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py +26 -4
- scitex/plt/_subplots/_AxisWrapperMixins/_UnitAwareMixin.py +322 -0
- scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +1 -0
- scitex/plt/_subplots/_FigWrapper.py +62 -6
- scitex/plt/_subplots/_export_as_csv.py +43 -27
- scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +5 -4
- scitex/plt/_subplots/_export_as_csv_formatters/_format_annotate.py +81 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_bar.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_barh.py +20 -5
- scitex/plt/_subplots/_export_as_csv_formatters/_format_boxplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_contour.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_errorbar.py +35 -18
- scitex/plt/_subplots/_export_as_csv_formatters/_format_eventplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_fill.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_fill_between.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_hist.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow2d.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot.py +15 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_box.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_conf_mat.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_ecdf.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_fillv.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_heatmap.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_image.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_joyplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_kde.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_line.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_ci.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_std.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_median_iqr.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_raster.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_rectangle.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter.py +35 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter_hist.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_shaded_line.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_violin.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_scatter.py +6 -4
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_barplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_boxplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_heatmap.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_histplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_jointplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_kdeplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_lineplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_pairplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_scatterplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_stripplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_swarmplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_violinplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_text.py +60 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_violin.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_violinplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/test_formatters.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters.py +56 -59
- scitex/plt/ax/_style/_hide_spines.py +1 -3
- scitex/plt/ax/_style/_rotate_labels.py +180 -76
- scitex/plt/ax/_style/_rotate_labels_v01.py +248 -0
- scitex/plt/ax/_style/_set_meta.py +11 -4
- scitex/plt/ax/_style/_set_supxyt.py +3 -3
- scitex/plt/ax/_style/_set_xyt.py +3 -3
- scitex/plt/ax/_style/_share_axes.py +2 -2
- scitex/plt/color/__init__.py +4 -4
- scitex/plt/color/{_get_colors_from_cmap.py → _get_colors_from_conf_matap.py} +7 -7
- scitex/plt/utils/_configure_mpl.py +99 -86
- scitex/plt/utils/_histogram_utils.py +1 -3
- scitex/plt/utils/_is_valid_axis.py +1 -3
- scitex/plt/utils/_scitex_config.py +1 -0
- scitex/repro/__init__.py +75 -0
- scitex/{reproduce → repro}/_gen_ID.py +1 -1
- scitex/{reproduce → repro}/_gen_timestamp.py +1 -1
- scitex/repro_rng/_RandomStateManager.py +590 -0
- scitex/repro_rng/_RandomStateManager_v01-no-verbose-options.py +414 -0
- scitex/repro_rng/__init__.py +39 -0
- scitex/reproduce/__init__.py +25 -13
- scitex/reproduce/_hash_array.py +22 -0
- scitex/resource/_get_processor_usages.py +4 -4
- scitex/resource/_get_specs.py +2 -2
- scitex/resource/_log_processor_usages.py +2 -2
- scitex/rng/_RandomStateManager.py +590 -0
- scitex/rng/_RandomStateManager_v01-no-verbose-options.py +414 -0
- scitex/rng/__init__.py +39 -0
- scitex/scholar/__init__.py +309 -19
- scitex/scholar/__main__.py +319 -0
- scitex/scholar/auth/ScholarAuthManager.py +308 -0
- scitex/scholar/auth/__init__.py +12 -0
- scitex/scholar/auth/core/AuthenticationGateway.py +473 -0
- scitex/scholar/auth/core/BrowserAuthenticator.py +386 -0
- scitex/scholar/auth/core/StrategyResolver.py +309 -0
- scitex/scholar/auth/core/__init__.py +16 -0
- scitex/scholar/auth/gateway/_OpenURLLinkFinder.py +120 -0
- scitex/scholar/auth/gateway/_OpenURLResolver.py +209 -0
- scitex/scholar/auth/gateway/__init__.py +38 -0
- scitex/scholar/auth/gateway/_resolve_functions.py +101 -0
- scitex/scholar/auth/providers/BaseAuthenticator.py +166 -0
- scitex/scholar/auth/providers/EZProxyAuthenticator.py +484 -0
- scitex/scholar/auth/providers/OpenAthensAuthenticator.py +619 -0
- scitex/scholar/auth/providers/ShibbolethAuthenticator.py +686 -0
- scitex/scholar/auth/providers/__init__.py +18 -0
- scitex/scholar/auth/session/AuthCacheManager.py +189 -0
- scitex/scholar/auth/session/SessionManager.py +159 -0
- scitex/scholar/auth/session/__init__.py +11 -0
- scitex/scholar/auth/sso/BaseSSOAutomator.py +373 -0
- scitex/scholar/auth/sso/OpenAthensSSOAutomator.py +378 -0
- scitex/scholar/auth/sso/SSOAutomator.py +180 -0
- scitex/scholar/auth/sso/UniversityOfMelbourneSSOAutomator.py +380 -0
- scitex/scholar/auth/sso/__init__.py +15 -0
- scitex/scholar/browser/ScholarBrowserManager.py +705 -0
- scitex/scholar/browser/__init__.py +38 -0
- scitex/scholar/browser/utils/__init__.py +13 -0
- scitex/scholar/browser/utils/click_and_wait.py +205 -0
- scitex/scholar/browser/utils/close_unwanted_pages.py +140 -0
- scitex/scholar/browser/utils/wait_redirects.py +732 -0
- scitex/scholar/config/PublisherRules.py +132 -0
- scitex/scholar/config/ScholarConfig.py +126 -0
- scitex/scholar/config/__init__.py +17 -0
- scitex/scholar/core/Paper.py +627 -0
- scitex/scholar/core/Papers.py +722 -0
- scitex/scholar/core/Scholar.py +1975 -0
- scitex/scholar/core/__init__.py +9 -0
- scitex/scholar/impact_factor/ImpactFactorEngine.py +204 -0
- scitex/scholar/impact_factor/__init__.py +20 -0
- scitex/scholar/impact_factor/estimation/ImpactFactorEstimationEngine.py +0 -0
- scitex/scholar/impact_factor/estimation/__init__.py +40 -0
- scitex/scholar/impact_factor/estimation/build_database.py +0 -0
- scitex/scholar/impact_factor/estimation/core/__init__.py +28 -0
- scitex/scholar/impact_factor/estimation/core/cache_manager.py +523 -0
- scitex/scholar/impact_factor/estimation/core/calculator.py +355 -0
- scitex/scholar/impact_factor/estimation/core/journal_matcher.py +428 -0
- scitex/scholar/integration/__init__.py +59 -0
- scitex/scholar/integration/base.py +502 -0
- scitex/scholar/integration/mendeley/__init__.py +22 -0
- scitex/scholar/integration/mendeley/exporter.py +166 -0
- scitex/scholar/integration/mendeley/importer.py +236 -0
- scitex/scholar/integration/mendeley/linker.py +79 -0
- scitex/scholar/integration/mendeley/mapper.py +212 -0
- scitex/scholar/integration/zotero/__init__.py +27 -0
- scitex/scholar/integration/zotero/__main__.py +264 -0
- scitex/scholar/integration/zotero/exporter.py +351 -0
- scitex/scholar/integration/zotero/importer.py +372 -0
- scitex/scholar/integration/zotero/linker.py +415 -0
- scitex/scholar/integration/zotero/mapper.py +286 -0
- scitex/scholar/metadata_engines/ScholarEngine.py +588 -0
- scitex/scholar/metadata_engines/__init__.py +21 -0
- scitex/scholar/metadata_engines/individual/ArXivEngine.py +397 -0
- scitex/scholar/metadata_engines/individual/CrossRefEngine.py +274 -0
- scitex/scholar/metadata_engines/individual/CrossRefLocalEngine.py +263 -0
- scitex/scholar/metadata_engines/individual/OpenAlexEngine.py +350 -0
- scitex/scholar/metadata_engines/individual/PubMedEngine.py +329 -0
- scitex/scholar/metadata_engines/individual/SemanticScholarEngine.py +438 -0
- scitex/scholar/metadata_engines/individual/URLDOIEngine.py +410 -0
- scitex/scholar/metadata_engines/individual/_BaseDOIEngine.py +487 -0
- scitex/scholar/metadata_engines/individual/__init__.py +7 -0
- scitex/scholar/metadata_engines/utils/_PubMedConverter.py +469 -0
- scitex/scholar/metadata_engines/utils/_URLDOIExtractor.py +283 -0
- scitex/scholar/metadata_engines/utils/__init__.py +30 -0
- scitex/scholar/metadata_engines/utils/_metadata2bibtex.py +103 -0
- scitex/scholar/metadata_engines/utils/_standardize_metadata.py +376 -0
- scitex/scholar/pdf_download/ScholarPDFDownloader.py +579 -0
- scitex/scholar/pdf_download/__init__.py +5 -0
- scitex/scholar/pdf_download/strategies/__init__.py +38 -0
- scitex/scholar/pdf_download/strategies/chrome_pdf_viewer.py +376 -0
- scitex/scholar/pdf_download/strategies/direct_download.py +131 -0
- scitex/scholar/pdf_download/strategies/manual_download_fallback.py +167 -0
- scitex/scholar/pdf_download/strategies/manual_download_utils.py +996 -0
- scitex/scholar/pdf_download/strategies/response_body.py +207 -0
- scitex/scholar/pipelines/ScholarPipelineBibTeX.py +364 -0
- scitex/scholar/pipelines/ScholarPipelineParallel.py +478 -0
- scitex/scholar/pipelines/ScholarPipelineSingle.py +767 -0
- scitex/scholar/pipelines/__init__.py +49 -0
- scitex/scholar/storage/BibTeXHandler.py +1018 -0
- scitex/scholar/storage/PaperIO.py +468 -0
- scitex/scholar/storage/ScholarLibrary.py +182 -0
- scitex/scholar/storage/_DeduplicationManager.py +548 -0
- scitex/scholar/storage/_LibraryCacheManager.py +724 -0
- scitex/scholar/storage/_LibraryManager.py +1835 -0
- scitex/scholar/storage/__init__.py +28 -0
- scitex/scholar/url_finder/ScholarURLFinder.py +379 -0
- scitex/scholar/url_finder/__init__.py +7 -0
- scitex/scholar/url_finder/strategies/__init__.py +33 -0
- scitex/scholar/url_finder/strategies/find_pdf_urls_by_direct_links.py +261 -0
- scitex/scholar/url_finder/strategies/find_pdf_urls_by_dropdown.py +67 -0
- scitex/scholar/url_finder/strategies/find_pdf_urls_by_href.py +204 -0
- scitex/scholar/url_finder/strategies/find_pdf_urls_by_navigation.py +256 -0
- scitex/scholar/url_finder/strategies/find_pdf_urls_by_publisher_patterns.py +165 -0
- scitex/scholar/url_finder/strategies/find_pdf_urls_by_zotero_translators.py +163 -0
- scitex/scholar/url_finder/strategies/find_supplementary_urls_by_href.py +70 -0
- scitex/scholar/utils/__init__.py +22 -0
- scitex/scholar/utils/bibtex/__init__.py +9 -0
- scitex/scholar/utils/bibtex/_parse_bibtex.py +71 -0
- scitex/scholar/utils/cleanup/__init__.py +8 -0
- scitex/scholar/utils/cleanup/_cleanup_scholar_processes.py +96 -0
- scitex/scholar/utils/cleanup/cleanup_old_extractions.py +117 -0
- scitex/scholar/utils/text/_TextNormalizer.py +407 -0
- scitex/scholar/utils/text/__init__.py +9 -0
- scitex/scholar/zotero/__init__.py +38 -0
- scitex/session/__init__.py +51 -0
- scitex/session/_lifecycle.py +736 -0
- scitex/session/_manager.py +102 -0
- scitex/session/template.py +122 -0
- scitex/stats/__init__.py +30 -26
- scitex/stats/correct/__init__.py +21 -0
- scitex/stats/correct/_correct_bonferroni.py +551 -0
- scitex/stats/correct/_correct_fdr.py +634 -0
- scitex/stats/correct/_correct_holm.py +548 -0
- scitex/stats/correct/_correct_sidak.py +499 -0
- scitex/stats/descriptive/__init__.py +85 -0
- scitex/stats/descriptive/_circular.py +540 -0
- scitex/stats/descriptive/_describe.py +219 -0
- scitex/stats/descriptive/_nan.py +518 -0
- scitex/stats/descriptive/_real.py +189 -0
- scitex/stats/effect_sizes/__init__.py +41 -0
- scitex/stats/effect_sizes/_cliffs_delta.py +325 -0
- scitex/stats/effect_sizes/_cohens_d.py +342 -0
- scitex/stats/effect_sizes/_epsilon_squared.py +315 -0
- scitex/stats/effect_sizes/_eta_squared.py +302 -0
- scitex/stats/effect_sizes/_prob_superiority.py +296 -0
- scitex/stats/posthoc/__init__.py +19 -0
- scitex/stats/posthoc/_dunnett.py +463 -0
- scitex/stats/posthoc/_games_howell.py +383 -0
- scitex/stats/posthoc/_tukey_hsd.py +367 -0
- scitex/stats/power/__init__.py +19 -0
- scitex/stats/power/_power.py +433 -0
- scitex/stats/template.py +119 -0
- scitex/stats/utils/__init__.py +62 -0
- scitex/stats/utils/_effect_size.py +985 -0
- scitex/stats/utils/_formatters.py +270 -0
- scitex/stats/utils/_normalizers.py +927 -0
- scitex/stats/utils/_power.py +433 -0
- scitex/stats_v01/_EffectSizeCalculator.py +488 -0
- scitex/stats_v01/_StatisticalValidator.py +411 -0
- scitex/stats_v01/__init__.py +60 -0
- scitex/stats_v01/_additional_tests.py +415 -0
- scitex/{stats → stats_v01}/_p2stars.py +19 -5
- scitex/stats_v01/_two_sample_tests.py +141 -0
- scitex/stats_v01/desc/__init__.py +83 -0
- scitex/stats_v01/desc/_circular.py +540 -0
- scitex/stats_v01/desc/_describe.py +219 -0
- scitex/stats_v01/desc/_nan.py +518 -0
- scitex/{stats/desc/_nan.py → stats_v01/desc/_nan_v01-20250920_145731.py} +23 -12
- scitex/stats_v01/desc/_real.py +189 -0
- scitex/stats_v01/tests/__corr_test_optimized.py +221 -0
- scitex/stats_v01/tests/_corr_test_optimized.py +179 -0
- scitex/str/__init__.py +1 -3
- scitex/str/_clean_path.py +6 -2
- scitex/str/_latex_fallback.py +267 -160
- scitex/str/_parse.py +44 -36
- scitex/str/_printc.py +1 -3
- scitex/template/__init__.py +87 -0
- scitex/template/_create_project.py +267 -0
- scitex/template/create_pip_project.py +80 -0
- scitex/template/create_research.py +80 -0
- scitex/template/create_singularity.py +80 -0
- scitex/units.py +291 -0
- scitex/utils/_compress_hdf5.py +14 -3
- scitex/utils/_email.py +21 -2
- scitex/utils/_grid.py +6 -4
- scitex/utils/_notify.py +13 -10
- scitex/utils/_verify_scitex_format.py +589 -0
- scitex/utils/_verify_scitex_format_v01.py +370 -0
- scitex/utils/template.py +122 -0
- scitex/web/_search_pubmed.py +62 -16
- scitex-2.1.0.dist-info/LICENSE +21 -0
- scitex-2.1.0.dist-info/METADATA +677 -0
- scitex-2.1.0.dist-info/RECORD +919 -0
- {scitex-2.0.0.dist-info → scitex-2.1.0.dist-info}/WHEEL +1 -1
- scitex-2.1.0.dist-info/entry_points.txt +3 -0
- scitex/ai/__Classifiers.py +0 -101
- scitex/ai/classification/classification_reporter.py +0 -1137
- scitex/ai/classification/classifiers.py +0 -101
- scitex/ai/classification_reporter.py +0 -1161
- scitex/ai/genai/__init__.py +0 -277
- scitex/ai/genai/anthropic_provider.py +0 -320
- scitex/ai/genai/anthropic_refactored.py +0 -109
- scitex/ai/genai/auth_manager.py +0 -200
- scitex/ai/genai/base_provider.py +0 -291
- scitex/ai/genai/chat_history.py +0 -307
- scitex/ai/genai/cost_tracker.py +0 -276
- scitex/ai/genai/deepseek_provider.py +0 -251
- scitex/ai/genai/google_provider.py +0 -228
- scitex/ai/genai/groq_provider.py +0 -248
- scitex/ai/genai/image_processor.py +0 -250
- scitex/ai/genai/llama_provider.py +0 -214
- scitex/ai/genai/mock_provider.py +0 -127
- scitex/ai/genai/model_registry.py +0 -304
- scitex/ai/genai/openai_provider.py +0 -293
- scitex/ai/genai/perplexity_provider.py +0 -205
- scitex/ai/genai/provider_base.py +0 -302
- scitex/ai/genai/provider_factory.py +0 -370
- scitex/ai/genai/response_handler.py +0 -235
- scitex/ai/layer/_Pass.py +0 -21
- scitex/ai/layer/__init__.py +0 -10
- scitex/ai/layer/_switch.py +0 -8
- scitex/ai/metrics/_bACC.py +0 -51
- scitex/ai/plt/_learning_curve.py +0 -194
- scitex/ai/plt/_optuna_study.py +0 -111
- scitex/ai/plt/aucs/__init__.py +0 -2
- scitex/ai/plt/aucs/example.py +0 -60
- scitex/ai/plt/aucs/pre_rec_auc.py +0 -223
- scitex/ai/plt/aucs/roc_auc.py +0 -246
- scitex/ai/sampling/undersample.py +0 -29
- scitex/db/_SQLite3.py +0 -2136
- scitex/db/_SQLite3Mixins/_BlobMixin.py +0 -229
- scitex/gen/_close.py +0 -222
- scitex/gen/_start.py +0 -451
- scitex/general/__init__.py +0 -5
- scitex/io/_load_modules/_db.py +0 -24
- scitex/life/__init__.py +0 -10
- scitex/life/_monitor_rain.py +0 -49
- scitex/reproduce/_fix_seeds.py +0 -45
- scitex/res/__init__.py +0 -5
- scitex/scholar/_local_search.py +0 -454
- scitex/scholar/_paper.py +0 -244
- scitex/scholar/_pdf_downloader.py +0 -325
- scitex/scholar/_search.py +0 -393
- scitex/scholar/_vector_search.py +0 -370
- scitex/scholar/_web_sources.py +0 -457
- scitex/stats/desc/__init__.py +0 -40
- scitex-2.0.0.dist-info/METADATA +0 -307
- scitex-2.0.0.dist-info/RECORD +0 -572
- scitex-2.0.0.dist-info/licenses/LICENSE +0 -7
- /scitex/ai/{act → activation}/__init__.py +0 -0
- /scitex/ai/{act → activation}/_define.py +0 -0
- /scitex/ai/{early_stopping.py → training/_EarlyStopping.py} +0 -0
- /scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_ImportExportMixin.py +0 -0
- /scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_IndexMixin.py +0 -0
- /scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_RowMixin.py +0 -0
- /scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_TableMixin.py +0 -0
- /scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/__init__.py +0 -0
- /scitex/{stats → stats_v01}/_calc_partial_corr.py +0 -0
- /scitex/{stats → stats_v01}/_corr_test_multi.py +0 -0
- /scitex/{stats → stats_v01}/_corr_test_wrapper.py +0 -0
- /scitex/{stats → stats_v01}/_describe_wrapper.py +0 -0
- /scitex/{stats → stats_v01}/_multiple_corrections.py +0 -0
- /scitex/{stats → stats_v01}/_nan_stats.py +0 -0
- /scitex/{stats → stats_v01}/_p2stars_wrapper.py +0 -0
- /scitex/{stats → stats_v01}/_statistical_tests.py +0 -0
- /scitex/{stats/desc/_describe.py → stats_v01/desc/_describe_v01-20250920_145731.py} +0 -0
- /scitex/{stats/desc/_real.py → stats_v01/desc/_real_v01-20250920_145731.py} +0 -0
- /scitex/{stats → stats_v01}/multiple/__init__.py +0 -0
- /scitex/{stats → stats_v01}/multiple/_bonferroni_correction.py +0 -0
- /scitex/{stats → stats_v01}/multiple/_fdr_correction.py +0 -0
- /scitex/{stats → stats_v01}/multiple/_multicompair.py +0 -0
- /scitex/{stats → stats_v01}/tests/__corr_test.py +0 -0
- /scitex/{stats → stats_v01}/tests/__corr_test_multi.py +0 -0
- /scitex/{stats → stats_v01}/tests/__corr_test_single.py +0 -0
- /scitex/{stats → stats_v01}/tests/__init__.py +0 -0
- /scitex/{stats → stats_v01}/tests/_brunner_munzel_test.py +0 -0
- /scitex/{stats → stats_v01}/tests/_nocorrelation_test.py +0 -0
- /scitex/{stats → stats_v01}/tests/_smirnov_grubbs.py +0 -0
- {scitex-2.0.0.dist-info → scitex-2.1.0.dist-info}/top_level.txt +0 -0
scitex/scholar/__init__.py
CHANGED
|
@@ -1,24 +1,314 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"""
|
|
2
|
+
SciTeX Scholar - Scientific Literature Management Made Simple
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
This module provides a unified interface for:
|
|
5
|
+
- Searching scientific literature across multiple sources
|
|
6
|
+
- Automatic paper enrichment with journal metrics
|
|
7
|
+
- PDF downloads and local library management
|
|
8
|
+
- Bibliography generation in multiple formats
|
|
9
|
+
|
|
10
|
+
Quick Start:
|
|
11
|
+
from scitex.scholar import Scholar
|
|
12
|
+
|
|
13
|
+
scholar = Scholar()
|
|
14
|
+
papers = scholar.search("deep learning")
|
|
15
|
+
papers.save("pac.bib")
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
# # Import main class
|
|
19
|
+
# from .core._Scholar import Scholar, search, search_quick, enrich_bibtex
|
|
20
|
+
|
|
21
|
+
# Import configuration
|
|
22
|
+
from scitex.scholar.config import ScholarConfig
|
|
23
|
+
from scitex.scholar.auth import ScholarAuthManager
|
|
24
|
+
from scitex.scholar.browser import ScholarBrowserManager
|
|
25
|
+
from scitex.scholar.metadata_engines import ScholarEngine
|
|
26
|
+
from scitex.scholar.url_finder import ScholarURLFinder
|
|
27
|
+
from scitex.scholar.pdf_download import ScholarPDFDownloader
|
|
28
|
+
from scitex.scholar.storage import ScholarLibrary
|
|
29
|
+
from scitex.scholar.core import Paper, Papers, Scholar
|
|
30
|
+
from . import utils
|
|
10
31
|
|
|
11
32
|
__all__ = [
|
|
12
|
-
"
|
|
13
|
-
"
|
|
33
|
+
"ScholarConfig",
|
|
34
|
+
"ScholarEngine",
|
|
35
|
+
"ScholarURLFinder",
|
|
36
|
+
"ScholarAuthManager",
|
|
37
|
+
"ScholarBrowserManager",
|
|
38
|
+
|
|
14
39
|
"Paper",
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
|
|
18
|
-
"
|
|
19
|
-
"logger",
|
|
20
|
-
"logger",
|
|
21
|
-
"logger",
|
|
22
|
-
"logger",
|
|
23
|
-
"search_sync",
|
|
40
|
+
"Papers",
|
|
41
|
+
"Scholar",
|
|
42
|
+
|
|
43
|
+
"utils",
|
|
24
44
|
]
|
|
45
|
+
|
|
46
|
+
# # Import core classes for advanced users
|
|
47
|
+
# from scitex.scholar.core import Paper
|
|
48
|
+
# from .core.Papers import Papers
|
|
49
|
+
|
|
50
|
+
# # DOI resolver is available via: python -m scitex.scholar.resolve_doi_asyncs
|
|
51
|
+
# from . import doi
|
|
52
|
+
|
|
53
|
+
# # Backward compatibility alias
|
|
54
|
+
# PaperCollection = Papers
|
|
55
|
+
|
|
56
|
+
# # Import utility functions
|
|
57
|
+
# from .utils._formatters import (
|
|
58
|
+
# papers_to_bibtex,
|
|
59
|
+
# papers_to_ris,
|
|
60
|
+
# papers_to_json,
|
|
61
|
+
# papers_to_markdown
|
|
62
|
+
# )
|
|
63
|
+
|
|
64
|
+
# # Import enrichment functionality
|
|
65
|
+
# from .metadata.enrichment._MetadataEnricher import (
|
|
66
|
+
# MetadataEnricher,
|
|
67
|
+
# _enrich_papers_with_all,
|
|
68
|
+
# _enrich_papers_with_impact_factors,
|
|
69
|
+
# _enrich_papers_with_citations,
|
|
70
|
+
# )
|
|
71
|
+
|
|
72
|
+
# # PDF download functionality
|
|
73
|
+
# from .download._ScholarPDFDownloader import (
|
|
74
|
+
# ScholarPDFDownloader,
|
|
75
|
+
# download_pdf_async,
|
|
76
|
+
# download_pdf_asyncs_async,
|
|
77
|
+
# )
|
|
78
|
+
# from .download._SmartScholarPDFDownloader import SmartScholarPDFDownloader
|
|
79
|
+
|
|
80
|
+
# # Browser-based download functionality removed - simplified structure
|
|
81
|
+
|
|
82
|
+
# # Create module-level convenience function
|
|
83
|
+
# def download_pdf_asyncs(
|
|
84
|
+
# dois,
|
|
85
|
+
# download_dir=None,
|
|
86
|
+
# force=False,
|
|
87
|
+
# max_worker=4,
|
|
88
|
+
# show_async_progress=True,
|
|
89
|
+
# acknowledge_ethical_usage=None,
|
|
90
|
+
# **kwargs
|
|
91
|
+
# ):
|
|
92
|
+
# """
|
|
93
|
+
# Download PDFs for DOIs using default Scholar instance.
|
|
94
|
+
|
|
95
|
+
# This is a convenience function that creates a Scholar instance if needed.
|
|
96
|
+
# For more control, use Scholar().download_pdf_asyncs() directly.
|
|
97
|
+
|
|
98
|
+
# Args:
|
|
99
|
+
# dois: DOI strings (list or single string) or Papers/Paper objects
|
|
100
|
+
# download_dir: Directory to save PDFs
|
|
101
|
+
# force: Force re-download
|
|
102
|
+
# max_worker: Maximum concurrent downloads
|
|
103
|
+
# show_async_progress: Show download progress
|
|
104
|
+
# acknowledge_ethical_usage: Acknowledge ethical usage for Sci-Hub
|
|
105
|
+
# **kwargs: Additional arguments
|
|
106
|
+
|
|
107
|
+
# Returns:
|
|
108
|
+
# Dictionary with download results
|
|
109
|
+
|
|
110
|
+
# Examples:
|
|
111
|
+
# >>> import scitex as stx
|
|
112
|
+
# >>> stx.scholar.download_pdf_asyncs(["10.1234/doi1", "10.5678/doi2"])
|
|
113
|
+
# >>> stx.scholar.download_pdf_asyncs("10.1234/single-doi")
|
|
114
|
+
# """
|
|
115
|
+
# scholar = Scholar()
|
|
116
|
+
# return scholar.download_pdf_asyncs(
|
|
117
|
+
# dois,
|
|
118
|
+
# download_dir=download_dir,
|
|
119
|
+
# force=force,
|
|
120
|
+
# max_worker=max_worker,
|
|
121
|
+
# show_async_progress=show_async_progress,
|
|
122
|
+
# acknowledge_ethical_usage=acknowledge_ethical_usage,
|
|
123
|
+
# **kwargs
|
|
124
|
+
# )
|
|
125
|
+
|
|
126
|
+
# # Version
|
|
127
|
+
# __version__ = "0.1.0"
|
|
128
|
+
|
|
129
|
+
# # What users see with "from scitex.scholar import *"
|
|
130
|
+
# __all__ = [
|
|
131
|
+
# # Main interface
|
|
132
|
+
# 'Scholar',
|
|
133
|
+
# 'ScholarConfig',
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
# # Convenience functions
|
|
137
|
+
# 'search',
|
|
138
|
+
# 'search_quick',
|
|
139
|
+
# 'enrich_bibtex',
|
|
140
|
+
# 'download_pdf_asyncs', # NEW: Module-level convenience function
|
|
141
|
+
|
|
142
|
+
# "doi",
|
|
143
|
+
# "resolve_doi_asyncs",
|
|
144
|
+
|
|
145
|
+
# # Core classes
|
|
146
|
+
# 'Paper',
|
|
147
|
+
# 'Papers',
|
|
148
|
+
# 'PaperCollection', # Backward compatibility alias
|
|
149
|
+
|
|
150
|
+
# # Format converters
|
|
151
|
+
# 'papers_to_bibtex',
|
|
152
|
+
# 'papers_to_ris',
|
|
153
|
+
# 'papers_to_json',
|
|
154
|
+
# 'papers_to_markdown',
|
|
155
|
+
|
|
156
|
+
# # Enrichment
|
|
157
|
+
# 'MetadataEnricher',
|
|
158
|
+
|
|
159
|
+
# # PDF download functionality
|
|
160
|
+
# 'ScholarPDFDownloader',
|
|
161
|
+
# 'download_pdf_async',
|
|
162
|
+
# 'download_pdf_asyncs_async',
|
|
163
|
+
|
|
164
|
+
# # Browser-based functionality
|
|
165
|
+
|
|
166
|
+
# # Authentication
|
|
167
|
+
# 'ScholarAuthManager',
|
|
168
|
+
# # 'OpenAthensAuthenticator',
|
|
169
|
+
# # 'ShibbolethAuthenticator',
|
|
170
|
+
# # 'EZProxyAuthenticator',
|
|
171
|
+
|
|
172
|
+
# # Resolution
|
|
173
|
+
# 'SingleDOIResolver',
|
|
174
|
+
# 'OpenURLResolver',
|
|
175
|
+
# 'ResumableOpenURLResolver',
|
|
176
|
+
# # 'BatchDOIResolver',
|
|
177
|
+
|
|
178
|
+
# # Enrichment
|
|
179
|
+
# 'MetadataEnricher',
|
|
180
|
+
# 'JCR_YEAR',
|
|
181
|
+
|
|
182
|
+
# # Validation
|
|
183
|
+
# 'PDFValidator',
|
|
184
|
+
# 'ValidationResult',
|
|
185
|
+
|
|
186
|
+
# # # Database
|
|
187
|
+
# # 'PaperDatabase',
|
|
188
|
+
# # 'DatabaseEntry',
|
|
189
|
+
# # 'DatabaseIndex',
|
|
190
|
+
|
|
191
|
+
# # Semantic Search
|
|
192
|
+
# # 'SemanticSearchEngine',
|
|
193
|
+
# # 'VectorDatabase',
|
|
194
|
+
# # 'Embedder',
|
|
195
|
+
# ]
|
|
196
|
+
|
|
197
|
+
# # # For backward compatibility, provide access to old functions with deprecation warnings
|
|
198
|
+
# # def __getattr__(name):
|
|
199
|
+
# # """Provide backward compatibility with deprecation warnings."""
|
|
200
|
+
# # import warnings
|
|
201
|
+
|
|
202
|
+
# # # Handle special IPython attributes
|
|
203
|
+
# # if name in ['__custom_documentations__', '__wrapped__']:
|
|
204
|
+
# # raise AttributeError(f"module '{__name__}' has no attribute '{name}'")
|
|
205
|
+
|
|
206
|
+
# # # Map old names to new functionality
|
|
207
|
+
# # compatibility_map = {
|
|
208
|
+
# # 'search_sync': 'search',
|
|
209
|
+
# # 'build_index': 'Scholar()._index_local_pdfs',
|
|
210
|
+
# # 'get_scholar_dir': 'Scholar().get_workspace_dir()',
|
|
211
|
+
# # 'LocalSearchEngine': 'Scholar',
|
|
212
|
+
# # 'VectorSearchEngine': 'Scholar',
|
|
213
|
+
# # 'ScholarPDFDownloader': 'Scholar',
|
|
214
|
+
# # 'search_papers': 'search',
|
|
215
|
+
# # 'SemanticScholarPaper': 'Paper',
|
|
216
|
+
# # 'PaperMetadata': 'Paper',
|
|
217
|
+
# # 'PaperAcquisition': 'Scholar',
|
|
218
|
+
# # 'SemanticScholarClient': 'Scholar',
|
|
219
|
+
# # 'JournalMetrics': 'Scholar',
|
|
220
|
+
# # 'PaperEnrichmentService': 'Scholar',
|
|
221
|
+
# # 'generate_enriched_bibliography': 'Papers.save'
|
|
222
|
+
# # }
|
|
223
|
+
|
|
224
|
+
# # if name in compatibility_map:
|
|
225
|
+
# # warnings.warn(
|
|
226
|
+
# # f"{name} is deprecated. Use {compatibility_map[name]} instead.",
|
|
227
|
+
# # DeprecationWarning,
|
|
228
|
+
# # stacklevel=2
|
|
229
|
+
# # )
|
|
230
|
+
|
|
231
|
+
# # # Return the Scholar class for most cases
|
|
232
|
+
# # if name in ['search_sync', 'search_papers']:
|
|
233
|
+
# # return search
|
|
234
|
+
# # elif name == 'build_index':
|
|
235
|
+
# # def build_index(paths, **kwargs):
|
|
236
|
+
# # scholar = Scholar()
|
|
237
|
+
# # stats = {}
|
|
238
|
+
# # for path in paths:
|
|
239
|
+
# # stats.update(scholar._index_local_pdfs(path))
|
|
240
|
+
# # return stats
|
|
241
|
+
# # return build_index
|
|
242
|
+
# # else:
|
|
243
|
+
# # return Scholar
|
|
244
|
+
|
|
245
|
+
# # from scitex.errors import ScholarError
|
|
246
|
+
# # raise ScholarError(
|
|
247
|
+
# # f"Module attribute not found: '{name}'",
|
|
248
|
+
# # context={"module": __name__, "attribute": name},
|
|
249
|
+
# # suggestion=f"Available attributes: Scholar, Paper, Papers, search, enrich_bibtex"
|
|
250
|
+
# # )
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
# # Import new modules
|
|
254
|
+
# from .auth import (
|
|
255
|
+
# ScholarAuthManager,
|
|
256
|
+
# # OpenAthensAuthenticator,
|
|
257
|
+
# # ShibbolethAuthenticator,
|
|
258
|
+
# # EZProxyAuthenticator,
|
|
259
|
+
# )
|
|
260
|
+
# from .metadata.doi._SingleDOIResovler import SingleDOIResolver
|
|
261
|
+
# from .open_url import OpenURLResolver, ResumableOpenURLResolver
|
|
262
|
+
# from .metadata.enrichment import (
|
|
263
|
+
# MetadataEnricher,
|
|
264
|
+
# JCR_YEAR,
|
|
265
|
+
# )
|
|
266
|
+
# # from .cli import resolve_doi_asyncs
|
|
267
|
+
# from .validation import PDFValidator, ValidationResult
|
|
268
|
+
# # from .database import PaperDatabase, DatabaseEntry, DatabaseIndex
|
|
269
|
+
# # from .search import SemanticSearchEngine, VectorDatabase, Embedder
|
|
270
|
+
|
|
271
|
+
# # Module docstring for help()
|
|
272
|
+
# def _module_docstring():
|
|
273
|
+
# """
|
|
274
|
+
# SciTeX Scholar - Scientific Literature Management
|
|
275
|
+
|
|
276
|
+
# Main Classes:
|
|
277
|
+
# Scholar: Main interface for all functionality
|
|
278
|
+
# Paper: Represents a scientific paper
|
|
279
|
+
# Papers: Collection of papers with analysis tools
|
|
280
|
+
|
|
281
|
+
# Quick Start:
|
|
282
|
+
# >>> from scitex.scholar import Scholar
|
|
283
|
+
# >>> scholar = Scholar()
|
|
284
|
+
# >>> papers = scholar.search("machine learning")
|
|
285
|
+
# >>> papers.filter(year_min=2020).save("ml_pac.bib")
|
|
286
|
+
|
|
287
|
+
# Common Workflows:
|
|
288
|
+
# # Search and enrich
|
|
289
|
+
# papers = scholar.search("deep learning", year_min=2022)
|
|
290
|
+
|
|
291
|
+
# # Download PDFs
|
|
292
|
+
# scholar.download_pdf_asyncs(papers)
|
|
293
|
+
|
|
294
|
+
# # Filter results
|
|
295
|
+
# high_impact = papers.filter(impact_factor_min=5.0)
|
|
296
|
+
|
|
297
|
+
# # Save bibliography
|
|
298
|
+
# papers.save("bibliography.bib", format="bibtex")
|
|
299
|
+
|
|
300
|
+
# # Search local library
|
|
301
|
+
# scholar._index_local_pdfs("./my_papers")
|
|
302
|
+
# local = scholar.search_local("transformer")
|
|
303
|
+
|
|
304
|
+
# For more information, see the documentation at:
|
|
305
|
+
# https://github.com/ywatanabe1989/SciTeX-Code
|
|
306
|
+
# """
|
|
307
|
+
# pass
|
|
308
|
+
|
|
309
|
+
# # Set module docstring
|
|
310
|
+
# __doc__ = _module_docstring.__doc__
|
|
311
|
+
|
|
312
|
+
# # EOF
|
|
313
|
+
|
|
314
|
+
# EOF
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/scholar/__main__.py
|
|
4
|
+
|
|
5
|
+
"""Scholar CLI entry point - Subcommand-based interface.
|
|
6
|
+
|
|
7
|
+
Clean interface routing to battle-tested pipeline implementations:
|
|
8
|
+
- single: Process single paper (DOI or title)
|
|
9
|
+
- parallel: Process multiple papers in parallel
|
|
10
|
+
- bibtex: Process papers from BibTeX file
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import argparse
|
|
16
|
+
import asyncio
|
|
17
|
+
import sys
|
|
18
|
+
|
|
19
|
+
from scitex import logging
|
|
20
|
+
|
|
21
|
+
logger = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def create_parser():
|
|
25
|
+
"""Create main argument parser with subcommands."""
|
|
26
|
+
parser = argparse.ArgumentParser(
|
|
27
|
+
prog="python -m scitex.scholar",
|
|
28
|
+
description="""
|
|
29
|
+
SciTeX Scholar - Scientific Literature Management
|
|
30
|
+
═════════════════════════════════════════════════
|
|
31
|
+
|
|
32
|
+
Clean subcommand interface to battle-tested pipelines:
|
|
33
|
+
single - Process a single paper (DOI or title)
|
|
34
|
+
parallel - Process multiple papers in parallel
|
|
35
|
+
bibtex - Process papers from BibTeX file
|
|
36
|
+
|
|
37
|
+
STORAGE: ~/.scitex/scholar/library/
|
|
38
|
+
MASTER/{8DIGITID}/ - Centralized storage (no duplicates)
|
|
39
|
+
{project}/ - Project symlinks to MASTER
|
|
40
|
+
""",
|
|
41
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
subparsers = parser.add_subparsers(
|
|
45
|
+
dest="command",
|
|
46
|
+
help="Available commands",
|
|
47
|
+
required=True,
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
# ========================================
|
|
51
|
+
# Subcommand: single
|
|
52
|
+
# ========================================
|
|
53
|
+
single_parser = subparsers.add_parser(
|
|
54
|
+
"single",
|
|
55
|
+
help="Process a single paper",
|
|
56
|
+
description="Process a single paper from DOI or title through full pipeline",
|
|
57
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
58
|
+
)
|
|
59
|
+
single_parser.add_argument(
|
|
60
|
+
"--doi",
|
|
61
|
+
type=str,
|
|
62
|
+
help='DOI of the paper (e.g., "10.1038/nature12373")',
|
|
63
|
+
metavar="DOI",
|
|
64
|
+
)
|
|
65
|
+
single_parser.add_argument(
|
|
66
|
+
"--title",
|
|
67
|
+
type=str,
|
|
68
|
+
help="Paper title (will resolve DOI automatically)",
|
|
69
|
+
metavar="TITLE",
|
|
70
|
+
)
|
|
71
|
+
single_parser.add_argument(
|
|
72
|
+
"--project",
|
|
73
|
+
type=str,
|
|
74
|
+
help="Project name for organizing papers",
|
|
75
|
+
metavar="NAME",
|
|
76
|
+
)
|
|
77
|
+
single_parser.add_argument(
|
|
78
|
+
"--browser-mode",
|
|
79
|
+
type=str,
|
|
80
|
+
choices=["stealth", "interactive"],
|
|
81
|
+
default="stealth",
|
|
82
|
+
help="Browser mode for PDF download (default: stealth)",
|
|
83
|
+
)
|
|
84
|
+
single_parser.add_argument(
|
|
85
|
+
"--chrome-profile",
|
|
86
|
+
type=str,
|
|
87
|
+
default="system",
|
|
88
|
+
help="Chrome profile name (default: system)",
|
|
89
|
+
)
|
|
90
|
+
single_parser.add_argument(
|
|
91
|
+
"--force",
|
|
92
|
+
"-f",
|
|
93
|
+
action="store_true",
|
|
94
|
+
help="Force re-download even if files exist",
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
# ========================================
|
|
98
|
+
# Subcommand: parallel
|
|
99
|
+
# ========================================
|
|
100
|
+
parallel_parser = subparsers.add_parser(
|
|
101
|
+
"parallel",
|
|
102
|
+
help="Process multiple papers in parallel",
|
|
103
|
+
description="Process multiple papers using parallel workers with dedicated browser profiles",
|
|
104
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
105
|
+
)
|
|
106
|
+
parallel_parser.add_argument(
|
|
107
|
+
"--dois",
|
|
108
|
+
type=str,
|
|
109
|
+
nargs="+",
|
|
110
|
+
help="Space-separated DOIs",
|
|
111
|
+
metavar="DOI",
|
|
112
|
+
)
|
|
113
|
+
parallel_parser.add_argument(
|
|
114
|
+
"--titles",
|
|
115
|
+
type=str,
|
|
116
|
+
nargs="+",
|
|
117
|
+
help="Space-separated paper titles (use quotes for multi-word titles)",
|
|
118
|
+
metavar="TITLE",
|
|
119
|
+
)
|
|
120
|
+
parallel_parser.add_argument(
|
|
121
|
+
"--project",
|
|
122
|
+
type=str,
|
|
123
|
+
help="Project name for organizing papers",
|
|
124
|
+
metavar="NAME",
|
|
125
|
+
)
|
|
126
|
+
parallel_parser.add_argument(
|
|
127
|
+
"--num-workers",
|
|
128
|
+
type=int,
|
|
129
|
+
default=4,
|
|
130
|
+
help="Number of parallel workers (default: 4)",
|
|
131
|
+
metavar="N",
|
|
132
|
+
)
|
|
133
|
+
parallel_parser.add_argument(
|
|
134
|
+
"--browser-mode",
|
|
135
|
+
type=str,
|
|
136
|
+
choices=["stealth", "interactive"],
|
|
137
|
+
default="stealth",
|
|
138
|
+
help="Browser mode for all workers (default: stealth)",
|
|
139
|
+
)
|
|
140
|
+
parallel_parser.add_argument(
|
|
141
|
+
"--chrome-profile",
|
|
142
|
+
type=str,
|
|
143
|
+
default="system",
|
|
144
|
+
help="Base Chrome profile to sync from (default: system)",
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
# ========================================
|
|
148
|
+
# Subcommand: bibtex
|
|
149
|
+
# ========================================
|
|
150
|
+
bibtex_parser = subparsers.add_parser(
|
|
151
|
+
"bibtex",
|
|
152
|
+
help="Process papers from BibTeX file",
|
|
153
|
+
description="Process all papers from a BibTeX file in parallel",
|
|
154
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
155
|
+
)
|
|
156
|
+
bibtex_parser.add_argument(
|
|
157
|
+
"--bibtex",
|
|
158
|
+
type=str,
|
|
159
|
+
required=True,
|
|
160
|
+
help="Path to BibTeX file",
|
|
161
|
+
metavar="FILE",
|
|
162
|
+
)
|
|
163
|
+
bibtex_parser.add_argument(
|
|
164
|
+
"--project",
|
|
165
|
+
type=str,
|
|
166
|
+
help="Project name for organizing papers",
|
|
167
|
+
metavar="NAME",
|
|
168
|
+
)
|
|
169
|
+
bibtex_parser.add_argument(
|
|
170
|
+
"--output",
|
|
171
|
+
type=str,
|
|
172
|
+
help="Output path for enriched BibTeX (default: {input}_processed.bib)",
|
|
173
|
+
metavar="FILE",
|
|
174
|
+
)
|
|
175
|
+
bibtex_parser.add_argument(
|
|
176
|
+
"--num-workers",
|
|
177
|
+
type=int,
|
|
178
|
+
default=4,
|
|
179
|
+
help="Number of parallel workers (default: 4)",
|
|
180
|
+
metavar="N",
|
|
181
|
+
)
|
|
182
|
+
bibtex_parser.add_argument(
|
|
183
|
+
"--browser-mode",
|
|
184
|
+
type=str,
|
|
185
|
+
choices=["stealth", "interactive"],
|
|
186
|
+
default="stealth",
|
|
187
|
+
help="Browser mode for all workers (default: stealth)",
|
|
188
|
+
)
|
|
189
|
+
bibtex_parser.add_argument(
|
|
190
|
+
"--chrome-profile",
|
|
191
|
+
type=str,
|
|
192
|
+
default="system",
|
|
193
|
+
help="Base Chrome profile to sync from (default: system)",
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
return parser
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
async def run_single_pipeline(args):
|
|
200
|
+
"""Run single paper pipeline."""
|
|
201
|
+
from .pipelines.ScholarPipelineSingle import ScholarPipelineSingle
|
|
202
|
+
|
|
203
|
+
# Validate input
|
|
204
|
+
if not args.doi and not args.title:
|
|
205
|
+
logger.error("Either --doi or --title is required")
|
|
206
|
+
return 1
|
|
207
|
+
|
|
208
|
+
doi_or_title = args.doi if args.doi else args.title
|
|
209
|
+
|
|
210
|
+
logger.info(f"Running single paper pipeline: {doi_or_title}")
|
|
211
|
+
|
|
212
|
+
pipeline = ScholarPipelineSingle(
|
|
213
|
+
browser_mode=args.browser_mode,
|
|
214
|
+
chrome_profile=args.chrome_profile,
|
|
215
|
+
)
|
|
216
|
+
|
|
217
|
+
paper, symlink_path = await pipeline.process_single_paper(
|
|
218
|
+
doi_or_title=doi_or_title,
|
|
219
|
+
project=args.project,
|
|
220
|
+
force=args.force,
|
|
221
|
+
)
|
|
222
|
+
|
|
223
|
+
logger.success(f"Single paper pipeline completed")
|
|
224
|
+
return 0
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
async def run_parallel_pipeline(args):
|
|
228
|
+
"""Run parallel papers pipeline."""
|
|
229
|
+
from .pipelines.ScholarPipelineParallel import ScholarPipelineParallel
|
|
230
|
+
|
|
231
|
+
# Validate input
|
|
232
|
+
if not args.dois and not args.titles:
|
|
233
|
+
logger.error("Either --dois or --titles is required")
|
|
234
|
+
return 1
|
|
235
|
+
|
|
236
|
+
# Combine DOIs and titles into single list
|
|
237
|
+
queries = []
|
|
238
|
+
if args.dois:
|
|
239
|
+
queries.extend(args.dois)
|
|
240
|
+
if args.titles:
|
|
241
|
+
queries.extend(args.titles)
|
|
242
|
+
|
|
243
|
+
logger.info(
|
|
244
|
+
f"Running parallel pipeline: {len(queries)} papers with {args.num_workers} workers"
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
pipeline = ScholarPipelineParallel(
|
|
248
|
+
num_workers=args.num_workers,
|
|
249
|
+
browser_mode=args.browser_mode,
|
|
250
|
+
base_chrome_profile=args.chrome_profile,
|
|
251
|
+
)
|
|
252
|
+
|
|
253
|
+
papers = await pipeline.process_papers_from_list_async(
|
|
254
|
+
doi_or_title_list=queries,
|
|
255
|
+
project=args.project,
|
|
256
|
+
)
|
|
257
|
+
|
|
258
|
+
logger.success(
|
|
259
|
+
f"Parallel pipeline completed: {len(papers)} papers processed"
|
|
260
|
+
)
|
|
261
|
+
return 0
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
async def run_bibtex_pipeline(args):
|
|
265
|
+
"""Run BibTeX file pipeline."""
|
|
266
|
+
from pathlib import Path
|
|
267
|
+
|
|
268
|
+
from .pipelines.ScholarPipelineBibTeX import ScholarPipelineBibTeX
|
|
269
|
+
|
|
270
|
+
bibtex_path = Path(args.bibtex)
|
|
271
|
+
if not bibtex_path.exists():
|
|
272
|
+
logger.error(f"BibTeX file not found: {bibtex_path}")
|
|
273
|
+
return 1
|
|
274
|
+
|
|
275
|
+
logger.info(f"Running BibTeX pipeline: {bibtex_path}")
|
|
276
|
+
|
|
277
|
+
pipeline = ScholarPipelineBibTeX(
|
|
278
|
+
num_workers=args.num_workers,
|
|
279
|
+
browser_mode=args.browser_mode,
|
|
280
|
+
base_chrome_profile=args.chrome_profile,
|
|
281
|
+
)
|
|
282
|
+
|
|
283
|
+
papers = await pipeline.process_bibtex_file_async(
|
|
284
|
+
bibtex_path=bibtex_path,
|
|
285
|
+
project=args.project,
|
|
286
|
+
output_bibtex_path=args.output,
|
|
287
|
+
)
|
|
288
|
+
|
|
289
|
+
logger.success(f"BibTeX pipeline completed: {len(papers)} papers processed")
|
|
290
|
+
return 0
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
async def main_async():
|
|
294
|
+
"""Main async entry point."""
|
|
295
|
+
parser = create_parser()
|
|
296
|
+
args = parser.parse_args()
|
|
297
|
+
|
|
298
|
+
# Route to appropriate pipeline
|
|
299
|
+
if args.command == "single":
|
|
300
|
+
return await run_single_pipeline(args)
|
|
301
|
+
elif args.command == "parallel":
|
|
302
|
+
return await run_parallel_pipeline(args)
|
|
303
|
+
elif args.command == "bibtex":
|
|
304
|
+
return await run_bibtex_pipeline(args)
|
|
305
|
+
else:
|
|
306
|
+
logger.error(f"Unknown command: {args.command}")
|
|
307
|
+
return 1
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
def main():
|
|
311
|
+
"""Synchronous entry point."""
|
|
312
|
+
return asyncio.run(main_async())
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
if __name__ == "__main__":
|
|
316
|
+
sys.exit(main())
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
# EOF
|