Best Python code snippet using playwright-python
_low_level.py
Source:_low_level.py  
1# Copyright (C) 2015 Simon Biggs2# This program is free software: you can redistribute it and/or modify3# it under the terms of the GNU Affero General Public License as published4# by the Free Software Foundation, either version 3 of the License, or5# (at your option) any later version (the "AGPL-3.0+").6# This program is distributed in the hope that it will be useful,7# but WITHOUT ANY WARRANTY; without even the implied warranty of8# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the9# GNU Affero General Public License and the additional terms for more10# details.11# You should have received a copy of the GNU Affero General Public License12# along with this program. If not, see <http://www.gnu.org/licenses/>.13# ADDITIONAL TERMS are also included as allowed by Section 7 of the GNU14# Affrero General Public License. These aditional terms are Sections 1, 5,15# 6, 7, 8, and 9 from the Apache License, Version 2.0 (the "Apache-2.0")16# where all references to the definition "License" are instead defined to17# mean the AGPL-3.0+.18# You should have received a copy of the Apache-2.0 along with this19# program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.20"""Compare two dose grids with the gamma index.21This module is a python implementation of the gamma index.22It computes 1, 2, or 3 dimensional gamma with arbitrary gird sizes while23interpolating on the fly.24This module makes use of some of the ideas presented within25<http://dx.doi.org/10.1118/1.2721657>.26It needs to be noted that this code base has not yet undergone sufficient27independent validation.28"""29import numpy as np30from scipy.interpolate import RegularGridInterpolator31from multiprocessing import Process, Queue32def _run_input_checks(33        coords_reference, dose_reference,34        coords_evaluation, dose_evaluation):35    """Check user inputs."""36    if (37            not isinstance(coords_evaluation, tuple) or38            not isinstance(coords_reference, tuple)):39        if (40                isinstance(coords_evaluation, np.ndarray) and41                isinstance(coords_reference, np.ndarray)):42            if (43                    len(np.shape(coords_evaluation)) == 1 and44                    len(np.shape(coords_reference)) == 1):45                coords_evaluation = (coords_evaluation,)46                coords_reference = (coords_reference,)47            else:48                raise Exception(49                    "Can only use numpy arrays as input for one dimensional "50                    "gamma."51                    )52        else:53            raise Exception(54                "Input coordinates must be inputted as a tuple, for "55                "one dimension input is (x,), for two dimensions, (x, y),  "56                "for three dimensions input is (x, y, z).")57    reference_coords_shape = tuple([len(item) for item in coords_reference])58    if reference_coords_shape != np.shape(dose_reference):59        raise Exception(60            "Length of items in coords_reference does not match the shape of "61            "dose_reference")62    evaluation_coords_shape = tuple([len(item) for item in coords_evaluation])63    if evaluation_coords_shape != np.shape(dose_evaluation):64        raise Exception(65            "Length of items in coords_evaluation does not match the shape of "66            "dose_evaluation")67    if not (len(np.shape(dose_evaluation)) ==68            len(np.shape(dose_reference)) ==69            len(coords_evaluation) ==70            len(coords_reference)):71        raise Exception(72            "The dimensions of the input data do not match")73    return coords_reference, coords_evaluation74def _calculate_coordinates_kernel(75        distance, num_dimensions, distance_step_size):76    """Determine the coodinate shifts required.77    Coordinate shifts are determined to check the reference dose for a78    given distance, dimension, and step size79    """80    if num_dimensions == 1:81        if distance == 0:82            x_coords = np.array([0])83        else:84            x_coords = np.array([distance, -distance])85        return (x_coords,)86    elif num_dimensions == 2:87        amount_to_check = np.floor(88            2 * np.pi * distance / distance_step_size) + 289        theta = np.linspace(0, 2*np.pi, amount_to_check + 1)[:-1:]90        x_coords = distance * np.cos(theta)91        y_coords = distance * np.sin(theta)92        return (x_coords, y_coords)93    elif num_dimensions == 3:94        number_of_rows = np.floor(95            np.pi * distance / distance_step_size) + 296        elevation = np.linspace(0, np.pi, number_of_rows)97        row_radii = distance * np.sin(elevation)98        row_circumference = 2 * np.pi * row_radii99        amount_in_row = np.floor(100            row_circumference / distance_step_size) + 2101        x_coords = []102        y_coords = []103        z_coords = []104        for i, phi in enumerate(elevation):105            azimuth = np.linspace(0, 2*np.pi, amount_in_row[i] + 1)[:-1:]106            x_coords.append(distance * np.sin(phi) * np.cos(azimuth))107            y_coords.append(distance * np.sin(phi) * np.sin(azimuth))108            z_coords.append(distance * np.cos(phi) * np.ones_like(azimuth))109        return (110            np.hstack(x_coords), np.hstack(y_coords), np.hstack(z_coords))111    else:112        raise Exception("No valid dimension")113def _calculate_min_dose_difference(114        num_dimensions, mesh_coords_evaluation, to_be_checked,115        reference_interpolation, dose_evaluation,116        coordinates_at_distance_kernel):117    """Determine the minimum dose difference.118    Calculated for a given distance from each evaluation point.119    """120    coordinates_at_distance = []121    for i in range(num_dimensions):122        coordinates_at_distance.append(np.array(123            mesh_coords_evaluation[i][to_be_checked][None, :] +124            coordinates_at_distance_kernel[i][:, None])[:, :, None])125    all_points = np.concatenate(coordinates_at_distance, axis=2)126    dose_difference = np.array([127        reference_interpolation(points) -128        dose_evaluation[to_be_checked] for129        points in all_points130    ])131    min_dose_difference = np.min(np.abs(dose_difference), axis=0)132    return min_dose_difference133def _calculate_min_dose_difference_by_slice(134        max_concurrent_calc_points,135        num_dimensions, mesh_coords_evaluation, to_be_checked,136        reference_interpolation, dose_evaluation,137        coordinates_at_distance_kernel, **kwargs):138    """Determine minimum dose differences.139    Calculation is made with the evaluation set divided into slices. This140    enables less RAM usage.141    """142    all_checks = np.where(to_be_checked)143    min_dose_difference = (np.nan * np.ones_like(all_checks[0]))144    num_slices = np.floor(145        len(coordinates_at_distance_kernel[0]) *146        len(all_checks[0]) / max_concurrent_calc_points) + 1147    index = np.arange(len(all_checks[0]))148    np.random.shuffle(index)149    sliced = np.array_split(index, num_slices)150    for current_slice in sliced:151        current_to_be_checked = np.zeros_like(to_be_checked).astype(bool)152        current_to_be_checked[tuple([153            item[current_slice] for154            item in all_checks])] = True155        assert np.all(to_be_checked[current_to_be_checked])156        min_dose_difference[np.sort(current_slice)] = (157            _calculate_min_dose_difference(158                num_dimensions, mesh_coords_evaluation, current_to_be_checked,159                reference_interpolation, dose_evaluation,160                coordinates_at_distance_kernel))161    assert np.all(np.invert(np.isnan(min_dose_difference)))162    return min_dose_difference163def _calculation_loop(**kwargs):164    """Iteratively calculates gamma at increasing distances."""165    dose_valid = kwargs['dose_evaluation'] >= kwargs['lower_dose_cutoff']166    gamma_valid = np.ones_like(kwargs['dose_evaluation']).astype(bool)167    running_gamma = np.inf * np.ones_like(kwargs['dose_evaluation'])168    if kwargs.get('output_components', False):169        output_components = True170        running_dd = np.inf * np.ones_like(kwargs['dose_evaluation'])171        running_dta = np.inf * np.ones_like(kwargs['dose_evaluation'])172    else:173        output_components = False174    distance = 0175    while True:176        to_be_checked = (177            dose_valid & gamma_valid)178        coordinates_at_distance_kernel = _calculate_coordinates_kernel(179            distance, kwargs['num_dimensions'], kwargs['distance_step_size'])180        min_dose_difference = _calculate_min_dose_difference_by_slice(181            to_be_checked=to_be_checked,182            coordinates_at_distance_kernel=coordinates_at_distance_kernel,183            **kwargs)184        dd_term = min_dose_difference / kwargs['dose_threshold']185        dta_term = distance / kwargs['distance_threshold']186        gamma_at_distance = np.sqrt( dd_term**2 + dta_term**2)187        update_mask = (gamma_at_distance < running_gamma[to_be_checked])188        running_gamma[to_be_checked] = np.where(update_mask, gamma_at_distance, running_gamma[to_be_checked])189        #  running_gamma[to_be_checked] = np.min(190        #      np.vstack((191        #          gamma_at_distance, running_gamma[to_be_checked]192        #      )), axis=0)193        if output_components:194            running_dd[to_be_checked] = np.where(update_mask, dd_term, running_dd[to_be_checked])195            running_dta[to_be_checked] = np.where(update_mask, dta_term, running_dta[to_be_checked])196        gamma_valid = running_gamma > distance / kwargs['distance_threshold']197        distance += kwargs['distance_step_size']198        if (199                (np.sum(to_be_checked) == 0) |200                (distance > kwargs['maximum_test_distance'])):201            break202    if output_components:203        return (running_gamma, running_dd, running_dta)204    else:205        return running_gamma206def _new_thread(kwargs, output, thread_index, gamma_store):207    if kwargs.get('output_components', False):208        dd_store = np.nan*np.ones_like(gamma_store)209        dta_store = np.nan*np.ones_like(gamma_store)210        gamma_store[thread_index], dd_store[thread_index], dta_store[thread_index] = _calculation_loop(**kwargs)211        if output is not None:212            output.put((gamma_store, dd_store, dta_store))213        else:214            return (gamma_store, dd_store, dta_store)215    else:216        gamma_store[thread_index] = _calculation_loop(**kwargs)217        if output is not None:218            output.put(gamma_store)219        else:220            return gamma_store221def calc_gamma(coords_reference, dose_reference,222               coords_evaluation, dose_evaluation,223               distance_threshold, dose_threshold,224               lower_dose_cutoff=0, distance_step_size=None,225               maximum_test_distance=np.inf,226               max_concurrent_calc_points=np.inf,227               num_threads=1, output_components=False):228    """Compare two dose grids with the gamma index.229    Args:230        coords_reference (tuple): The reference coordinates.231        dose_reference (np.array): The reference dose grid.232        coords_evaluation (tuple): The evaluation coordinates.233        dose_evaluation (np.array): The evaluation dose grid.234        distance_threshold (float): The gamma distance threshold. Units must235            match of the coordinates given.236        dose_threshold (float): An absolute dose threshold.237            If you wish to use 3% of maximum reference dose input238            np.max(dose_reference) * 0.03 here.239        lower_dose_cutoff (:obj:`float`, optional): The lower dose cutoff below240            which gamma will not be calculated.241        distance_step_size (:obj:`float`, optional): The step size to use in242            within the reference grid interpolation. Defaults to a tenth of the243            distance threshold as recommended within244            <http://dx.doi.org/10.1118/1.2721657>.245        maximum_test_distance (:obj:`float`, optional): The distance beyond246            which searching will stop. Defaults to np.inf. To speed up247            calculation it is recommended that this parameter is set to248            something reasonable such as 2*distance_threshold249    Returns:250        gamma (np.array): The array of gamma values the same shape as that251            given by the evaluation coordinates and dose.252    """253    #  num_threads = 1 # force single-threading to avoid memory leaks254    coords_reference, coords_evaluation = _run_input_checks(255        coords_reference, dose_reference,256        coords_evaluation, dose_evaluation)257    if distance_step_size is None:258        distance_step_size = distance_threshold / 10259    reference_interpolation = RegularGridInterpolator(260        coords_reference, np.array(dose_reference),261        bounds_error=False, fill_value=np.inf262    )263    dose_evaluation = np.array(dose_evaluation)264    dose_evaluation_flat = np.ravel(dose_evaluation)265    mesh_coords_evaluation = np.meshgrid(*coords_evaluation, indexing='ij')266    coords_evaluation_flat = [267        np.ravel(item)268        for item in mesh_coords_evaluation]269    kwargs = {270        "coords_reference": coords_reference,271        "num_dimensions": len(coords_evaluation),272        "reference_interpolation": reference_interpolation,273        "lower_dose_cutoff": lower_dose_cutoff,274        "distance_threshold": distance_threshold,275        "dose_threshold": dose_threshold,276        "distance_step_size": distance_step_size,277        "max_concurrent_calc_points": max_concurrent_calc_points / num_threads,278        "maximum_test_distance": maximum_test_distance,279        "output_components": output_components}280    gamma_flat = np.nan * np.ones_like(dose_evaluation_flat)281    if output_components:282        dd_flat = np.nan * np.ones_like(dose_evaluation_flat)283        dta_flat = np.nan * np.ones_like(dose_evaluation_flat)284    evaluation_index = np.arange(len(dose_evaluation_flat))285    if num_threads > 1:286        np.random.shuffle(evaluation_index)287        thread_indicies = np.array_split(evaluation_index, num_threads)288        output = Queue()289        processes = []290        for thread_index in thread_indicies:291            thread_index.sort()292            thread_dose_evaluation = dose_evaluation_flat[thread_index]293            thread_coords_evaluation = [294                coords[thread_index]295                for coords in coords_evaluation_flat]296            kwargs['dose_evaluation'] = thread_dose_evaluation297            kwargs['mesh_coords_evaluation'] = thread_coords_evaluation298            p = Process(299                target=_new_thread,300                args=(301                    kwargs, output, thread_index,302                    np.nan * np.ones_like(dose_evaluation_flat)))303            p.start()304            processes.append(p)305        for i in range(num_threads):306            if output_components:307                res_gamma, res_dd, res_dta = output.get()308                thread_reference = np.invert(np.isnan(res_gamma))309                gamma_flat[thread_reference] = res_gamma[thread_reference]310                dd_flat[thread_reference] = res_dd[thread_reference]311                dta_flat[thread_reference] = res_dta[thread_reference]312            else:313                result = output.get()314                thread_reference = np.invert(np.isnan(result))315                gamma_flat[thread_reference] = result[thread_reference]316        for p in processes:317            p.join()318    else:319        kwargs['dose_evaluation'] = dose_evaluation_flat[evaluation_index]320        kwargs['mesh_coords_evaluation'] = [coords[evaluation_index] for coords in coords_evaluation_flat]321        result = _new_thread(kwargs, None, evaluation_index, np.nan*np.ones_like(dose_evaluation_flat))322        if output_components:323            res_gamma, res_dd, res_dta = result324            reference = np.invert(np.isnan(res_gamma))325            gamma_flat[reference] = res_gamma[reference]326            dd_flat[reference] = res_dd[reference]327            dta_flat[reference] = res_dta[reference]328        else:329            reference = np.invert(np.isnan(result))330            gamma_flat[reference] = result[reference]331    assert np.all(np.invert(np.isnan(gamma_flat)))332    #  gamma_flat[np.isinf(gamma_flat)] = np.nan333    gamma = np.reshape(gamma_flat, np.shape(dose_evaluation))334    if output_components:335        dd = np.reshape(dd_flat, np.shape(dose_evaluation))336        dta = np.reshape(dta_flat, np.shape(dose_evaluation))337        return (gamma, dd, dta)338    else:...__init__.py
Source:__init__.py  
1# Copyright (C) 2015 Simon Biggs2# This program is free software: you can redistribute it and/or modify3# it under the terms of the GNU Affero General Public License as published4# by the Free Software Foundation, either version 3 of the License, or5# (at your option) any later version (the "AGPL-3.0+").6# This program is distributed in the hope that it will be useful,7# but WITHOUT ANY WARRANTY; without even the implied warranty of8# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the9# GNU Affero General Public License and the additional terms for more10# details.11# You should have received a copy of the GNU Affero General Public License12# along with this program. If not, see <http://www.gnu.org/licenses/>.13# ADDITIONAL TERMS are also included as allowed by Section 7 of the GNU14# Affrero General Public License. These aditional terms are Sections 1, 5,15# 6, 7, 8, and 9 from the Apache License, Version 2.0 (the "Apache-2.0")16# where all references to the definition "License" are instead defined to17# mean the AGPL-3.0+.18# You should have received a copy of the Apache-2.0 along with this19# program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.20"""[DEPRECATED] Use `pymedphys.gamma` instead. See21https://pymedphys.com/en/latest/user/gamma.html22Compare two dose grids with the gamma index.23This module is a python implementation of the gamma index.24It computes 1, 2, or 3 dimensional gamma with arbitrary gird sizes while25interpolating on the fly.26This module makes use of some of the ideas presented within27<http://dx.doi.org/10.1118/1.2721657>.28It needs to be noted that this code base has not yet undergone sufficient29independent validation.30"""31import numpy as np32from scipy.interpolate import RegularGridInterpolator33from multiprocessing import Process, Queue34import warnings35WARNING_STRING = (36    'The `npgamma` module is deprecated. It contains known bugs. '37    'The bugfixes for these are within the `pymedphys.gamma` module. '38    'See https://pymedphys.com/en/latest/user/gamma.html for how to use '39    'the module that has superseded `npgamma`.'40)41warnings.warn(WARNING_STRING, UserWarning)42def _run_input_checks(43        coords_reference, dose_reference,44        coords_evaluation, dose_evaluation):45    """Check user inputs."""46    if (47            not isinstance(coords_evaluation, tuple) or48            not isinstance(coords_reference, tuple)):49        if (50                isinstance(coords_evaluation, np.ndarray) and51                isinstance(coords_reference, np.ndarray)):52            if (53                    len(np.shape(coords_evaluation)) == 1 and54                    len(np.shape(coords_reference)) == 1):55                coords_evaluation = (coords_evaluation,)56                coords_reference = (coords_reference,)57            else:58                raise Exception(59                    "Can only use numpy arrays as input for one dimensional "60                    "gamma."61                    )62        else:63            raise Exception(64                "Input coordinates must be inputted as a tuple, for "65                "one dimension input is (x,), for two dimensions, (x, y),  "66                "for three dimensions input is (x, y, z).")67    reference_coords_shape = tuple([len(item) for item in coords_reference])68    if reference_coords_shape != np.shape(dose_reference):69        raise Exception(70            "Length of items in coords_reference does not match the shape of "71            "dose_reference")72    evaluation_coords_shape = tuple([len(item) for item in coords_evaluation])73    if evaluation_coords_shape != np.shape(dose_evaluation):74        raise Exception(75            "Length of items in coords_evaluation does not match the shape of "76            "dose_evaluation")77    if not (len(np.shape(dose_evaluation)) ==78            len(np.shape(dose_reference)) ==79            len(coords_evaluation) ==80            len(coords_reference)):81        raise Exception(82            "The dimensions of the input data do not match")83    return coords_reference, coords_evaluation84def _calculate_coordinates_kernel(85        distance, num_dimensions, distance_step_size):86    """Determine the coodinate shifts required.87    Coordinate shifts are determined to check the reference dose for a88    given distance, dimension, and step size89    """90    if num_dimensions == 1:91        if distance == 0:92            x_coords = np.array([0])93        else:94            x_coords = np.array([distance, -distance])95        return (x_coords,)96    elif num_dimensions == 2:97        amount_to_check = np.floor(98            2 * np.pi * distance / distance_step_size) + 299        theta = np.linspace(0, 2*np.pi, amount_to_check + 1)[:-1:]100        x_coords = distance * np.cos(theta)101        y_coords = distance * np.sin(theta)102        return (x_coords, y_coords)103    elif num_dimensions == 3:104        number_of_rows = np.floor(105            np.pi * distance / distance_step_size) + 2106        elevation = np.linspace(0, np.pi, number_of_rows)107        row_radii = distance * np.sin(elevation)108        row_circumference = 2 * np.pi * row_radii109        amount_in_row = np.floor(110            row_circumference / distance_step_size) + 2111        x_coords = []112        y_coords = []113        z_coords = []114        for i, phi in enumerate(elevation):115            azimuth = np.linspace(0, 2*np.pi, amount_in_row[i] + 1)[:-1:]116            x_coords.append(distance * np.sin(phi) * np.cos(azimuth))117            y_coords.append(distance * np.sin(phi) * np.sin(azimuth))118            z_coords.append(distance * np.cos(phi) * np.ones_like(azimuth))119        return (120            np.hstack(x_coords), np.hstack(y_coords), np.hstack(z_coords))121    else:122        raise Exception("No valid dimension")123def _calculate_min_dose_difference(124        num_dimensions, mesh_coords_evaluation, to_be_checked,125        reference_interpolation, dose_evaluation,126        coordinates_at_distance_kernel):127    """Determine the minimum dose difference.128    Calculated for a given distance from each evaluation point.129    """130    coordinates_at_distance = []131    for i in range(num_dimensions):132        coordinates_at_distance.append(np.array(133            mesh_coords_evaluation[i][to_be_checked][None, :] +134            coordinates_at_distance_kernel[i][:, None])[:, :, None])135    all_points = np.concatenate(coordinates_at_distance, axis=2)136    dose_difference = np.array([137        reference_interpolation(points) -138        dose_evaluation[to_be_checked] for139        points in all_points140    ])141    min_dose_difference = np.min(np.abs(dose_difference), axis=0)142    return min_dose_difference143def _calculate_min_dose_difference_by_slice(144        max_concurrent_calc_points,145        num_dimensions, mesh_coords_evaluation, to_be_checked,146        reference_interpolation, dose_evaluation,147        coordinates_at_distance_kernel, **kwargs):148    """Determine minimum dose differences.149    Calculation is made with the evaluation set divided into slices. This150    enables less RAM usage.151    """152    all_checks = np.where(to_be_checked)153    min_dose_difference = (np.nan * np.ones_like(all_checks[0]))154    num_slices = np.floor(155        len(coordinates_at_distance_kernel[0]) *156        len(all_checks[0]) / max_concurrent_calc_points) + 1157    index = np.arange(len(all_checks[0]))158    np.random.shuffle(index)159    sliced = np.array_split(index, num_slices)160    for current_slice in sliced:161        current_to_be_checked = np.zeros_like(to_be_checked).astype(bool)162        current_to_be_checked[[163            item[current_slice] for164            item in all_checks]] = True165        assert np.all(to_be_checked[current_to_be_checked])166        min_dose_difference[np.sort(current_slice)] = (167            _calculate_min_dose_difference(168                num_dimensions, mesh_coords_evaluation, current_to_be_checked,169                reference_interpolation, dose_evaluation,170                coordinates_at_distance_kernel))171    assert np.all(np.invert(np.isnan(min_dose_difference)))172    return min_dose_difference173def _calculation_loop(**kwargs):174    """Iteratively calculates gamma at increasing distances."""175    dose_valid = kwargs['dose_evaluation'] >= kwargs['lower_dose_cutoff']176    gamma_valid = np.ones_like(kwargs['dose_evaluation']).astype(bool)177    running_gamma = np.inf * np.ones_like(kwargs['dose_evaluation'])178    distance = 0179    while True:180        to_be_checked = (181            dose_valid & gamma_valid)182        coordinates_at_distance_kernel = _calculate_coordinates_kernel(183            distance, kwargs['num_dimensions'], kwargs['distance_step_size'])184        min_dose_difference = _calculate_min_dose_difference_by_slice(185            to_be_checked=to_be_checked,186            coordinates_at_distance_kernel=coordinates_at_distance_kernel,187            **kwargs)188        gamma_at_distance = np.sqrt(189            min_dose_difference ** 2 / kwargs['dose_threshold'] ** 2 +190            distance ** 2 / kwargs['distance_threshold'] ** 2)191        running_gamma[to_be_checked] = np.min(192            np.vstack((193                gamma_at_distance, running_gamma[to_be_checked]194            )), axis=0)195        gamma_valid = running_gamma > distance / kwargs['distance_threshold']196        distance += kwargs['distance_step_size']197        if (198                (np.sum(to_be_checked) == 0) |199                (distance > kwargs['maximum_test_distance'])):200            break201    return running_gamma202def _new_thread(kwargs, output, thread_index, gamma_store):203    gamma_store[thread_index] = _calculation_loop(**kwargs)204    output.put(gamma_store)205def calc_gamma(coords_reference, dose_reference,206               coords_evaluation, dose_evaluation,207               distance_threshold, dose_threshold,208               lower_dose_cutoff=0, distance_step_size=None,209               maximum_test_distance=np.inf,210               max_concurrent_calc_points=np.inf,211               num_threads=1):212    """[DEPRECATED] Use `pymedphys.gamma` instead. See213    https://pymedphys.com/en/latest/user/gamma.html214    Compare two dose grids with the gamma index.215    Args:216        coords_reference (tuple): The reference coordinates.217        dose_reference (np.array): The reference dose grid.218        coords_evaluation (tuple): The evaluation coordinates.219        dose_evaluation (np.array): The evaluation dose grid.220        distance_threshold (float): The gamma distance threshold. Units must221            match of the coordinates given.222        dose_threshold (float): An absolute dose threshold.223            If you wish to use 3% of maximum reference dose input224            np.max(dose_reference) * 0.03 here.225        lower_dose_cutoff (:obj:`float`, optional): The lower dose cutoff below226            which gamma will not be calculated.227        distance_step_size (:obj:`float`, optional): The step size to use in228            within the reference grid interpolation. Defaults to a tenth of the229            distance threshold as recommended within230            <http://dx.doi.org/10.1118/1.2721657>.231        maximum_test_distance (:obj:`float`, optional): The distance beyond232            which searching will stop. Defaults to np.inf. To speed up233            calculation it is recommended that this parameter is set to234            something reasonable such as 2*distance_threshold235    Returns:236        gamma (np.array): The array of gamma values the same shape as that237            given by the evaluation coordinates and dose.238    """239    warnings.warn(WARNING_STRING, UserWarning)240    coords_reference, coords_evaluation = _run_input_checks(241        coords_reference, dose_reference,242        coords_evaluation, dose_evaluation)243    if distance_step_size is None:244        distance_step_size = distance_threshold / 10245    reference_interpolation = RegularGridInterpolator(246        coords_reference, np.array(dose_reference),247        bounds_error=False, fill_value=np.inf248    )249    dose_evaluation = np.array(dose_evaluation)250    dose_evaluation_flat = np.ravel(dose_evaluation)251    mesh_coords_evaluation = np.meshgrid(*coords_evaluation, indexing='ij')252    coords_evaluation_flat = [253        np.ravel(item)254        for item in mesh_coords_evaluation]255    evaluation_index = np.arange(len(dose_evaluation_flat))256    np.random.shuffle(evaluation_index)257    thread_indicies = np.array_split(evaluation_index, num_threads)258    output = Queue()259    kwargs = {260        "coords_reference": coords_reference,261        "num_dimensions": len(coords_evaluation),262        "reference_interpolation": reference_interpolation,263        "lower_dose_cutoff": lower_dose_cutoff,264        "distance_threshold": distance_threshold,265        "dose_threshold": dose_threshold,266        "distance_step_size": distance_step_size,267        "max_concurrent_calc_points": max_concurrent_calc_points / num_threads,268        "maximum_test_distance": maximum_test_distance}269    for thread_index in thread_indicies:270        thread_index.sort()271        thread_dose_evaluation = dose_evaluation_flat[thread_index]272        thread_coords_evaluation = [273            coords[thread_index]274            for coords in coords_evaluation_flat]275        kwargs['dose_evaluation'] = thread_dose_evaluation276        kwargs['mesh_coords_evaluation'] = thread_coords_evaluation277        Process(278            target=_new_thread,279            args=(280                kwargs, output, thread_index,281                np.nan * np.ones_like(dose_evaluation_flat))).start()282    gamma_flat = np.nan * np.ones_like(dose_evaluation_flat)283    for i in range(num_threads):284        result = output.get()285        thread_reference = np.invert(np.isnan(result))286        gamma_flat[thread_reference] = result[thread_reference]287    assert np.all(np.invert(np.isnan(gamma_flat)))288    gamma_flat[np.isinf(gamma_flat)] = np.nan289    gamma = np.reshape(gamma_flat, np.shape(dose_evaluation))...infint.py
Source:infint.py  
1# imports2import sys3# Takes number string and creates list with each node of a predetermined length.4def infinite_num_build(digits, node_length):5    number_list = []6    i = 07    node = ''8    for index in digits:9        if i % node_length == 0:10            if node != '':11                number_list.append(node)12            node = ''13        node += index14        i += 115    number_list.append(node)16    return number_list17# Checks for correct inputs based on assignment18def limit_check(to_be_checked, function):19    node = 420    input_length_limit = 4021    output_length_limit = 10022    length_limit = 023    if function == 'node':24        if int(to_be_checked) > node:25            return 'invalid expression'26    else:27        if function == 'input':28            length_limit = input_length_limit29        elif function == 'output':30            length_limit = output_length_limit31        # Length check32        i = 033        while i < len(to_be_checked):34            digit_length = 035            while i < len(to_be_checked) and to_be_checked[i].isdigit():36                digit_length += 137                i += 138                if digit_length > length_limit:39                    return 'invalid expression'40            i += 141        return to_be_checked42# Finds digit at specific index43def infinite_int_digit_index(number, index):44    count = 045    for sublist in number:46        for digit in sublist:47            if count == index:48                return digit49            count += 150# Counts number of digits in infinite int format number51def infinite_int_digit_count(number):52    count = 053    for sublist in number:54        count += len(sublist)55    return count56# Iteratively adds two numbers built from lists.57def add(num1, num2, node_length):58    # Error Checking59    if num1 == 'invalid expression' or num2 == 'invalid expression':60        return 'invalid expression'61    answer = ''62    overflow = 063    num1_length = infinite_int_digit_count(num1)64    num2_length = infinite_int_digit_count(num2)65    add_number_length = max(num1_length, num2_length)66    for i in range(add_number_length):67        if i >= num1_length:68            digit1 = 069        else:70            digit1 = infinite_int_digit_index(num1, num1_length-1-i)71        if i >= num2_length:72            digit2 = 073        else:74            digit2 = infinite_int_digit_index(num2, num2_length-1-i)75        added = int(digit1) + int(digit2) + overflow76        overflow = 077        if added > 9:78            overflow = 179            added -= 1080        answer = str(added) + answer81    if overflow > 0:82        answer = str(overflow) + answer83    answer_infinite_format = infinite_num_build(answer, node_length)84    return answer_infinite_format85# Function to multiply two numbers86def multiply(num1, num2, node_length):87    num1_length = infinite_int_digit_count(num1)88    num2_length = infinite_int_digit_count(num2)89    # Error Checking90    if num1 == 'invalid expression' or num2 == 'invalid expression':91        return 'invalid expression'92    if num1 == ['0'] or num2 == ['0']:93        return ['0']94    answer = infinite_num_build('0', node_length)95    for i in range(num1_length):96        for j in range(num2_length):97            digit1 = infinite_int_digit_index(num1, num1_length-i-1)98            # print('Digit 1: ' + str(digit1))99            digit2 = infinite_int_digit_index(num2, num2_length-j-1)100            # print('To be multiplied: {} * {}'.format(digit1, digit2))101            multiplied = str(int(digit1) * int(digit2)) + (i * '0') + (j * '0')102            # print(multiplied)103            multiplied_infinite_num = infinite_num_build(multiplied, node_length)104            answer = add(answer, multiplied_infinite_num, node_length)105            # print(answer)106    return answer107# Converts nested number list to string for printing108def list_print_to_string(list_to_print):109    answer_string = ''110    for sublist in list_to_print:111        for digit in sublist:112            answer_string += digit113    answer_string = limit_check(answer_string, 'output')114    return answer_string115# To solve nested operations, loosely based on evaluation expression examples on GeekForGeeks116def nested_operations(string_line, node_length):117    try:118        operation_stack = []119        digit_stack = []120        i = 0121        while i < len(string_line):122            operator = ''123            if string_line[i].isalpha():124                while i < len(string_line) and string_line[i].isalpha():125                    operator += string_line[i]126                    i += 1127                if string_line[i] == '(':128                    operation_stack.append(operator)129                    i += 1130            elif string_line[i].isdigit():131                digit = ''132                while i < len(string_line) and string_line[i].isdigit():133                    digit += string_line[i]134                    i += 1135                digit_stack.append(infinite_num_build(digit, node_length))136            elif string_line[i] == ')':137                operation = operation_stack.pop()138                if operation == 'multiply':139                    digit_stack.append(multiply(digit_stack.pop(), digit_stack.pop(), node_length))140                elif operation == 'add':141                    digit_stack.append(add(digit_stack.pop(), digit_stack.pop(), node_length))142                else:143                    return 'invalid expression'144                i += 1145            else:146                i += 1147        if len(digit_stack) != 1:148            return 'invalid expression'149        return limit_check(list_print_to_string(digit_stack.pop()), 'output')150    except:151        return 'invalid expression'152# Main function153# Check argument length154if len(sys.argv) < 2:155    print('Error: Insufficient filename arguments found')156    sys.exit()157arg1 = sys.argv[1]158fileName = ''159nodeLength = ''160# Separate file name from input argument161for ind in range(6, arg1.find(';')):162    fileName += arg1[ind]163# Separate node length from input argument164try:165    for ind in range(arg1.find(';') + 15, len(arg1)):166        nodeLength += arg1[ind]167    nodeLengthInt = int(nodeLength)168    if limit_check(nodeLengthInt, 'node') == 'invalid expression':169        print('Invalid node length')170        sys.exit()171except Exception:172    nodeLengthInt = 3173with open(fileName) as fp:174    for line in fp:175        line = line.rstrip('\n')176        if line != '':...problem_3.py
Source:problem_3.py  
1import argparse2import fileinput3import functools4import logging5from typing import List6# Redefine the print function with flush=True. Needed for interactive problems.7print = functools.partial(print, flush=True)8# Configure logging9logging.basicConfig(10    format='[%(lineno)03d]: %(message)s', level=logging.WARNING)11LOG = logging.getLogger(__name__)12def get_int() -> int:13    """Read an int from file or stdin."""14    string = FILE.readline().strip()15    return int(string)16def get_float() -> float:17    """Read a float from file or stdin."""18    string = FILE.readline().strip()19    return float(string)20def get_ints() -> List[int]:21    """Read multiple ints from file or stdin."""22    string = FILE.readline().strip()23    return [int(s) for s in string.split()]24def get_string() -> str:25    """Read a string from file or stdin."""26    string = FILE.readline().strip()27    return string28def interest_level(floor: dict):29    """Calculate the interest level of the current floor."""30    level = sum(value for value in floor.values())31    return level32def initial_neighbours(floor: dict, rows: int, cols: int) -> dict:33    """Find all the inital neighbours."""34    all_neighbours = dict()35    for row in range(rows):36        for col in range(cols):37            cell_neigbours = dict()38            if col > 0:39                cell_neigbours["W"] = (row, col - 1)40            if col + 1 < cols:41                cell_neigbours["E"] = (row, col + 1)42            if row > 0:43                cell_neigbours["N"] = (row - 1, col)44            if row + 1 < rows:45                cell_neigbours["S"] = (row + 1, col)46            all_neighbours[(row, col)] = cell_neigbours47    return all_neighbours48def eliminate_and_update(to_eliminated: List, floor: dict, neighbours: dict) -> set:49    """Eliminate dancers and create list of dancers to check in next round."""50    LOG.info("Eliminating %d dancers", len(to_eliminated))51    to_be_checked = set()52    for pos in to_eliminated:53        LOG.debug("Eliminating pos: {}".format(pos))54        # Remove the person from the floor55        del floor[pos]56        # Update the neighbours of our neigbours57        to_west = neighbours[pos].get("W", None)58        to_east = neighbours[pos].get("E", None)59        to_north = neighbours[pos].get("N", None)60        to_south = neighbours[pos].get("S", None)61        if to_west:62            if to_east:63                neighbours[to_west]["E"] = to_east64            else:65                del neighbours[to_west]["E"]66        if to_east:67            if to_west:68                neighbours[to_east]["W"] = to_west69            else:70                del neighbours[to_east]["W"]71        if to_north:72            if to_south:73                neighbours[to_north]["S"] = to_south74            else:75                del neighbours[to_north]["S"]76        if to_south:77            if to_north:78                neighbours[to_south]["N"] = to_north79            else:80                del neighbours[to_south]["N"]81        # Add our neighbours to the check_list82        for neig in neighbours[pos].values():83            to_be_checked.add(neig)84        # Remove person from neighbours list85        del neighbours[pos]86    # No need to check persons that have been eliminated87    to_be_checked -= set(to_eliminated)88    return to_be_checked89def main():90    """This is where you write your solution."""91    cases = get_int()92    for case in range(1, cases + 1):93        # Read input data94        rows, cols = get_ints()95        # Store skill levels in a dictionary96        floor = dict()97        to_be_checked = []98        for row in range(rows):99            for col, value in enumerate(get_ints()):100                floor[(row, col)] = value101                to_be_checked.append((row, col))102        # Find initial neighbours, store in a dictionary103        neighbours = initial_neighbours(floor, rows, cols)104        # Interest level before any eliminations105        competition_interest = interest_level(floor)106        # Loop until competition is over107        n_rounds = 0108        while True:109            n_rounds += 1110            to_be_eliminated = []111            # Loop over the positions we need to check112            LOG.info("Need to check %s positions", len(to_be_checked))113            for pos in to_be_checked:114                if len(neighbours[pos]) == 0:115                    continue  # This dancer doesn't have any neighbours116                neig_values = [floor[neig] for neig in neighbours[pos].values()]117                if floor[pos] < (sum(neig_values) / len(neig_values)):118                    to_be_eliminated.append(pos)119            # Finished or not?120            if len(to_be_eliminated) == 0:121                break122            # Eliminate dancers and create new list to be checked123            to_be_checked = eliminate_and_update(to_be_eliminated, floor, neighbours)124            # Increase competition interest125            competition_interest += interest_level(floor)126            LOG.info("End of round %d: %d dancers left", n_rounds, len(floor))127        LOG.info("End of competition after %d rounds: %d dancers left",128                 n_rounds, len(floor))129        print('Case #{}: {}'.format(case, competition_interest))130if __name__ == '__main__':131    # Parse command line arguments132    parser = argparse.ArgumentParser(description='Code Jam solution')133    parser.add_argument('-v', '--verbose', action='count', default=0,134                        help="Increase verbosity. "135                        "Can be repeated up to two times.")136    parser.add_argument('infile', default="-", nargs="?",137                        help="Read from file instead of stdin")138    arguments = parser.parse_args()139    # Possibly change logging level of the top-level logger140    if arguments.verbose == 1:141        logging.getLogger().setLevel(logging.INFO)142    if arguments.verbose >= 2:143        logging.getLogger().setLevel(logging.DEBUG)144    # Print debugging information145    LOG.debug("Finished parsing arguments: %s", arguments)146    # Define a global FILE variable (sys.stdin or infile) and run main()147    FILE = fileinput.input(files=arguments.infile)...LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!
