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/io/_load.py
CHANGED
|
@@ -1,22 +1,31 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
# -*- coding: utf-8 -*-
|
|
3
|
-
# Timestamp: "2025-
|
|
4
|
-
# File: /
|
|
3
|
+
# Timestamp: "2025-08-11 05:54:51 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/SciTeX-Code/src/scitex/io/_load.py
|
|
5
5
|
# ----------------------------------------
|
|
6
|
+
from __future__ import annotations
|
|
6
7
|
import os
|
|
7
|
-
|
|
8
|
-
__FILE__ = "/ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/io/_load.py"
|
|
8
|
+
__FILE__ = __file__
|
|
9
9
|
__DIR__ = os.path.dirname(__FILE__)
|
|
10
10
|
# ----------------------------------------
|
|
11
11
|
|
|
12
|
-
from typing import Any
|
|
13
12
|
import glob
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from typing import Any, Union
|
|
15
|
+
|
|
14
16
|
from ..decorators import preserve_doc
|
|
15
17
|
from ..str._clean_path import clean_path
|
|
18
|
+
from ._load_cache import (
|
|
19
|
+
cache_data,
|
|
20
|
+
configure_cache,
|
|
21
|
+
get_cache_info,
|
|
22
|
+
get_cached_data,
|
|
23
|
+
load_npy_cached,
|
|
24
|
+
)
|
|
25
|
+
from ._load_modules._bibtex import _load_bibtex
|
|
16
26
|
|
|
17
27
|
# from ._load_modules._catboost import _load_catboost
|
|
18
28
|
from ._load_modules._con import _load_con
|
|
19
|
-
from ._load_modules._db import _load_sqlite3db
|
|
20
29
|
from ._load_modules._docx import _load_docx
|
|
21
30
|
from ._load_modules._eeg import _load_eeg_data
|
|
22
31
|
from ._load_modules._hdf5 import _load_hdf5
|
|
@@ -24,32 +33,46 @@ from ._load_modules._image import _load_image
|
|
|
24
33
|
from ._load_modules._joblib import _load_joblib
|
|
25
34
|
from ._load_modules._json import _load_json
|
|
26
35
|
from ._load_modules._markdown import _load_markdown
|
|
27
|
-
from ._load_modules._numpy import _load_npy
|
|
28
36
|
from ._load_modules._matlab import _load_matlab
|
|
37
|
+
from ._load_modules._numpy import _load_npy
|
|
29
38
|
from ._load_modules._pandas import _load_csv, _load_excel, _load_tsv
|
|
30
39
|
from ._load_modules._pdf import _load_pdf
|
|
31
40
|
from ._load_modules._pickle import _load_pickle
|
|
41
|
+
from ._load_modules._sqlite3 import _load_db_sqlite3
|
|
32
42
|
from ._load_modules._torch import _load_torch
|
|
33
43
|
from ._load_modules._txt import _load_txt
|
|
34
44
|
from ._load_modules._xml import _load_xml
|
|
35
45
|
from ._load_modules._yaml import _load_yaml
|
|
36
|
-
from ._load_modules.
|
|
46
|
+
from ._load_modules._zarr import _load_zarr
|
|
37
47
|
|
|
38
48
|
|
|
39
|
-
def load(
|
|
49
|
+
def load(
|
|
50
|
+
lpath: Union[str, Path],
|
|
51
|
+
ext: str = None,
|
|
52
|
+
show: bool = False,
|
|
53
|
+
verbose: bool = False,
|
|
54
|
+
cache: bool = True,
|
|
55
|
+
**kwargs,
|
|
56
|
+
) -> Any:
|
|
40
57
|
"""
|
|
41
58
|
Load data from various file formats.
|
|
42
59
|
|
|
43
|
-
This function supports loading data from multiple file formats.
|
|
60
|
+
This function supports loading data from multiple file formats with optional caching.
|
|
44
61
|
|
|
45
62
|
Parameters
|
|
46
63
|
----------
|
|
47
|
-
lpath : str
|
|
48
|
-
The path to the file to be loaded.
|
|
64
|
+
lpath : Union[str, Path]
|
|
65
|
+
The path to the file to be loaded. Can be a string or pathlib.Path object.
|
|
66
|
+
ext : str, optional
|
|
67
|
+
File extension to use for loading. If None, automatically detects from filename.
|
|
68
|
+
Useful for files without extensions (e.g., UUID-named files).
|
|
69
|
+
Examples: 'pdf', 'json', 'csv'
|
|
49
70
|
show : bool, optional
|
|
50
71
|
If True, display additional information during loading. Default is False.
|
|
51
72
|
verbose : bool, optional
|
|
52
73
|
If True, print verbose output during loading. Default is False.
|
|
74
|
+
cache : bool, optional
|
|
75
|
+
If True, enable caching for faster repeated loads. Default is True.
|
|
53
76
|
**kwargs : dict
|
|
54
77
|
Additional keyword arguments to be passed to the specific loading function.
|
|
55
78
|
|
|
@@ -80,23 +103,66 @@ def load(lpath: str, show: bool = False, verbose: bool = False, **kwargs) -> Any
|
|
|
80
103
|
>>> data = load('data.csv')
|
|
81
104
|
>>> image = load('image.png')
|
|
82
105
|
>>> model = load('model.pth')
|
|
106
|
+
>>> # Load file without extension (e.g., UUID PDF)
|
|
107
|
+
>>> pdf = load('f2694ccb-1b6f-4994-add8-5111fd4d52f1', ext='pdf')
|
|
83
108
|
"""
|
|
84
|
-
|
|
109
|
+
|
|
110
|
+
# Don't use clean_path as it breaks relative paths like ./file.txt
|
|
111
|
+
# lpath = clean_path(lpath)
|
|
112
|
+
|
|
113
|
+
# Convert Path objects to strings for consistency
|
|
114
|
+
if isinstance(lpath, Path):
|
|
115
|
+
lpath = str(lpath)
|
|
116
|
+
if verbose:
|
|
117
|
+
print(f"[DEBUG] After Path conversion: {lpath}")
|
|
85
118
|
|
|
86
119
|
# Check if it's a glob pattern
|
|
87
120
|
if "*" in lpath or "?" in lpath or "[" in lpath:
|
|
88
121
|
# Handle glob pattern
|
|
89
122
|
matched_files = sorted(glob.glob(lpath))
|
|
90
123
|
if not matched_files:
|
|
91
|
-
raise FileNotFoundError(
|
|
124
|
+
raise FileNotFoundError(
|
|
125
|
+
f"No files found matching pattern: {lpath}"
|
|
126
|
+
)
|
|
92
127
|
# Load all matched files
|
|
93
128
|
results = []
|
|
94
129
|
for file_path in matched_files:
|
|
95
|
-
results.append(
|
|
130
|
+
results.append(
|
|
131
|
+
load(file_path, show=show, verbose=verbose, **kwargs)
|
|
132
|
+
)
|
|
96
133
|
return results
|
|
97
134
|
|
|
135
|
+
# Handle broken symlinks - os.path.exists() returns False for broken symlinks
|
|
98
136
|
if not os.path.exists(lpath):
|
|
99
|
-
|
|
137
|
+
if os.path.islink(lpath):
|
|
138
|
+
# For symlinks, resolve the target path relative to symlink's directory
|
|
139
|
+
symlink_dir = os.path.dirname(os.path.abspath(lpath))
|
|
140
|
+
target = os.readlink(lpath)
|
|
141
|
+
resolved_target = os.path.join(symlink_dir, target)
|
|
142
|
+
resolved_target = os.path.abspath(resolved_target)
|
|
143
|
+
|
|
144
|
+
if os.path.exists(resolved_target):
|
|
145
|
+
lpath = resolved_target
|
|
146
|
+
else:
|
|
147
|
+
raise FileNotFoundError(f"Symlink target not found: {resolved_target}")
|
|
148
|
+
else:
|
|
149
|
+
# Try general path resolution
|
|
150
|
+
try:
|
|
151
|
+
resolved_path = os.path.realpath(lpath)
|
|
152
|
+
if os.path.exists(resolved_path):
|
|
153
|
+
lpath = resolved_path
|
|
154
|
+
else:
|
|
155
|
+
raise FileNotFoundError(f"File not found: {lpath}")
|
|
156
|
+
except Exception:
|
|
157
|
+
raise FileNotFoundError(f"File not found: {lpath}")
|
|
158
|
+
|
|
159
|
+
# Try to get from cache first
|
|
160
|
+
if cache:
|
|
161
|
+
cached_data = get_cached_data(lpath)
|
|
162
|
+
if cached_data is not None:
|
|
163
|
+
if verbose:
|
|
164
|
+
print(f"[Cache HIT] Loaded from cache: {lpath}")
|
|
165
|
+
return cached_data
|
|
100
166
|
|
|
101
167
|
loaders_dict = {
|
|
102
168
|
# Default
|
|
@@ -106,6 +172,8 @@ def load(lpath: str, show: bool = False, verbose: bool = False, **kwargs) -> Any
|
|
|
106
172
|
"yml": _load_yaml,
|
|
107
173
|
"json": _load_json,
|
|
108
174
|
"xml": _load_xml,
|
|
175
|
+
# Bibliography
|
|
176
|
+
"bib": _load_bibtex,
|
|
109
177
|
# ML/DL Models
|
|
110
178
|
"pth": _load_torch,
|
|
111
179
|
"pt": _load_torch,
|
|
@@ -121,13 +189,14 @@ def load(lpath: str, show: bool = False, verbose: bool = False, **kwargs) -> Any
|
|
|
121
189
|
"xlsx": _load_excel,
|
|
122
190
|
"xlsm": _load_excel,
|
|
123
191
|
"xlsb": _load_excel,
|
|
124
|
-
"db":
|
|
192
|
+
"db": _load_db_sqlite3,
|
|
125
193
|
# Scientific Data
|
|
126
194
|
"npy": _load_npy,
|
|
127
195
|
"npz": _load_npy,
|
|
128
196
|
"mat": _load_matlab,
|
|
129
197
|
"hdf5": _load_hdf5,
|
|
130
198
|
"h5": _load_hdf5,
|
|
199
|
+
"zarr": _load_zarr,
|
|
131
200
|
"con": _load_con,
|
|
132
201
|
# Documents
|
|
133
202
|
"txt": _load_txt,
|
|
@@ -156,13 +225,31 @@ def load(lpath: str, show: bool = False, verbose: bool = False, **kwargs) -> Any
|
|
|
156
225
|
"set": _load_eeg_data,
|
|
157
226
|
}
|
|
158
227
|
|
|
159
|
-
|
|
160
|
-
|
|
228
|
+
# Determine extension: use explicit ext parameter or detect from filename
|
|
229
|
+
if ext is not None:
|
|
230
|
+
# Use explicitly provided extension (strip leading dot if present)
|
|
231
|
+
detected_ext = ext.lstrip('.')
|
|
232
|
+
else:
|
|
233
|
+
# Auto-detect from filename
|
|
234
|
+
detected_ext = lpath.split(".")[-1] if "." in lpath else ""
|
|
235
|
+
|
|
236
|
+
# Special handling for numpy files with caching
|
|
237
|
+
if cache and detected_ext in ["npy", "npz"]:
|
|
238
|
+
return load_npy_cached(lpath, **kwargs)
|
|
239
|
+
|
|
240
|
+
loader = preserve_doc(loaders_dict.get(detected_ext, _load_txt))
|
|
161
241
|
|
|
162
242
|
try:
|
|
163
|
-
|
|
243
|
+
result = loader(lpath, **kwargs)
|
|
244
|
+
|
|
245
|
+
# Cache the result if caching is enabled
|
|
246
|
+
if cache:
|
|
247
|
+
cache_data(lpath, result)
|
|
248
|
+
if verbose:
|
|
249
|
+
print(f"[Cache STORED] Cached data for: {lpath}")
|
|
250
|
+
|
|
251
|
+
return result
|
|
164
252
|
except (ValueError, FileNotFoundError) as e:
|
|
165
253
|
raise ValueError(f"Error loading file {lpath}: {str(e)}")
|
|
166
254
|
|
|
167
|
-
|
|
168
255
|
# EOF
|
scitex/io/_load_cache.py
ADDED
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2025-07-25 04:40:00"
|
|
4
|
+
# File: _load_cache.py
|
|
5
|
+
|
|
6
|
+
"""
|
|
7
|
+
File load caching infrastructure for scitex.io module.
|
|
8
|
+
Provides intelligent caching with file modification detection.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import os
|
|
12
|
+
import hashlib
|
|
13
|
+
import weakref
|
|
14
|
+
from functools import lru_cache
|
|
15
|
+
from typing import Any, Tuple, Optional, Dict
|
|
16
|
+
from scitex import logging
|
|
17
|
+
|
|
18
|
+
# Cache for file metadata (path -> (mtime, size, hash))
|
|
19
|
+
_file_metadata_cache: Dict[str, Tuple[float, int, str]] = {}
|
|
20
|
+
|
|
21
|
+
# Weak reference cache for actual data
|
|
22
|
+
_file_data_cache = weakref.WeakValueDictionary()
|
|
23
|
+
|
|
24
|
+
# Cache statistics
|
|
25
|
+
_cache_stats = {
|
|
26
|
+
'hits': 0,
|
|
27
|
+
'misses': 0,
|
|
28
|
+
'evictions': 0
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
# Configuration
|
|
32
|
+
_cache_config = {
|
|
33
|
+
'enabled': True,
|
|
34
|
+
'max_size': 32, # Maximum number of files to track
|
|
35
|
+
'verbose': False
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def get_file_key(file_path: str) -> Tuple[str, float, int]:
|
|
40
|
+
"""
|
|
41
|
+
Get cache key based on file path, modification time, and size.
|
|
42
|
+
|
|
43
|
+
Parameters
|
|
44
|
+
----------
|
|
45
|
+
file_path : str
|
|
46
|
+
Path to the file
|
|
47
|
+
|
|
48
|
+
Returns
|
|
49
|
+
-------
|
|
50
|
+
Tuple[str, float, int]
|
|
51
|
+
Tuple of (absolute_path, mtime, size)
|
|
52
|
+
"""
|
|
53
|
+
abs_path = os.path.abspath(file_path)
|
|
54
|
+
stat = os.stat(abs_path)
|
|
55
|
+
return (abs_path, stat.st_mtime, stat.st_size)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def get_file_hash(file_path: str) -> str:
|
|
59
|
+
"""
|
|
60
|
+
Get a hash based on file metadata.
|
|
61
|
+
|
|
62
|
+
Parameters
|
|
63
|
+
----------
|
|
64
|
+
file_path : str
|
|
65
|
+
Path to the file
|
|
66
|
+
|
|
67
|
+
Returns
|
|
68
|
+
-------
|
|
69
|
+
str
|
|
70
|
+
MD5 hash of file metadata
|
|
71
|
+
"""
|
|
72
|
+
key = get_file_key(file_path)
|
|
73
|
+
hash_input = f"{key[0]}:{key[1]}:{key[2]}"
|
|
74
|
+
return hashlib.md5(hash_input.encode()).hexdigest()
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def is_cache_valid(file_path: str) -> bool:
|
|
78
|
+
"""
|
|
79
|
+
Check if cached data for a file is still valid.
|
|
80
|
+
|
|
81
|
+
Parameters
|
|
82
|
+
----------
|
|
83
|
+
file_path : str
|
|
84
|
+
Path to the file
|
|
85
|
+
|
|
86
|
+
Returns
|
|
87
|
+
-------
|
|
88
|
+
bool
|
|
89
|
+
True if cache is valid, False otherwise
|
|
90
|
+
"""
|
|
91
|
+
abs_path = os.path.abspath(file_path)
|
|
92
|
+
|
|
93
|
+
if abs_path not in _file_metadata_cache:
|
|
94
|
+
return False
|
|
95
|
+
|
|
96
|
+
# Get current file metadata
|
|
97
|
+
try:
|
|
98
|
+
current_key = get_file_key(file_path)
|
|
99
|
+
cached_mtime, cached_size, cached_hash = _file_metadata_cache[abs_path]
|
|
100
|
+
|
|
101
|
+
# Check if file has been modified
|
|
102
|
+
return (current_key[1] == cached_mtime and
|
|
103
|
+
current_key[2] == cached_size)
|
|
104
|
+
except (OSError, KeyError):
|
|
105
|
+
return False
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def get_cached_data(file_path: str) -> Optional[Any]:
|
|
109
|
+
"""
|
|
110
|
+
Retrieve cached data if available and valid.
|
|
111
|
+
|
|
112
|
+
Parameters
|
|
113
|
+
----------
|
|
114
|
+
file_path : str
|
|
115
|
+
Path to the file
|
|
116
|
+
|
|
117
|
+
Returns
|
|
118
|
+
-------
|
|
119
|
+
Optional[Any]
|
|
120
|
+
Cached data if available, None otherwise
|
|
121
|
+
"""
|
|
122
|
+
if not _cache_config['enabled']:
|
|
123
|
+
return None
|
|
124
|
+
|
|
125
|
+
abs_path = os.path.abspath(file_path)
|
|
126
|
+
|
|
127
|
+
# Check if cache is valid
|
|
128
|
+
if not is_cache_valid(file_path):
|
|
129
|
+
_cache_stats['misses'] += 1
|
|
130
|
+
return None
|
|
131
|
+
|
|
132
|
+
# Try to get data from weak reference cache
|
|
133
|
+
if abs_path in _file_data_cache:
|
|
134
|
+
_cache_stats['hits'] += 1
|
|
135
|
+
if _cache_config['verbose']:
|
|
136
|
+
logging.info(f"[Cache HIT] {file_path}")
|
|
137
|
+
return _file_data_cache[abs_path]
|
|
138
|
+
|
|
139
|
+
_cache_stats['misses'] += 1
|
|
140
|
+
return None
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def cache_data(file_path: str, data: Any) -> None:
|
|
144
|
+
"""
|
|
145
|
+
Cache data for a file.
|
|
146
|
+
|
|
147
|
+
Parameters
|
|
148
|
+
----------
|
|
149
|
+
file_path : str
|
|
150
|
+
Path to the file
|
|
151
|
+
data : Any
|
|
152
|
+
Data to cache
|
|
153
|
+
"""
|
|
154
|
+
if not _cache_config['enabled']:
|
|
155
|
+
return
|
|
156
|
+
|
|
157
|
+
abs_path = os.path.abspath(file_path)
|
|
158
|
+
|
|
159
|
+
# Update metadata cache
|
|
160
|
+
key = get_file_key(file_path)
|
|
161
|
+
_file_metadata_cache[abs_path] = (key[1], key[2], get_file_hash(file_path))
|
|
162
|
+
|
|
163
|
+
# Try to cache the data (may fail for non-weakref-able types)
|
|
164
|
+
try:
|
|
165
|
+
# For numpy arrays and other special types, we need to wrap them
|
|
166
|
+
if hasattr(data, '__array__'):
|
|
167
|
+
# Numpy arrays can't be weakly referenced directly
|
|
168
|
+
# We'll skip caching for now (could implement a wrapper)
|
|
169
|
+
pass
|
|
170
|
+
else:
|
|
171
|
+
_file_data_cache[abs_path] = data
|
|
172
|
+
except TypeError:
|
|
173
|
+
# Some objects can't be weakly referenced
|
|
174
|
+
if _cache_config['verbose']:
|
|
175
|
+
logging.debug(f"Cannot cache {type(data).__name__} objects")
|
|
176
|
+
|
|
177
|
+
# Implement cache size limit
|
|
178
|
+
if len(_file_metadata_cache) > _cache_config['max_size']:
|
|
179
|
+
# Remove oldest entries (simple FIFO for metadata)
|
|
180
|
+
oldest = list(_file_metadata_cache.keys())[0]
|
|
181
|
+
del _file_metadata_cache[oldest]
|
|
182
|
+
_cache_stats['evictions'] += 1
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
def clear_cache() -> None:
|
|
186
|
+
"""Clear all cached data."""
|
|
187
|
+
_file_metadata_cache.clear()
|
|
188
|
+
_file_data_cache.clear()
|
|
189
|
+
_numpy_cache_keys.clear()
|
|
190
|
+
_cached_load_npy.cache_clear() # Clear LRU cache
|
|
191
|
+
_cache_stats['hits'] = 0
|
|
192
|
+
_cache_stats['misses'] = 0
|
|
193
|
+
_cache_stats['evictions'] = 0
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
def get_cache_info() -> Dict[str, Any]:
|
|
197
|
+
"""
|
|
198
|
+
Get cache statistics and configuration.
|
|
199
|
+
|
|
200
|
+
Returns
|
|
201
|
+
-------
|
|
202
|
+
Dict[str, Any]
|
|
203
|
+
Cache information including stats and config
|
|
204
|
+
"""
|
|
205
|
+
return {
|
|
206
|
+
'stats': _cache_stats.copy(),
|
|
207
|
+
'config': _cache_config.copy(),
|
|
208
|
+
'metadata_size': len(_file_metadata_cache),
|
|
209
|
+
'data_size': len(_file_data_cache)
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def configure_cache(enabled: Optional[bool] = None,
|
|
214
|
+
max_size: Optional[int] = None,
|
|
215
|
+
verbose: Optional[bool] = None) -> None:
|
|
216
|
+
"""
|
|
217
|
+
Configure cache settings.
|
|
218
|
+
|
|
219
|
+
Parameters
|
|
220
|
+
----------
|
|
221
|
+
enabled : Optional[bool]
|
|
222
|
+
Enable or disable caching
|
|
223
|
+
max_size : Optional[int]
|
|
224
|
+
Maximum number of files to cache
|
|
225
|
+
verbose : Optional[bool]
|
|
226
|
+
Enable verbose logging
|
|
227
|
+
"""
|
|
228
|
+
if enabled is not None:
|
|
229
|
+
_cache_config['enabled'] = enabled
|
|
230
|
+
if max_size is not None:
|
|
231
|
+
_cache_config['max_size'] = max_size
|
|
232
|
+
if verbose is not None:
|
|
233
|
+
_cache_config['verbose'] = verbose
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
# Track numpy cache separately
|
|
237
|
+
_numpy_cache_keys = set()
|
|
238
|
+
|
|
239
|
+
# Specialized cache for numpy arrays (using LRU cache)
|
|
240
|
+
@lru_cache(maxsize=16)
|
|
241
|
+
def _cached_load_npy(file_key: Tuple[str, float, int]) -> Any:
|
|
242
|
+
"""
|
|
243
|
+
Cached numpy loader using LRU cache.
|
|
244
|
+
|
|
245
|
+
Parameters
|
|
246
|
+
----------
|
|
247
|
+
file_key : Tuple[str, float, int]
|
|
248
|
+
Cache key (path, mtime, size)
|
|
249
|
+
|
|
250
|
+
Returns
|
|
251
|
+
-------
|
|
252
|
+
Any
|
|
253
|
+
Loaded numpy array
|
|
254
|
+
"""
|
|
255
|
+
file_path = file_key[0]
|
|
256
|
+
# Import here to avoid circular imports
|
|
257
|
+
from ._load_modules._numpy import _load_npy
|
|
258
|
+
result = _load_npy(file_path)
|
|
259
|
+
|
|
260
|
+
# Track that we've cached this key
|
|
261
|
+
_numpy_cache_keys.add(file_key)
|
|
262
|
+
|
|
263
|
+
return result
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
def load_npy_cached(file_path: str, **kwargs) -> Any:
|
|
267
|
+
"""
|
|
268
|
+
Load numpy file with caching.
|
|
269
|
+
|
|
270
|
+
Parameters
|
|
271
|
+
----------
|
|
272
|
+
file_path : str
|
|
273
|
+
Path to numpy file
|
|
274
|
+
**kwargs
|
|
275
|
+
Additional arguments for numpy.load
|
|
276
|
+
|
|
277
|
+
Returns
|
|
278
|
+
-------
|
|
279
|
+
Any
|
|
280
|
+
Loaded numpy array
|
|
281
|
+
"""
|
|
282
|
+
if not _cache_config['enabled']:
|
|
283
|
+
from ._load_modules._numpy import _load_npy
|
|
284
|
+
return _load_npy(file_path, **kwargs)
|
|
285
|
+
|
|
286
|
+
# Check if we have a cache hit
|
|
287
|
+
file_key = get_file_key(file_path)
|
|
288
|
+
|
|
289
|
+
# Check if this key is already cached
|
|
290
|
+
if file_key in _numpy_cache_keys:
|
|
291
|
+
_cache_stats['hits'] += 1
|
|
292
|
+
if _cache_config['verbose']:
|
|
293
|
+
print(f"[Cache HIT] Loaded from cache: {file_path}")
|
|
294
|
+
else:
|
|
295
|
+
_cache_stats['misses'] += 1
|
|
296
|
+
if _cache_config['verbose']:
|
|
297
|
+
print(f"[Cache MISS] Loading from disk: {file_path}")
|
|
298
|
+
|
|
299
|
+
# Use LRU cache for numpy files
|
|
300
|
+
return _cached_load_npy(file_key)
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
# EOF
|
scitex/io/_load_configs.py
CHANGED
|
@@ -1,27 +1,31 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
# -*- coding: utf-8 -*-
|
|
3
|
-
# Timestamp: "2025-
|
|
4
|
-
# File: /
|
|
3
|
+
# Timestamp: "2025-10-11 23:54:07 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/io/_load_configs.py
|
|
5
5
|
# ----------------------------------------
|
|
6
|
+
from __future__ import annotations
|
|
6
7
|
import os
|
|
7
|
-
|
|
8
|
-
|
|
8
|
+
__FILE__ = (
|
|
9
|
+
"./src/scitex/io/_load_configs.py"
|
|
10
|
+
)
|
|
9
11
|
__DIR__ = os.path.dirname(__FILE__)
|
|
10
12
|
# ----------------------------------------
|
|
11
13
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
# -*- coding: utf-8 -*-
|
|
15
|
-
# Time-stamp: "2025-02-27 11:09:00 (ywatanabe)"
|
|
16
|
-
# File: ./scitex_repo/src/scitex/io/_load_configs.py
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
from typing import Optional, Union
|
|
17
16
|
|
|
18
17
|
from ..dict import DotDict
|
|
19
|
-
from ._load import load
|
|
20
18
|
from ._glob import glob
|
|
19
|
+
from ._load import load
|
|
21
20
|
|
|
22
21
|
|
|
23
|
-
def load_configs(
|
|
24
|
-
|
|
22
|
+
def load_configs(
|
|
23
|
+
IS_DEBUG=None,
|
|
24
|
+
show=False,
|
|
25
|
+
verbose=False,
|
|
26
|
+
config_dir: Optional[Union[str, Path]] = None,
|
|
27
|
+
):
|
|
28
|
+
"""Load YAML configuration files from specified directory.
|
|
25
29
|
|
|
26
30
|
Parameters
|
|
27
31
|
----------
|
|
@@ -31,6 +35,9 @@ def load_configs(IS_DEBUG=None, show=False, verbose=False):
|
|
|
31
35
|
Show configuration changes
|
|
32
36
|
verbose : bool
|
|
33
37
|
Print detailed information
|
|
38
|
+
config_dir : Union[str, Path], optional
|
|
39
|
+
Directory containing configuration files. Can be a string or pathlib.Path object.
|
|
40
|
+
Defaults to "./config" if None
|
|
34
41
|
|
|
35
42
|
Returns
|
|
36
43
|
-------
|
|
@@ -54,22 +61,40 @@ def load_configs(IS_DEBUG=None, show=False, verbose=False):
|
|
|
54
61
|
return config
|
|
55
62
|
|
|
56
63
|
try:
|
|
64
|
+
# Handle config directory parameter
|
|
65
|
+
if config_dir is None:
|
|
66
|
+
config_dir = "./config"
|
|
67
|
+
elif isinstance(config_dir, Path):
|
|
68
|
+
config_dir = str(config_dir)
|
|
69
|
+
|
|
57
70
|
# Set debug mode
|
|
71
|
+
debug_config_path = f"{config_dir}/IS_DEBUG.yaml"
|
|
58
72
|
IS_DEBUG = (
|
|
59
73
|
IS_DEBUG
|
|
60
74
|
or os.getenv("CI") == "True"
|
|
61
75
|
or (
|
|
62
|
-
os.path.exists(
|
|
63
|
-
and load(
|
|
76
|
+
os.path.exists(debug_config_path)
|
|
77
|
+
and load(debug_config_path).get("IS_DEBUG")
|
|
64
78
|
)
|
|
65
79
|
)
|
|
66
80
|
|
|
67
81
|
# Load and merge configs
|
|
68
82
|
CONFIGS = {}
|
|
69
|
-
|
|
83
|
+
|
|
84
|
+
# Load from main config directory
|
|
85
|
+
config_pattern = f"{config_dir}/*.yaml"
|
|
86
|
+
for lpath in glob(config_pattern):
|
|
70
87
|
if config := load(lpath):
|
|
71
88
|
CONFIGS.update(apply_debug_values(config, IS_DEBUG))
|
|
72
89
|
|
|
90
|
+
# Load from categories subdirectory if it exists
|
|
91
|
+
categories_dir = f"{config_dir}/categories"
|
|
92
|
+
if os.path.exists(categories_dir):
|
|
93
|
+
categories_pattern = f"{categories_dir}/*.yaml"
|
|
94
|
+
for lpath in glob(categories_pattern):
|
|
95
|
+
if config := load(lpath):
|
|
96
|
+
CONFIGS.update(apply_debug_values(config, IS_DEBUG))
|
|
97
|
+
|
|
73
98
|
return DotDict(CONFIGS)
|
|
74
99
|
|
|
75
100
|
except Exception as e:
|