Skip to content

Commit 748ef79

Browse files
authored
Merge pull request #291 from bbean23/290-code-feature-improved-loading-times-for-opencsp-package
290 improved loading times for OpenCSP package
2 parents a3a86dd + 0e3c20b commit 748ef79

File tree

13 files changed

+135
-77
lines changed

13 files changed

+135
-77
lines changed

contrib/common/lib/cv/__init__.py

Whitespace-only changes.

contrib/common/lib/cv/annotations/__init__.py

Whitespace-only changes.

contrib/common/lib/cv/spot_analysis/__init__.py

Whitespace-only changes.

contrib/common/lib/cv/spot_analysis/image_processor/__init__.py

Lines changed: 38 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,41 @@
1-
from contrib.common.lib.cv.spot_analysis.image_processor.BackgroundColorSubtractionImageProcessor import (
2-
BackgroundColorSubtractionImageProcessor,
3-
)
4-
from contrib.common.lib.cv.spot_analysis.image_processor.ColorConversionImageProcessor import (
5-
ColorConversionImageProcessor,
6-
)
7-
from contrib.common.lib.cv.spot_analysis.image_processor.CustomSimpleImageProcessor import CustomSimpleImageProcessor
8-
from contrib.common.lib.cv.spot_analysis.image_processor.EnclosedEnergyImageProcessor import (
9-
EnclosedEnergyImageProcessor,
10-
)
11-
from contrib.common.lib.cv.spot_analysis.image_processor.InpaintImageProcessor import InpaintImageProcessor
12-
from contrib.common.lib.cv.spot_analysis.image_processor.MomentsImageProcessor import MomentsImageProcessor
13-
from contrib.common.lib.cv.spot_analysis.image_processor.PowerpointImageProcessor import PowerpointImageProcessor
14-
from contrib.common.lib.cv.spot_analysis.image_processor.SaveToFileImageProcessor import SaveToFileImageProcessor
15-
from contrib.common.lib.cv.spot_analysis.image_processor.SpotWidthImageProcessor import SpotWidthImageProcessor
16-
from contrib.common.lib.cv.spot_analysis.image_processor.StabilizationImageProcessor import StabilizationImageProcessor
17-
from contrib.common.lib.cv.spot_analysis.image_processor.TargetBoardLocatorImageProcessor import (
18-
TargetBoardLocatorImageProcessor,
19-
)
20-
from contrib.common.lib.cv.spot_analysis.image_processor.ViewAnnotationsImageProcessor import (
21-
ViewAnnotationsImageProcessor,
22-
)
23-
from contrib.common.lib.cv.spot_analysis.image_processor.ViewHighlightImageProcessor import ViewHighlightImageProcessor
1+
from typing import TYPE_CHECKING as _TYPE_CHECKING
2+
3+
from opencsp import LazyLoader as _LazyLoader
4+
5+
base_package = "contrib.common.lib.cv.spot_analysis.image_processor."
6+
7+
# fmt: off
8+
BackgroundColorSubtractionImageProcessor = _LazyLoader(base_package + "BackgroundColorSubtractionImageProcessor", "BackgroundColorSubtractionImageProcessor")
9+
ColorConversionImageProcessor = _LazyLoader(base_package + "ColorConversionImageProcessor", "ColorConversionImageProcessor")
10+
CustomSimpleImageProcessor = _LazyLoader(base_package + "CustomSimpleImageProcessor", "CustomSimpleImageProcessor")
11+
EnclosedEnergyImageProcessor = _LazyLoader(base_package + "EnclosedEnergyImageProcessor", "EnclosedEnergyImageProcessor")
12+
InpaintImageProcessor = _LazyLoader(base_package + "InpaintImageProcessor", "InpaintImageProcessor")
13+
MomentsImageProcessor = _LazyLoader(base_package + "MomentsImageProcessor", "MomentsImageProcessor")
14+
PowerpointImageProcessor = _LazyLoader(base_package + "PowerpointImageProcessor", "PowerpointImageProcessor")
15+
SaveToFileImageProcessor = _LazyLoader(base_package + "SaveToFileImageProcessor", "SaveToFileImageProcessor")
16+
SpotWidthImageProcessor = _LazyLoader(base_package + "SpotWidthImageProcessor", "SpotWidthImageProcessor")
17+
StabilizationImageProcessor = _LazyLoader(base_package + "StabilizationImageProcessor", "StabilizationImageProcessor")
18+
TargetBoardLocatorImageProcessor = _LazyLoader(base_package + "TargetBoardLocatorImageProcessor", "TargetBoardLocatorImageProcessor")
19+
ViewAnnotationsImageProcessor = _LazyLoader(base_package + "ViewAnnotationsImageProcessor", "ViewAnnotationsImageProcessor")
20+
ViewHighlightImageProcessor = _LazyLoader(base_package + "ViewHighlightImageProcessor", "ViewHighlightImageProcessor")
21+
# fmt: on
22+
23+
if _TYPE_CHECKING:
24+
# fmt: off
25+
from contrib.common.lib.cv.spot_analysis.image_processor.BackgroundColorSubtractionImageProcessor import BackgroundColorSubtractionImageProcessor
26+
from contrib.common.lib.cv.spot_analysis.image_processor.ColorConversionImageProcessor import ColorConversionImageProcessor
27+
from contrib.common.lib.cv.spot_analysis.image_processor.CustomSimpleImageProcessor import CustomSimpleImageProcessor
28+
from contrib.common.lib.cv.spot_analysis.image_processor.EnclosedEnergyImageProcessor import EnclosedEnergyImageProcessor
29+
from contrib.common.lib.cv.spot_analysis.image_processor.InpaintImageProcessor import InpaintImageProcessor
30+
from contrib.common.lib.cv.spot_analysis.image_processor.MomentsImageProcessor import MomentsImageProcessor
31+
from contrib.common.lib.cv.spot_analysis.image_processor.PowerpointImageProcessor import PowerpointImageProcessor
32+
from contrib.common.lib.cv.spot_analysis.image_processor.SaveToFileImageProcessor import SaveToFileImageProcessor
33+
from contrib.common.lib.cv.spot_analysis.image_processor.SpotWidthImageProcessor import SpotWidthImageProcessor
34+
from contrib.common.lib.cv.spot_analysis.image_processor.StabilizationImageProcessor import StabilizationImageProcessor
35+
from contrib.common.lib.cv.spot_analysis.image_processor.TargetBoardLocatorImageProcessor import TargetBoardLocatorImageProcessor
36+
from contrib.common.lib.cv.spot_analysis.image_processor.ViewAnnotationsImageProcessor import ViewAnnotationsImageProcessor
37+
from contrib.common.lib.cv.spot_analysis.image_processor.ViewHighlightImageProcessor import ViewHighlightImageProcessor
38+
# fmt: on
2439

2540
# Make these classes available when importing cv.spot_analysis.image_processor.*
2641
__all__ = [

contrib/common/lib/geometry/__init__.py

Whitespace-only changes.

opencsp/__init__.py

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,14 @@
1313
OpenCSP uses the pytest library.
1414
"""
1515

16+
import argparse
1617
import configparser
17-
import os
1818
import copy
19+
import importlib
20+
import os
21+
import platform
1922
import shutil
2023
import sys
21-
import argparse
22-
import platform
2324

2425

2526
_ENV_VAR_SETTINGS_DIRS = "OPENCSP_SETTINGS_DIRS"
@@ -28,6 +29,36 @@
2829
OPENCSP_SETTINGS_FILE_NAME_EXT = "opencsp_settings.ini"
2930

3031

32+
class LazyLoader:
33+
"""
34+
The class provides a LazyLoader for delayed importing of modules.
35+
It allows for lazy loading of modules until they are actually needed,
36+
which can help improve performance by reducing load times in most cases.
37+
"""
38+
39+
# written by chatgpt
40+
def __init__(self, module_name, class_name):
41+
self.module_name = module_name
42+
self.class_name = class_name
43+
self.module = None
44+
self.class_instance = None
45+
46+
def _load(self):
47+
if self.module is None:
48+
self.module = importlib.import_module(self.module_name)
49+
if self.class_instance is None:
50+
self.class_instance = getattr(self.module, self.class_name)
51+
return self.class_instance
52+
53+
def __call__(self, *args, **kwargs):
54+
# Return an instance of the class when called
55+
return self._load()(*args, **kwargs)
56+
57+
def __getattr__(self, name):
58+
# Delegate attribute access to the class instance
59+
return getattr(self._load(), name)
60+
61+
3162
if platform.system() == 'Darwin':
3263
# On Mac, force matplotlib to use the TkAgg.
3364
# Maybe we consider doing this for all systems?

opencsp/common/lib/cv/spot_analysis/image_processor/AbstractSpotAnalysisImageProcessor.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,3 +309,16 @@ def __len__(self) -> int:
309309
#
310310
# This will return 0 immediately after being created.
311311
return self._num_images_processed
312+
313+
314+
class DoNothingImageProcessor(AbstractSpotAnalysisImageProcessor):
315+
def _execute(self, operable: SpotAnalysisOperable, is_last: bool) -> list[SpotAnalysisOperable]:
316+
return [operable]
317+
318+
319+
class SetOnesImageProcessor(AbstractSpotAnalysisImageProcessor):
320+
def _execute(self, operable: SpotAnalysisOperable, is_last: bool) -> list[SpotAnalysisOperable]:
321+
img = copy.copy(operable.primary_image.nparray)
322+
img[:, :] = 1
323+
ret = dataclasses.replace(operable, primary_image=img)
324+
return [ret]

opencsp/common/lib/cv/spot_analysis/image_processor/__init__.py

Lines changed: 46 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,49 @@
1-
from opencsp.common.lib.cv.spot_analysis.image_processor.AbstractAggregateImageProcessor import (
2-
AbstractAggregateImageProcessor,
3-
)
4-
from opencsp.common.lib.cv.spot_analysis.image_processor.AbstractSpotAnalysisImageProcessor import (
5-
AbstractSpotAnalysisImageProcessor,
6-
)
7-
from opencsp.common.lib.cv.spot_analysis.image_processor.AbstractVisualizationImageProcessor import (
8-
AbstractVisualizationImageProcessor,
9-
)
10-
from opencsp.common.lib.cv.spot_analysis.image_processor.AverageByGroupImageProcessor import (
11-
AverageByGroupImageProcessor,
12-
)
13-
from opencsp.common.lib.cv.spot_analysis.image_processor.BcsLocatorImageProcessor import BcsLocatorImageProcessor
14-
from opencsp.common.lib.cv.spot_analysis.image_processor.ConvolutionImageProcessor import ConvolutionImageProcessor
15-
from opencsp.common.lib.cv.spot_analysis.image_processor.CroppingImageProcessor import CroppingImageProcessor
16-
from opencsp.common.lib.cv.spot_analysis.image_processor.EchoImageProcessor import EchoImageProcessor
17-
from opencsp.common.lib.cv.spot_analysis.image_processor.ExposureDetectionImageProcessor import (
18-
ExposureDetectionImageProcessor,
19-
)
20-
from opencsp.common.lib.cv.spot_analysis.image_processor.ViewFalseColorImageProcessor import (
21-
ViewFalseColorImageProcessor,
22-
)
23-
from opencsp.common.lib.cv.spot_analysis.image_processor.HotspotImageProcessor import HotspotImageProcessor
24-
from opencsp.common.lib.cv.spot_analysis.image_processor.LogScaleImageProcessor import LogScaleImageProcessor
25-
from opencsp.common.lib.cv.spot_analysis.image_processor.NullImageSubtractionImageProcessor import (
26-
NullImageSubtractionImageProcessor,
27-
)
28-
from opencsp.common.lib.cv.spot_analysis.image_processor.PopulationStatisticsImageProcessor import (
29-
PopulationStatisticsImageProcessor,
30-
)
31-
from opencsp.common.lib.cv.spot_analysis.image_processor.SupportingImagesCollectorImageProcessor import (
32-
SupportingImagesCollectorImageProcessor,
33-
)
34-
from opencsp.common.lib.cv.spot_analysis.image_processor.View3dImageProcessor import View3dImageProcessor
35-
from opencsp.common.lib.cv.spot_analysis.image_processor.ViewCrossSectionImageProcessor import (
36-
ViewCrossSectionImageProcessor,
37-
)
1+
from typing import TYPE_CHECKING as _TYPE_CHECKING
2+
3+
from opencsp import LazyLoader as _LazyLoader
4+
5+
base_package = "opencsp.common.lib.cv.spot_analysis.image_processor."
6+
7+
# fmt: off
8+
AbstractAggregateImageProcessor = _LazyLoader(base_package + "AbstractAggregateImageProcessor", "AbstractAggregateImageProcessor")
9+
AbstractSpotAnalysisImageProcessor = _LazyLoader(base_package + "AbstractSpotAnalysisImageProcessor", "AbstractSpotAnalysisImageProcessor")
10+
AbstractVisualizationImageProcessor = _LazyLoader(base_package + "AbstractVisualizationImageProcessor", "AbstractVisualizationImageProcessor")
11+
AverageByGroupImageProcessor = _LazyLoader(base_package + "AverageByGroupImageProcessor", "AverageByGroupImageProcessor")
12+
BcsLocatorImageProcessor = _LazyLoader(base_package + "BcsLocatorImageProcessor", "BcsLocatorImageProcessor")
13+
ConvolutionImageProcessor = _LazyLoader(base_package + "ConvolutionImageProcessor", "ConvolutionImageProcessor")
14+
CroppingImageProcessor = _LazyLoader(base_package + "CroppingImageProcessor", "CroppingImageProcessor")
15+
EchoImageProcessor = _LazyLoader(base_package + "EchoImageProcessor", "EchoImageProcessor")
16+
ExposureDetectionImageProcessor = _LazyLoader(base_package + "ExposureDetectionImageProcessor", "ExposureDetectionImageProcessor")
17+
ViewFalseColorImageProcessor = _LazyLoader(base_package + "ViewFalseColorImageProcessor", "ViewFalseColorImageProcessor")
18+
HotspotImageProcessor = _LazyLoader(base_package + "HotspotImageProcessor", "HotspotImageProcessor")
19+
LogScaleImageProcessor = _LazyLoader(base_package + "LogScaleImageProcessor", "LogScaleImageProcessor")
20+
NullImageSubtractionImageProcessor = _LazyLoader(base_package + "NullImageSubtractionImageProcessor", "NullImageSubtractionImageProcessor")
21+
PopulationStatisticsImageProcessor = _LazyLoader(base_package + "PopulationStatisticsImageProcessor", "PopulationStatisticsImageProcessor")
22+
SupportingImagesCollectorImageProcessor = _LazyLoader(base_package + "SupportingImagesCollectorImageProcessor", "SupportingImagesCollectorImageProcessor")
23+
View3dImageProcessor = _LazyLoader(base_package + "View3dImageProcessor", "View3dImageProcessor")
24+
ViewCrossSectionImageProcessor = _LazyLoader(base_package + "ViewCrossSectionImageProcessor", "ViewCrossSectionImageProcessor")
25+
# fmt: on
26+
27+
if _TYPE_CHECKING:
28+
# fmt: off
29+
from opencsp.common.lib.cv.spot_analysis.image_processor.AbstractAggregateImageProcessor import AbstractAggregateImageProcessor
30+
from opencsp.common.lib.cv.spot_analysis.image_processor.AbstractSpotAnalysisImageProcessor import AbstractSpotAnalysisImageProcessor
31+
from opencsp.common.lib.cv.spot_analysis.image_processor.AbstractVisualizationImageProcessor import AbstractVisualizationImageProcessor
32+
from opencsp.common.lib.cv.spot_analysis.image_processor.AverageByGroupImageProcessor import AverageByGroupImageProcessor
33+
from opencsp.common.lib.cv.spot_analysis.image_processor.BcsLocatorImageProcessor import BcsLocatorImageProcessor
34+
from opencsp.common.lib.cv.spot_analysis.image_processor.ConvolutionImageProcessor import ConvolutionImageProcessor
35+
from opencsp.common.lib.cv.spot_analysis.image_processor.CroppingImageProcessor import CroppingImageProcessor
36+
from opencsp.common.lib.cv.spot_analysis.image_processor.EchoImageProcessor import EchoImageProcessor
37+
from opencsp.common.lib.cv.spot_analysis.image_processor.ExposureDetectionImageProcessor import ExposureDetectionImageProcessor
38+
from opencsp.common.lib.cv.spot_analysis.image_processor.ViewFalseColorImageProcessor import ViewFalseColorImageProcessor
39+
from opencsp.common.lib.cv.spot_analysis.image_processor.HotspotImageProcessor import HotspotImageProcessor
40+
from opencsp.common.lib.cv.spot_analysis.image_processor.LogScaleImageProcessor import LogScaleImageProcessor
41+
from opencsp.common.lib.cv.spot_analysis.image_processor.NullImageSubtractionImageProcessor import NullImageSubtractionImageProcessor
42+
from opencsp.common.lib.cv.spot_analysis.image_processor.PopulationStatisticsImageProcessor import PopulationStatisticsImageProcessor
43+
from opencsp.common.lib.cv.spot_analysis.image_processor.SupportingImagesCollectorImageProcessor import SupportingImagesCollectorImageProcessor
44+
from opencsp.common.lib.cv.spot_analysis.image_processor.View3dImageProcessor import View3dImageProcessor
45+
from opencsp.common.lib.cv.spot_analysis.image_processor.ViewCrossSectionImageProcessor import ViewCrossSectionImageProcessor
46+
# fmt: on
3847

3948
# Make these classes available when importing cv.spot_analysis.image_processor.*
4049
__all__ = [

opencsp/common/lib/cv/spot_analysis/image_processor/test/test_AbstractSpotAnalysisImageProcessor.py

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,13 @@
66
import numpy as np
77

88
import opencsp.common.lib.cv.CacheableImage as ci
9-
from opencsp.common.lib.cv.spot_analysis.image_processor import AbstractSpotAnalysisImageProcessor
109
import opencsp.common.lib.cv.spot_analysis.SpotAnalysisOperable as sao
1110
import opencsp.common.lib.tool.file_tools as ft
1211
import opencsp.common.lib.tool.log_tools as lt
13-
14-
15-
class DoNothingImageProcessor(AbstractSpotAnalysisImageProcessor):
16-
def _execute(self, operable: sao.SpotAnalysisOperable, is_last: bool) -> list[sao.SpotAnalysisOperable]:
17-
return [operable]
18-
19-
20-
class SetOnesImageProcessor(AbstractSpotAnalysisImageProcessor):
21-
def _execute(self, operable: sao.SpotAnalysisOperable, is_last: bool) -> list[sao.SpotAnalysisOperable]:
22-
img = copy.copy(operable.primary_image.nparray)
23-
img[:, :] = 1
24-
ret = dataclasses.replace(operable, primary_image=img)
25-
return [ret]
12+
from opencsp.common.lib.cv.spot_analysis.image_processor.AbstractSpotAnalysisImageProcessor import (
13+
DoNothingImageProcessor,
14+
SetOnesImageProcessor,
15+
)
2616

2717

2818
class test_AbstractSpotAnalysisImageProcessor(unittest.TestCase):

opencsp/common/lib/deflectometry/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)