Beispiel #1
0
def test_quadratic_model():
    m = QuadraticModel()
    w = SimpleWrapper(m)

    h = w.fit({'initial_epoch': 0, 'epochs': 5})
    compare_dicts(
        h, {
            'epochs': [e for e in range(0, 3)],
            'acc': [4, 1, 0, 1, 4],
            'loss': [-4, -1, 0, -1, -4],
            'val_acc': [4.5, 1.5, 0.5, 1.5, 4.5],
            'val_loss': [-4.5, -1.5, -0.5, -1.5, -4.5]
        })
Beispiel #2
0
def test_load(test_kernels, label_type, image):
    label_file = get_image_label(image, label_type)
    isd_str = ale.loads(label_file, props={'kernels': test_kernels[image]})
    isd_obj = json.loads(isd_str)
    print(json.dumps(isd_obj, indent=2))

    assert compare_dicts(isd_obj, image_dict[image]) == []
def test_newhorizons_load(test_kernels):
    label_file = get_image_label("lor_0034974380_0x630_sci_1", "isis")
    isd_str = ale.loads(label_file, props={'kernels': test_kernels})
    isd_obj = json.loads(isd_str)
    compare_dict = get_isd('newhorizons')
    print(json.dumps(isd_obj, indent=2))
    assert compare_dicts(isd_obj, compare_dict) == []
Beispiel #4
0
def test_load(test_kernels, usgscsm_comparison_isd):
    label_file = get_image_label('M103595705LE')
    usgscsm_isd = ale.load(label_file,
                           props={'kernels': test_kernels},
                           formatter='usgscsm')
    print(usgscsm_isd)
    assert compare_dicts(usgscsm_isd, usgscsm_comparison_isd) == []
def test_load_minirf(test_kernels):
    label_file = get_image_label('03821_16N196_S1', 'isis3')
    # isd_str = ale.loads(label_file, props={'kernels': test_kernels['03821_16N196_S1']}, formatter='usgscsm', verbose=True)
    isd_str = ale.loads(label_file, props={'kernels': test_kernels['03821_16N196_S1']}, verbose=True)
    isd_obj = json.loads(isd_str)
    print(json.dumps(isd_obj, indent=2))
    assert compare_dicts(isd_obj, image_dict['03821_16N196_S1']) == []
Beispiel #6
0
def test_fit(keras_model):
    good_results = {
        'acc': [-76, -96, -28],
        'val_loss': [4.75, 5.75, 6.75],
        'loss': [4.5, 5.5, 6.5],
        'val_acc': [4.25, 5.25, 6.25],
        'epochs': [4, 5, 6]
    }

    m = SimpleWrapper(keras_model)
    obs = m.fit(fit_args={'initial_epoch': 4, 'epochs': 7})

    print('result:\n{}'.format(obs))
    print('should be:\n{}'.format(good_results))

    compare_dicts(obs, good_results)
Beispiel #7
0
def test_cassini_load(test_kernels, usgscsm_compare_dict):
    label_file = get_image_label("N1702360370_1")
    usgscsm_isd = ale.load(label_file,
                           props={'kernels': test_kernels},
                           formatter='usgscsm')
    print(usgscsm_isd)
    assert compare_dicts(usgscsm_isd, usgscsm_compare_dict) == []
Beispiel #8
0
def test_load(test_kernels, label_type, formatter, image):
    label_file = get_image_label(image, label_type)
    usgscsm_isd_str = ale.loads(label_file, props={'kernels': test_kernels[image]}, formatter=formatter)
    usgscsm_isd_obj = json.loads(usgscsm_isd_str)
    print(json.dumps(usgscsm_isd_obj, indent=4))

    assert compare_dicts(usgscsm_isd_obj, image_dict[image][formatter]) == []
Beispiel #9
0
def test_mex_load(test_kernels, formatter, usgscsm_compare_dict, label):
    label_file = get_image_label('h5270_0000_ir2', label)

    with patch('ale.drivers.mex_drivers.MexHrscPds3NaifSpiceDriver.binary_ephemeris_times', \
               new_callable=PropertyMock) as binary_ephemeris_times, \
        patch('ale.drivers.mex_drivers.MexHrscPds3NaifSpiceDriver.binary_exposure_durations', \
               new_callable=PropertyMock) as binary_exposure_durations, \
        patch('ale.drivers.mex_drivers.MexHrscPds3NaifSpiceDriver.binary_lines', \
               new_callable=PropertyMock) as binary_lines, \
        patch('ale.drivers.mex_drivers.MexHrscIsisLabelNaifSpiceDriver.ephemeris_time', \
               new_callable=PropertyMock) as ephemeris_time, \
        patch('ale.drivers.mex_drivers.read_table_data', return_value=12345) as read_table_data, \
        patch('ale.drivers.mex_drivers.parse_table', return_value={'EphemerisTime': [255744599.02748165, 255744684.33197814, 255744684.34504557], \
                                                                   'ExposureTime': [0.012800790786743165, 0.012907449722290038, 0.013227428436279297], \
                                                                   'LineStart': [1, 6665, 6666]}) as parse_table:

        ephemeris_time.return_value = [
            255744599.02748, 255744623.61901, 255744635.91477
        ]
        binary_ephemeris_times.return_value = [
            255744599.02748165, 255744599.04028246, 255744795.73322123
        ]
        binary_exposure_durations.return_value = [
            0.012800790786743165, 0.012800790786743165, 0.013227428436279297
        ]
        binary_lines.return_value = [0.5, 1.5, 15086.5]

        usgscsm_isd = ale.load(label_file,
                               props={'kernels': test_kernels},
                               formatter=formatter,
                               verbose='true')
        assert compare_dicts(
            usgscsm_isd,
            usgscsm_compare_dict['h5270_0000_ir2'][formatter]) == []
Beispiel #10
0
def test_viking1_load(test_kernels, label_type, formatter, image):
    label_file = get_image_label(image, label_type)
    isis_isd = ale.load(label_file,
                        props={'kernels': test_kernels[image]},
                        formatter=formatter)
    print(isis_isd)
    assert compare_dicts(isis_isd, image_dict[image][formatter]) == []
Beispiel #11
0
def test_mro_load(test_kernels, label_type):
    label_file = get_image_label('JNCR_2016240_01M06152_V01', label_type)
    isd_str = ale.loads(label_file, props={'kernels': test_kernels})
    isd_obj = json.loads(isd_str)
    compare_dict = get_isd('juno')
    print(json.dumps(isd_obj, indent=2))
    assert compare_dicts(isd_obj, compare_dict) == []
Beispiel #12
0
def test_cassis_load(test_kernels, isis_compare_dict):
    label_file = get_image_label(
        "CAS-MCO-2016-11-26T22.32.14.582-RED-01000-B1", "isis")
    isis_isd = ale.load(label_file,
                        props={'kernels': test_kernels},
                        formatter="isis")

    assert compare_dicts(isis_isd, isis_compare_dict) == []
Beispiel #13
0
def test_load(test_kernels):
    label_file = get_image_label('FC21A0038582_15170161546F6F')
    compare_dict = get_isd("dawnfc")

    isd_str = ale.loads(label_file, props={'kernels': test_kernels})
    isd_obj = json.loads(isd_str)
    print(json.dumps(isd_obj, indent=2))
    assert compare_dicts(isd_obj, compare_dict) == []
def test_cassis_load(test_kernels):
    label_file = get_image_label(
        "CAS-MCO-2016-11-26T22.32.14.582-RED-01000-B1", "isis")
    isd_str = ale.loads(label_file, props={'kernels': test_kernels})
    isd_obj = json.loads(isd_str)
    compare_dict = get_isd('cassis')
    print(json.dumps(isd_obj, indent=2))
    assert compare_dicts(isd_obj, compare_dict) == []
Beispiel #15
0
def test_load_pds(test_kernels):
    label_file = get_image_label("N1702360370_1")
    compare_dict = get_isd("cassiniiss")

    isd_str = ale.loads(label_file, props={'kernels': test_kernels})
    isd_obj = json.loads(isd_str)
    print(json.dumps(isd_obj, indent=2))
    assert compare_dicts(isd_obj, compare_dict) == []
Beispiel #16
0
def test_mro_load(test_kernels, label_type, formatter, isis_compare_dict):
    label_file = get_image_label('JNCR_2016240_01M06152_V01', label_type)

    usgscsm_isd_str = ale.loads(label_file, props={'kernels': test_kernels}, formatter=formatter)
    usgscsm_isd_obj = json.loads(usgscsm_isd_str)
    print(json.dumps(usgscsm_isd_obj, indent=4))

    assert compare_dicts(usgscsm_isd_obj, isis_compare_dict) == []
Beispiel #17
0
def test_mro_load(test_kernels, label_type, formatter, usgscsm_compare_dict, isis_compare_dict):
    label_file = get_image_label('B10_013341_1010_XN_79S172W', label_type)

    usgscsm_isd_str = ale.loads(label_file, props={'kernels': test_kernels}, formatter=formatter)
    usgscsm_isd_obj = json.loads(usgscsm_isd_str)
    print(json.dumps(usgscsm_isd_obj, indent=4))


    if formatter=='usgscsm':
        # Check to change the line based on ISIS vs PDS3
        # This is due to a processing step in mroctx2isis that removes samples
        # based on some flags on the label
        if label_type == 'isis3':
            usgscsm_compare_dict['image_samples'] = 5000
        assert compare_dicts(usgscsm_isd_obj, usgscsm_compare_dict) == []
    else:
        assert compare_dicts(usgscsm_isd_obj, isis_compare_dict) == []
Beispiel #18
0
def test_load(test_kernels, label_type, image):
    label_file = get_image_label(image, label_type)
    print(test_kernels)
    usgscsm_isd_str = ale.loads(label_file,
                                props={'kernels': test_kernels},
                                verbose=True)
    usgscsm_isd_obj = json.loads(usgscsm_isd_str)
    print(json.dumps(usgscsm_isd_obj, indent=2))

    assert compare_dicts(usgscsm_isd_obj, image_dict[image]) == []
def test_hayabusa_load(test_kernels, label_type):
    label_file = get_image_label('hyb2_onc_20151203_084458_w2f_l2a',
                                 label_type)
    isd_str = ale.loads(label_file,
                        props={'kernels': test_kernels},
                        verbose=False)
    isd_obj = json.loads(isd_str)
    compare_dict = get_isd('hayabusa2')
    print(json.dumps(isd_obj, indent=2))
    assert compare_dicts(isd_obj, compare_dict) == []
Beispiel #20
0
def test_mro_load(test_kernels, label_type):
    label_file = get_image_label('B10_013341_1010_XN_79S172W', label_type)

    isd_str = ale.loads(label_file, props={'kernels': test_kernels})
    isd_obj = json.loads(isd_str)

    compare_isd = get_isd('ctx')
    if label_type == 'isis3':
        compare_isd['image_samples'] = 5000

    assert compare_dicts(isd_obj, compare_isd) == []
Beispiel #21
0
def test_galileo_load(test_kernels, label_type, kernel_type):
    label_file = get_image_label('E6I0032', label_type)

    if label_type == 'isis3' and kernel_type == 'isis':
        label_file = get_image('E6I0032')
        isd_str = ale.loads(label_file)
        compare_isd = get_isd('galileossi_isis')
    else:
        isd_str = ale.loads(label_file, props={'kernels': test_kernels})
        compare_isd = get_isd('galileossi')

    isd_obj = json.loads(isd_str)
    assert compare_dicts(isd_obj, compare_isd) == []
Beispiel #22
0
def test_load(test_kernels, label_type, image, kernel_type):
    if (kernel_type == "naif"):
        label_file = get_image_label(image, label_type)
        isd_str = ale.loads(label_file, props={'kernels': test_kernels})
        compare_isd = image_dict[image]
    else:
        label_file = get_image(image)
        isd_str = ale.loads(label_file)
        compare_isd = get_isd("messmdis_isis")

    isd_obj = json.loads(isd_str)
    print(json.dumps(isd_obj, indent=2))
    assert compare_dicts(isd_obj, compare_isd) == []
Beispiel #23
0
def test_load_isis():
    label_file = get_image_label("N1702360370_1", label_type="isis3")
    compare_dict = get_isd("cassiniiss_isis")

    def read_detatched_table(table_label, cube):
        return get_table_data("N1702360370_1", table_label["Name"])

    with patch('ale.base.data_isis.read_table_data',
               side_effect=read_detatched_table):
        isd_str = ale.loads(label_file)
    isd_obj = json.loads(isd_str)
    print(json.dumps(isd_obj, indent=2))
    assert compare_dicts(isd_obj, compare_dict) == []
def test_viking1_load(test_kernels, label_type, formatter, image, kernel_type):
    if kernel_type == "naif":
        label_file = get_image_label(image, label_type)
        isis_isd = ale.loads(label_file,
                             props={'kernels': test_kernels[image]},
                             formatter=formatter)
        compare_dict = image_dict[image][formatter]
    else:
        label_file = get_image(image)
        isis_isd = ale.loads(label_file, verbose=True)
        isd_name = image + '_isis'
        compare_dict = get_isd(isd_name)

    print(isis_isd)
    assert compare_dicts(json.loads(isis_isd), compare_dict) == []
Beispiel #25
0
def test_linear_state_based_metrics():
    m = LinearModel()
    w = SimpleWrapper(m)

    assert w != m

    # History should reflect the change in metrics over for a window
    # specified by the epoch range but continuing from where the model
    # state was as of the last call to fit().
    assert w.eval({}) == (0., 0.)

    h = w.fit({'initial_epoch': 0, 'epochs': 3})
    compare_dicts(
        h, {
            'epochs': [e for e in range(0, 3)],
            'acc': [1, 2, 3],
            'loss': [-1, -2, -3],
            'val_acc': [1.5, 2.5, 3.5],
            'val_loss': [-1.5, -2.5, -3.5]
        })

    # Run for a few more epochs
    h = w.fit({'initial_epoch': 3, 'epochs': 5})
    compare_dicts(
        h, {
            'epochs': [e for e in range(3, 5)],
            'acc': [4, 5],
            'loss': [-4, -5],
            'val_acc': [4.5, 5.5],
            'val_loss': [-4.5, -5.5]
        })

    # And now run for a few more, but reset the epoch range -- the key here
    # is that the metrics should continue relative to the previous state,
    # not the epoch range
    h = w.fit({'initial_epoch': 1, 'epochs': 3})
    compare_dicts(
        h, {
            'epochs': [e for e in range(1, 4)],
            'acc': [6, 7, 8],
            'loss': [-6, -7, -8],
            'val_acc': [6.5, 7.5, 8.5],
            'val_loss': [-6.5, -7.5, -8.5]
        })
Beispiel #26
0
def test_dawn_load(test_kernels, usgscsm_compare_dict):
    label_file = get_image_label('FC21A0038582_15170161546F6F')
    usgscsm_isd = ale.load(label_file,
                           props={'kernels': test_kernels},
                           formatter='usgscsm')
    assert compare_dicts(usgscsm_isd, usgscsm_compare_dict) == []
Beispiel #27
0
def test_load_isis(test_kernels, label_type, formatter, image):
    label_file = get_image_label(image, label_type)
    isis_isd = ale.loads(label_file, props={'kernels': test_kernels[image]}, formatter=formatter, verbose=True)
    isis_isd_obj = json.loads(isis_isd)
    print(json.dumps(isis_isd_obj, indent=4))
    assert compare_dicts(isis_isd_obj, image_dict[image][formatter]) == []
Beispiel #28
0
def test_load(test_kernels):
    isd = {
        'radii': {
            'semimajor': 1737.4,
            'semiminor': 1737.4,
            'unit': 'km'
        },
        'sensor_position': {
            'positions':
            np.array([[195493.28614388, 211984.05137213, -1766966.32185819],
                      [194937.01104181, 211343.39987087, -1767100.47633473],
                      [194380.68920347, 210702.70097122, -1767234.22276254],
                      [193824.32093681, 210061.95495794, -1767367.56104995],
                      [193267.90484827, 209421.16305764, -1767500.49120063],
                      [192711.44397634, 208780.32318594, -1767633.01318365]]),
            'velocities':
            np.array([[-1069.71225785, -1231.97438089, -258.37880523],
                      [-1069.80205939, -1232.06556741, -257.5939851],
                      [-1069.89161639, -1232.15647191, -256.80910187],
                      [-1069.98092881, -1232.24709434, -256.02415587],
                      [-1070.06999666, -1232.33743471, -255.2391471],
                      [-1070.15881991, -1232.42749298, -254.4540759]]),
            'unit':
            'm'
        },
        'sun_position': {
            'positions':
            np.array([[9.50465237e+10, 1.15903815e+11, 3.78729685e+09]]),
            'velocities':
            np.array([[285707.13474515, -232731.15884149, 592.91742112]]),
            'unit':
            'm'
        },
        'sensor_orientation': {
            'quaternions':
            np.array([[-0.19095485, -0.08452708, 0.88748467, -0.41080698],
                      [-0.19073945, -0.08442789, 0.88753312, -0.41082276],
                      [-0.19052404, -0.08432871, 0.88758153, -0.41083852],
                      [-0.19030862, -0.08422952, 0.88762988, -0.41085426],
                      [-0.19009352, -0.08412972, 0.88767854, -0.41086914],
                      [-0.18987892, -0.08402899, 0.88772773, -0.41088271]])
        },
        'detector_sample_summing': 1,
        'detector_line_summing': 1,
        'focal_length_model': {
            'focal_length': 72.45
        },
        'detector_center': {
            'line': 0.5,
            'sample': 2048.0
        },
        'starting_detector_line': 0,
        'starting_detector_sample': 1,
        'focal2pixel_lines': [0, -142.85714285714286, 0],
        'focal2pixel_samples': [0, 0, -142.85714285714286],
        'optical_distortion': {
            'kaguyatc': {
                'x':
                [-0.0009649900000000001, 0.00098441, 8.5773e-06, -3.7438e-06],
                'y':
                [-0.0013796, 1.3502e-05, 2.7251e-06, -6.193800000000001e-06]
            }
        },
        'image_lines': 400,
        'image_samples': 3208,
        'name_platform': 'SELENE-M',
        'name_sensor': 'Terrain Camera 1',
        'reference_height': {
            'maxheight': 1000,
            'minheight': -1000,
            'unit': 'm'
        },
        'name_model': 'USGS_ASTRO_LINE_SCANNER_SENSOR_MODEL',
        'interpolation_method': 'lagrange',
        'line_scan_rate': [[0.5, -1.300000011920929, 0.006500000000000001]],
        'starting_ephemeris_time': 292234259.82293594,
        'center_ephemeris_time': 292234261.12293595,
        't0_ephemeris': -1.300000011920929,
        'dt_ephemeris': 0.5200000047683716,
        't0_quaternion': -1.300000011920929,
        'dt_quaternion': 0.5200000047683716
    }

    label_file = get_image_label('TC1S2B0_01_06691S820E0465')

    with patch('ale.drivers.selene_drivers.KaguyaTcPds3NaifSpiceDriver.reference_frame', \
                new_callable=PropertyMock) as mock_reference_frame:
        mock_reference_frame.return_value = 'IAU_MOON'
        usgscsm_isd = ale.load(label_file,
                               props={'kernels': test_kernels},
                               formatter='usgscsm')
    print(usgscsm_isd)

    assert compare_dicts(usgscsm_isd, isd) == []
Beispiel #29
0
def test_load(test_kernels):
    isd = {
        'radii': {
            'semimajor': 1737.4,
            'semiminor': 1737.4,
            'unit': 'km'
        },
        'sensor_position': {
            'positions':
            np.array([[195490.61933009, 211972.79163854, -1766965.21759375],
                      [194934.34274256, 211332.14192709, -1767099.36601459],
                      [194378.02078141, 210691.44358962, -1767233.10640484],
                      [193821.65246371, 210050.69819792, -1767366.43865632],
                      [193265.23762617, 209409.90567475, -1767499.36279925],
                      [192708.77531467, 208769.0676026, -1767631.87872367]]),
            'velocities':
            np.array([[-1069.71186948, -1231.97377674, -258.3672068],
                      [-1069.80166655, -1232.06495814, -257.58238805],
                      [-1069.89121909, -1232.15585752, -256.7975062],
                      [-1069.98052705, -1232.24647484, -256.01256158],
                      [-1070.06959044, -1232.3368101, -255.2275542],
                      [-1070.15840923, -1232.42686325, -254.44248439]]),
            'unit':
            'm'
        },
        'sun_position': {
            'positions':
            np.array([[9.50465237e+10, 1.15903815e+11, 3.78729685e+09]]),
            'velocities':
            np.array([[285707.13474515, -232731.15884149, 592.91742112]]),
            'unit':
            'm'
        },
        'sensor_orientation': {
            'quaternions':
            np.array([[-0.19095485, -0.08452708, 0.88748467, -0.41080698],
                      [-0.19073945, -0.08442789, 0.88753312, -0.41082276],
                      [-0.19052404, -0.08432871, 0.88758153, -0.41083852],
                      [-0.19030862, -0.08422952, 0.88762988, -0.41085426],
                      [-0.19009352, -0.08412972, 0.88767854, -0.41086914],
                      [-0.18987892, -0.08402899, 0.88772773, -0.41088271]])
        },
        'detector_sample_summing': 1,
        'detector_line_summing': 1,
        'focal_length_model': {
            'focal_length': 72.45
        },
        'detector_center': {
            'line': 0.5,
            'sample': 2048.0
        },
        'starting_detector_line': 0,
        'starting_detector_sample': 1,
        'focal2pixel_lines': [0, -142.85714285714286, 0],
        'focal2pixel_samples': [0, 0, -142.85714285714286],
        'optical_distortion': {
            'kaguyatc': {
                'x':
                [-0.0009649900000000001, 0.00098441, 8.5773e-06, -3.7438e-06],
                'y':
                [-0.0013796, 1.3502e-05, 2.7251e-06, -6.193800000000001e-06]
            }
        },
        'image_lines': 400,
        'image_samples': 3208,
        'name_platform': 'SELENE-M',
        'name_sensor': 'Terrain Camera 1',
        'reference_height': {
            'maxheight': 1000,
            'minheight': -1000,
            'unit': 'm'
        },
        'name_model': 'USGS_ASTRO_LINE_SCANNER_SENSOR_MODEL',
        'interpolation_method': 'lagrange',
        'line_scan_rate': [[0.5, -1.300000011920929, 0.006500000000000001]],
        'starting_ephemeris_time': 292234259.82293594,
        'center_ephemeris_time': 292234261.12293595,
        't0_ephemeris': -1.300000011920929,
        'dt_ephemeris': 0.5200000047683716,
        't0_quaternion': -1.300000011920929,
        'dt_quaternion': 0.5200000047683716
    }

    label_file = get_image_label('TC1S2B0_01_06691S820E0465')

    with patch('ale.drivers.selene_drivers.KaguyaTcPds3NaifSpiceDriver.reference_frame', \
                new_callable=PropertyMock) as mock_reference_frame:
        mock_reference_frame.return_value = 'IAU_MOON'
        usgscsm_isd = ale.load(label_file,
                               props={'kernels': test_kernels},
                               formatter='usgscsm')
    print(usgscsm_isd)

    assert compare_dicts(usgscsm_isd, isd) == []
Beispiel #30
0
def test_linear_copy():
    from copy import copy

    m = LinearModel()
    w = SimpleWrapper(m)

    w_copy = copy(w)

    assert w != w_copy
    assert w._model != w_copy._model
    assert w.eval({}) == w_copy.eval({})

    # Move original model ahead 3 epochs
    h = w.fit({'initial_epoch': 0, 'epochs': 3})
    compare_dicts(
        h, {
            'epochs': [e for e in range(0, 3)],
            'acc': [1, 2, 3],
            'loss': [-1, -2, -3],
            'val_acc': [1.5, 2.5, 3.5],
            'val_loss': [-1.5, -2.5, -3.5]
        })

    assert w.eval({}) == (-3, 3)
    assert w.eval({}) != w_copy.eval({})

    # Move copy ahead 2 epochs
    h = w_copy.fit({'initial_epoch': 1, 'epochs': 3})
    compare_dicts(
        h, {
            'epochs': [e for e in range(1, 3)],
            'acc': [1, 2],
            'loss': [-1, -2],
            'val_acc': [1.5, 2.5],
            'val_loss': [-1.5, -2.5]
        })

    assert w_copy.eval({}) == (-2, 2)
    assert w.eval({}) != w_copy.eval({})

    # Move original ahead 1 epochs
    h = w.fit({'initial_epoch': 3, 'epochs': 4})
    compare_dicts(
        h, {
            'epochs': [e for e in range(3, 4)],
            'acc': [4],
            'loss': [-4],
            'val_acc': [4.5],
            'val_loss': [-4.5]
        })

    assert w.eval({}) == (-4, 4)
    assert w.eval({}) != w_copy.eval({})

    # Move copy ahead 2 epochs
    h = w_copy.fit({'initial_epoch': 3, 'epochs': 5})
    compare_dicts(
        h, {
            'epochs': [e for e in range(3, 5)],
            'acc': [3, 4],
            'loss': [-3, -4],
            'val_acc': [3.5, 4.5],
            'val_loss': [-3.5, -4.5]
        })

    assert w_copy.eval({}) == (-4, 4)
    assert w.eval({}) == w_copy.eval({})