#! /usr/bin/env python3
#
# Copyright 2018 California Institute of Technology
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# ISOFIT: Imaging Spectrometer Optimal FITting
# Author: Philip G. Brodrick, philip.brodrick@jpl.nasa.gov
import os
from typing import Dict, List, Type
from isofit.configs.base_config import BaseConfigSection
from isofit.configs.sections.inversion_config import InversionConfig
[docs]
class ImplementationConfig(BaseConfigSection):
def __init__(self, sub_configdic: dict = None):
"""
Input file(s) configuration.
"""
self._mode_type = str
self.mode = "inversion"
"""
str: Defines the operating mode for isofit. Current options are: inversion, inversion_mcmc,
and 'simulation'.
"""
self._inversion_type = InversionConfig
self.inversion: InversionConfig = None
"""InversionConfig: optional config for running in inversion mode."""
self._n_cores_type = int
self.n_cores = None
"""int: number of cores to use."""
self._task_inflation_factor_type = int
self.task_inflation_factor = 10
"""int: Submit task_inflation_factor*n_cores number of tasks."""
self._ip_head_type = str
self.ip_head = None
"""str: Ray - parameter. IP-head (for multi-node runs)."""
self._redis_password_type = str
self.redis_password = None
"""str: Ray - parameter. Redis-password (for multi-node runs)."""
self._ray_include_dashboard_type = bool
self.ray_include_dashboard = False
"""str: Ray - parameter. Boolean to include dashboard."""
self._rte_configure_and_exit_type = bool
self.rte_configure_and_exit = False
"""bool: Indicates that code should terminate as soon as all radiative transfer engine configuration files are
written (without running them)"""
self._rte_auto_rebuild_type = bool
self.rte_auto_rebuild = True
"""bool: Flag indicating whether radiative transfer engines should automatically rebuild."""
self._ray_temp_dir_type = str
self.ray_temp_dir = "/tmp/ray"
"""str: Overrides the standard ray temporary directory. Useful for multiuser systems."""
self._ray_ignore_reinit_error_type = bool
self.ray_ignore_reinit_error = True
"""bool: Boolean to tell ray to ignore re-initilaization. Can be convenient for multiple Isofit instances."""
self._io_buffer_size_type = int
self.io_buffer_size = 100
"""bool: Integer indicating how large (how many spectra) of chunks to read/process/write. A
buffer size of 1 means pixels are processed independently. Large buffers can help prevent IO choke points,
especially if the """
self._max_hash_table_size_type = int
self.max_hash_table_size = 50
"""int: The maximum size of inversion hash tables. Can provide speedups with redundant surfaces, but comes
with increased memory costs.
"""
self._debug_mode_type = bool
self.debug_mode = False
"""bool: A flag to run the code in debug mode, which circumvents ray.
"""
self.set_config_options(sub_configdic)
def _check_config_validity(self) -> List[str]:
errors = list()
valid_implementation_modes = ["inversion", "mcmc_inversion", "simulation"]
if self.mode not in valid_implementation_modes:
errors.append(
"Invalid implementation mode: {}. Valid options are: {}".format(
self.mode, valid_implementation_modes
)
)
if self.mode != "simulation" and self.inversion is None:
errors.append(
"If running outside of simulation mode, Inversion must be defined"
)
elif self.mode == "simulation" and self.inversion is None:
# TODO: fix this
errors.append(
"Even in simulation mode, and inversion config must be defined, though"
"it may be blank."
)
if int(self.ip_head is not None) + int(self.redis_password is not None) == 1:
errors.append(
"If either ip_head or redis_password are specified, both must be"
" specified"
)
return errors