def get_stencil_class_name(cls, stencil_id): components = stencil_id.qualified_name.split(".") class_name = "{name}__{backend}_{id}".format(name=components[-1], backend=gt_utils.slugify( cls.name), id=stencil_id.version) return class_name
def _test_generation(cls, test, externals_dict): """Test source code generation for all *backends* and *stencil suites*. The generated implementations are cached in a :class:`utils.ImplementationsDB` instance, to avoid duplication of (potentially expensive) compilations. """ backend_slug = gt_utils.slugify(test["backend"], valid_symbols="") implementation = gtscript.stencil( backend=test["backend"], definition=test["definition"], name=cls.__module__ + f".{test['suite']}_{backend_slug}_{test['test_id']}", rebuild=True, externals=externals_dict, ) for k, v in externals_dict.items(): implementation.constants[k] = v assert isinstance(implementation, StencilObject) assert implementation.backend == test["backend"] # Assert strict equality for Dawn backends if implementation.backend.startswith("dawn"): assert all( field_info.boundary == cls.global_boundaries[name] for name, field_info in implementation.field_info.items() if field_info is not None) else: assert all( field_info.boundary >= cls.global_boundaries[name] for name, field_info in implementation.field_info.items() if field_info is not None) test["implementations"].append(implementation)
def _test_generation(cls, test, externals_dict): """Test source code generation for all *backends* and *stencil suites*. The generated implementations are cached in a :class:`utils.ImplementationsDB` instance, to avoid duplication of (potentially expensive) compilations. """ backend_slug = gt_utils.slugify(test["backend"], valid_symbols="") implementation = gtscript.stencil( backend=test["backend"], definition=test["definition"], name=cls.__module__ + f".{test['suite']}_{backend_slug}_{test['test_id']}", rebuild=True, externals=externals_dict, ) for k, v in externals_dict.items(): implementation.constants[k] = v assert isinstance(implementation, StencilObject) assert implementation.backend == test["backend"] for name, field_info in implementation.field_info.items(): if field_info.access == AccessKind.NONE: continue for i, ax in enumerate("IJK"): assert (ax not in field_info.axes or ax == "K" or field_info.boundary[i] >= cls.global_boundaries[name][i]) test["implementations"].append(implementation)
def backend_root_path(self) -> pathlib.Path: cpython_id = "py{version.major}{version.minor}_{api_version}".format( version=sys.version_info, api_version=sys.api_version ) backend_root = self.root_path / cpython_id / gt_utils.slugify(self.builder.backend.name) if not backend_root.exists(): if not backend_root.parent.exists(): backend_root.parent.mkdir(parents=False) backend_root.mkdir(parents=False) return backend_root
def get_base_path(cls): # Initialize cache folder cache_root = os.path.join( gt_config.cache_settings["root_path"], gt_config.cache_settings["dir_name"] ) if not os.path.exists(cache_root): gt_utils.make_dir(cache_root, is_cache=True) cpython_id = "py{major}{minor}_{api}".format( major=sys.version_info.major, minor=sys.version_info.minor, api=sys.api_version ) base_path = os.path.join(cache_root, cpython_id, gt_utils.slugify(cls.name)) return base_path
def module_postfix(self) -> str: backend_name = gt_utils.slugify(self.builder.backend.name) id_version = self.stencil_id.version return f"__{backend_name}_{id_version}"