Пример #1
0
 def test_add_compatible(self):
     a = UnitArray([1, 2, 3], units=meters)
     b = UnitArray([1, 2, 3], units=feet)
     result = a + b
     mplusf = (meters + feet).value
     self.assertEqual(result[0], mplusf)
     self.assertEqual(result.units, meters)
Пример #2
0
    def test_gram_per_mol(self):
        x = UnitArray([1000, 2000, 3000], units=chr_units.gram_per_mol)
        expected = UnitArray([1000, 2000, 3000], units=mass.g / substance.mole)
        assert_unit_array_almost_equal(x, expected)

        y = UnitArray([1000, 2000, 3000], units="g/mol")
        assert_unit_array_almost_equal(y, expected)
Пример #3
0
 def test_subtract_compatible(self):
     a = UnitArray([1, 2, 3], units=meters)
     b = UnitArray([1, 2, 3], units=feet)
     result = a - b
     mminusf = (meters - feet).value
     self.assertEqual(result[0], mminusf)
     self.assertEqual(result.units, meters)
Пример #4
0
 def test_index_name(self):
     """ Can set and retreive the index_name?
     """
     ary = numpy.array((1,2,3))
     unit_ary = UnitArray(ary)
     unit_ary.index_name = "depth"
     self.assertEqual(unit_ary.index_name, "depth")
    def test_unit_array_with_decorated_docstring_function(self):
        """Does has_units wrap with docstring work ?
        """
        def addfunc(a, b):
            return a + b

        @has_units
        def add(a, b):
            ''' Add two arrays in ft/s and convert them to m/s.

            Parameters
            ----------
            a : array : units=ft/s
                An array
            b : array : units=ft/s
                Another array

            Returns
            -------
            c : array : units=m/s
                c = a + b
            '''
            return (a + b) * 0.3048

        a = UnitArray(arange(100), units=feet / second)
        b = UnitArray(arange(100)**2, units=feet / second)
        self.assertTrue(
            allclose(addfunc(a, b).as_units(meters / second), add(a, b)))

        a = UnitArray(arange(100), units=meters / second)
        b = UnitArray(arange(100)**2, units=meters / second)
        self.assertTrue(
            allclose(addfunc(a, b).as_units(meters / second), add(a, b)))
    def test_unit_array_with_decorated_docstring_and_inputted_parameters(self):
        """Does has_units wrap with expanded docstring and inputting
        parameters work the same ?
        """
        @has_units(inputs="a:an array:units=ft/s;b:array:units=ft/s",
                   outputs="c:an array:units=m/s")
        def add(a, b):
            " Add two arrays in ft/s and convert them to m/s. "
            return (a + b) * 0.3048

        @has_units
        def add_doc(a, b):
            ''' Add two arrays in ft/s and convert them to m/s.

            Parameters
            ----------
            a : array : units=ft/s
                An array
            b : array : units=ft/s
                Another array

            Returns
            -------
            c : array : units=m/s
                c = a + b
            '''
            return (a + b) * 0.3048

        a = UnitArray(arange(100), units=feet / second)
        b = UnitArray(arange(100)**2, units=feet / second)
        self.assertTrue(allclose(add_doc(a, b), add(a, b)))

        a = UnitArray(arange(100), units=meters / second)
        b = UnitArray(arange(100)**2, units=meters / second)
        self.assertTrue(allclose(add_doc(a, b), add(a, b)))
Пример #7
0
    def test_concatenate(self):
        unit_ary_1 = UnitArray(numpy.array((1, 2, 3)), units=meters)
        unit_ary_2 = UnitArray(numpy.array((4, 5, 6)), units=meters)

        new_unit_ary = UnitArray.concatenate([unit_ary_1, unit_ary_2])
        expected = UnitArray((1, 2, 3, 4, 5, 6), units=meters)
        self.assertTrue(numpy.all(new_unit_ary == expected))
Пример #8
0
 def test_index_name(self):
     """ Can set and retreive the index_name?
     """
     ary = numpy.array((1, 2, 3))
     unit_ary = UnitArray(ary)
     unit_ary.index_name = "depth"
     self.assertEqual(unit_ary.index_name, "depth")
Пример #9
0
    def test_kilo_dalton(self):
        x = UnitArray([1, 2, 3], units=chr_units.kilo_dalton)
        expected = UnitArray([1, 2, 3], units=chr_units.kilogram_per_mol)
        assert_unit_array_almost_equal(x, expected)
        # This unit is equal but distinct:
        self.assertIsNot(chr_units.kilo_dalton, chr_units.kilogram_per_mol)

        y = UnitArray([1, 2, 3], units="kDa")
        assert_unit_array_almost_equal(y, expected)
Пример #10
0
    def test_dalton(self):
        x = UnitArray([1000, 2000, 3000], units=chr_units.gram_per_mol)
        expected = UnitArray([1000, 2000, 3000], units=chr_units.dalton)
        assert_unit_array_almost_equal(x, expected)
        # This unit is equal but distinct:
        self.assertIsNot(chr_units.dalton, chr_units.gram_per_mol)

        y = UnitArray([1000, 2000, 3000], units="Da")
        assert_unit_array_almost_equal(y, expected)
 def setUp(self):
     # Make some data to play with.
     self.meter_array = UnitArray([1., 2, 3], units=meters)
     self.second_array = UnitArray([3., 2, 1], units=second)
     self.feet_array = UnitArray([4., 5, 6], units=feet)
     self.meter_scalar = UnitScalar(1., units=meters)
     self.second_scalar = UnitScalar(3., units=second)
     self.feet_scalar = UnitScalar(4., units=feet)
     unittest.TestCase.setUp(self)
Пример #12
0
 def test_divide_pass(self):
     a = UnitArray([1, 2, 3], units=meters / second)
     result = a / 3.0
     self.assertEqual(result.units, meters / second)
     result = 3.0 / a
     self.assertEqual(result.units, second / meters)
     b = UnitArray([3, 2, 1], units=second)
     result = a / b
     self.assertEqual(result.units, meters / second**2)
 def test_product_component_purity_calc(self):
     load = self.load
     load_conc_units = load.product_concentration.units
     expt_concentrations = UnitArray([0.07896, 0.82908, 0.03195718],
                                     units=load_conc_units)
     expt_purities = expt_concentrations / load.product_concentration * 100
     expt_purities = UnitArray(expt_purities, units=percent)
     assert_unit_array_almost_equal(load.product_component_purities,
                                    expt_purities,
                                    atol=1e-5)
Пример #14
0
    def test_array_convert_units(self):
        array_data = UnitArray([1, 2, 3], units=chr_units.length.m)
        conv_data = convert_units(array_data, chr_units.length.cm)
        assert_allclose(conv_data.tolist(), (100 * array_data).tolist())
        self.assertEqual(conv_data.units, chr_units.length.cm)

        # convert back to original units and check
        conv_data_2 = convert_units(conv_data, array_data.units)
        assert_allclose(conv_data_2.tolist(), array_data.tolist())
        self.assertEqual(conv_data_2.units, array_data.units)
Пример #15
0
    def test_concatenate_keeps_attribute(self):
        """ concatenating does not call __new__ on the result
            so the attribute must be set correctly in __array_finalize__
        """
        unit_ary_1 = UnitArray(numpy.array((1, 2, 3)), units=meters)
        unit_ary_2 = UnitArray(numpy.array((1, 2, 3)), units=meters)

        new_unit_ary = UnitArray.concatenate([unit_ary_1, unit_ary_2])

        self.assertEqual(new_unit_ary.units, meters)
 def test_product_component_purity_calc(self):
     pool = self.pool
     pool_conc_units = pool.product_concentration.units
     sim_concentrations = UnitArray([0.1, 0.25, 0.05],
                                    units=pool_conc_units)
     pool.product_component_concentrations = sim_concentrations
     sim_purities = sim_concentrations / pool.product_concentration * 100
     sim_purities = UnitArray(sim_purities, units=percent)
     assert_unit_array_almost_equal(pool.product_component_purities,
                                    sim_purities,
                                    atol=1e-5)
Пример #17
0
 def test_pow_pass(self):
     a = UnitArray([1, 2, 3], units=meters)
     b = 0.5
     result = a**b
     self.assertEqual(result.units, meters**0.5)
     c = array(0.5)
     result = a**c
     self.assertEqual(result.units, meters**0.5)
     d = UnitArray(0.5, units=dimensionless)
     result = a**d
     self.assertEqual(result.units, meters**0.5)
Пример #18
0
    def test_as_units(self):
        """ Conversion from one unit system to another.
        """
        ary = numpy.array((1,2,3))
        unit_ary = UnitArray(ary, units=meters)
        new_unit_ary = unit_ary.as_units(feet)

        # Test the values are correct
        desired_array = units.convert(ary, meters, feet)
        self.assert_(numpy.all(desired_array==new_unit_ary))

        # Also, make sure the units are correctly assigned.
        self.assertEqual(new_unit_ary.units, feet)
Пример #19
0
    def test_as_units(self):
        """ Conversion from one unit system to another.
        """
        ary = numpy.array((1, 2, 3))
        unit_ary = UnitArray(ary, units=meters)
        new_unit_ary = unit_ary.as_units(feet)

        # Test the values are correct
        desired_array = units.convert(ary, meters, feet)
        self.assertTrue(numpy.all(desired_array == new_unit_ary))

        # Also, make sure the units are correctly assigned.
        self.assertEqual(new_unit_ary.units, feet)
Пример #20
0
 def test_pickle(self):
     'Pickling'
     for a in (
             UnitArray(0),
             UnitArray([0, 1]),
             UnitArray([0, 1], units=feet / seconds),
             UnitArray([[0.5, 1.0], [10., 20.]], units=meters),
     ):
         state = dumps(a)
         b = loads(state)
         self.assertTrue(all(b == a))
         self.assertTrue(hasattr(b, 'units'))
         self.assertEqual(b.units, a.units)
Пример #21
0
    def test_concatenate_keeps_attribute_using_mixed_units(self):
        """ concatenating does not call __new__ on the result
            so the attribute must be set correctly in __array_finalize__.
            This test creates another unit array with different units
            before the concatenate to make sure the finalize method does not
            assign the wrong units
        """
        unit_ary_1 = UnitArray(numpy.array((1, 2, 3)), units=meters)
        unit_ary_2 = UnitArray(numpy.array((1, 2, 3)), units=meters)

        unit_ary_3 = UnitArray(numpy.array((1, 2, 3)), units=feet)
        new_unit_ary = UnitArray.concatenate([unit_ary_1, unit_ary_2])

        self.assertEqual(new_unit_ary.units, meters)
Пример #22
0
    def test_repr(self):
        """ Test output of repr()"""
        a = UnitArray([1, 2, 3], units="cm")
        self.assertEqual(repr(a), "UnitArray([1, 2, 3], units='0.01*m')")

        # unit with no label
        labelless_unit = cm * gram
        a = UnitArray([1, 2, 3], units=labelless_unit)
        self.assertEqual(repr(a), "UnitArray([1, 2, 3], units='1e-05*m*kg')")

        # dimensionless quantity
        dimensionless_unit = copy(dimensionless)
        dimensionless_unit.label = "Cool unit"
        a = UnitArray([1, 2, 3], units=dimensionless_unit)
        self.assertEqual(repr(a), "UnitArray([1, 2, 3], units='1')")
    def test_unit_array_with_units_decorated(self):
        def func(value):
            return value

        @has_units(inputs="value: a value: units=m/s;")
        def func_wrapped(value):
            return value

        a = UnitArray(arange(100), units=meters / second)
        self.assertTrue(
            allclose(func(a).as_units(meters / second), func_wrapped(a)))

        a = UnitArray(arange(100), units=feet / second)
        self.assertTrue(
            allclose(func(a).as_units(meters / second), func_wrapped(a)))
Пример #24
0
    def test_concatenate(self):
        unit_ary_1 = UnitArray(numpy.array((1,2,3)), units=meters)
        unit_ary_2 = UnitArray(numpy.array((4,5,6)), units=meters)

        new_unit_ary = UnitArray.concatenate([unit_ary_1, unit_ary_2])
        expected = UnitArray((1,2,3,4,5,6), units=meters)
        self.assertTrue(numpy.all(new_unit_ary == expected))
Пример #25
0
def request_new_system_type(datasource, kind="livemodal", **traits):
    """ Build a new instance of a SystemType invoking its UI editor.

    Parameters
    -----------
    datasource : Instance(SimpleDataSource)
        User datasource targeted to be contributed to.

    kind : str
        Should be set to None to make it non-blocking (only useful for testing
        purposes).

    traits : dict
        Attributes of the created object. Used to override the defaults.

    Returns
    -------
    Tuple with the object created and the data to create it since it is to be
    contributed to the SimpleDataSource.
    """
    defaults = dict(
        name='New System Type', manufacturer='manufacturer',
        manufacturer_name='New System Type',
        flow_range=UnitArray([0., 0.], units=chr_units.ml_per_min)
    )
    defaults.update(traits)
    model = SystemType(**defaults)
    view = SystemTypeView(model=model)
    return _show_view_and_return_model(view, kind)
Пример #26
0
 def test_add(self):
     """ Binary operation of array + UnitArray should return a UnitArray.
     """
     ary = numpy.array((1, 2, 3))
     unit_ary = UnitArray(ary)
     res = unit_ary + ary
     assert type(res) is UnitArray
Пример #27
0
    def test_le(self):
        a = UnitArray([1.0, 2.0, 3], units=dimensionless)
        b = UnitArray([3.0, 1.0, 1], units=2.0 * dimensionless)
        result = a <= b

        self.assertEqual(result[0], True)
        self.assertEqual(result[1], True)
        self.assertEqual(result[2], False)
        c = 2.0
        result = b <= c
        self.assertEqual(result[0], False)
        self.assertEqual(result[1], True)
        self.assertEqual(result[2], True)
        self.assertEqual(result[0], False)
        self.assertEqual(result[1], True)
        self.assertEqual(result[2], True)
Пример #28
0
def calculate_step_start_times(sim):
    """ Calculate all step start times and stop time of the last step in min
    from the beginning of the method.

    Parameters
    ----------
    sim : _BaseExperiment (Experiment or Simulation)
        Experiment-like object containing the method to analyze.

    Returns
    -------
    UnitArray
        Start times for all steps and stop time of last step in minutes.
    """
    start_times = [0.]

    for step in sim.method.method_steps:
        step_time = vol_to_time(step.volume,
                                step.flow_rate,
                                column=sim.column,
                                to_unit="minute")
        start_times.append(step_time)

    start_times = np.cumsum(start_times)
    return UnitArray(start_times, units="minute")
Пример #29
0
 def test_subtract_dimensionless(self):
     a = UnitArray([1, 2, 3], units=dimensionless)
     b = 1
     result = a - b
     self.assertEqual(result.units, dimensionless)
     assert_array_equal(result, UnitArray([0, 1, 2], units=dimensionless))
     result = b - a
     self.assertEqual(result.units, dimensionless)
     assert_array_equal(result, UnitArray([0, -1, -2], units=dimensionless))
     c = array([3, 2, 1])
     result = a - c
     self.assertEqual(result.units, dimensionless)
     assert_array_equal(result, UnitArray([-2, 0, 2], units=dimensionless))
     result = c - a
     self.assertEqual(result.units, dimensionless)
     assert_array_equal(result, UnitArray([2, 0, -2], units=dimensionless))
Пример #30
0
def request_new_column_type(datasource, kind="livemodal", **traits):
    """ Build a new instance of a ColumnType invoking its UI editor.

    Parameters
    -----------
    datasource : Instance(SimpleDataSource)
        User datasource targeted to be contributed to.

    kind : str
        Should be set to None to make it non-blocking (only useful for testing
        purposes).

    traits : dict
        Attributes of the created object. Used to override the defaults.

    Returns
    -------
    Tuple with the object created and the data to create it since it is to be
    contributed to the SimpleDataSource.
    """
    defaults = dict(name='New Column Type', manufacturer='manufacturer',
                    manufacturer_name='New Column Type',
                    diameter=UnitScalar(0.0, units='cm'),
                    bed_height_range=UnitArray([0., 0.], units='cm'),
                    bed_height_adjust_method='None')
    defaults.update(traits)
    model = ColumnType(**defaults)
    view = ColumnTypeView(model=model)
    return _show_view_and_return_model(view, kind)
Пример #31
0
    def test_str(self):
        """ Test output of str() """
        a = UnitArray([1, 2, 3], units="cm")
        self.assertEqual(str(a), "UnitArray (cm): [1, 2, 3]")

        # unit with no label
        labelless_unit = cm * gram
        a = UnitArray([1, 2, 3], units=labelless_unit)
        # For units with no label, the repr of the unit is used.
        self.assertEqual(str(a), "UnitArray (1e-05*m*kg): [1, 2, 3]")

        # dimensionless quantity
        dimensionless_unit = copy(dimensionless)
        dimensionless_unit.label = "Cool unit"
        a = UnitArray([1, 2, 3], units=dimensionless_unit)
        self.assertEqual(str(a), "UnitArray (Cool unit): [1, 2, 3]")
Пример #32
0
 def test_array_equality(self):
     """ Rich comparison of array == UnitArray should compare the data
     """
     ary = numpy.array((1, 2, 3))
     unit_ary = UnitArray(ary)
     res = unit_ary + ary
     assert numpy.all(res == (ary + ary))
Пример #33
0
 def setUp(self):
     # Make some useful data.
     self.unit_array = UnitArray((1, 2, 3), units=meters)
     self.unit_scalar = UnitScalar(1, units=meters)
     self.plain_array = array([1, 2, 3])
     self.plain_scalar = 1
     unittest.TestCase.setUp(self)
    def test_adapt_getitem_converts_correctly(self):
        """ Does getitem convert units correctly?
        """
        context = None
        old_log = UnitArray((1, 2, 3), units=meters)
        getitem_units = {"depth": feet}
        adapter = UnitConversionAdapter(getitem_units=getitem_units)
        name, new_log = adapter.adapt_getitem(context, "depth", old_log)

        # Did the values get converted correctly?
        self.assert_(all(new_log == old_log.as_units(feet)))

        # Are the units assigned correctly?
        self.assert_(new_log.units == feet)

        return
    def test_get_set_converts_correctly(self):
        """ Does get/set with different units convert correctly?
        """
        context = None
        meter_log = UnitArray((1, 2, 3), units=meters)
        setitem_units = {"depth": inch}
        getitem_units = {"depth": feet}
        adapter = UnitConversionAdapter(getitem_units=getitem_units, setitem_units=setitem_units)
        name, inch_log = adapter.adapt_setitem(context, "depth", meter_log)
        self.assert_(all(inch_log == meter_log.as_units(inch)))

        name, feet_log = adapter.adapt_getitem(context, "depth", inch_log)
        # Did the values get converted correctly?
        self.assert_(all(feet_log == meter_log.as_units(feet)))

        # Are the units assigned correctly?
        self.assert_(feet_log.units == feet)

        return
Пример #36
0
    def test_concatenate_keeps_attribute(self):
        """ concatenating does not call __new__ on the result
            so the attribute must be set correctly in __array_finalize__
        """
        unit_ary_1 = UnitArray(numpy.array((1,2,3)), units=meters)
        unit_ary_2 = UnitArray(numpy.array((1,2,3)), units=meters)

        new_unit_ary = UnitArray.concatenate([unit_ary_1, unit_ary_2])

        self.assertEqual(new_unit_ary.units, meters)
    def test_getitem_converts_correctly(self):
        """ Does getitem convert units correctly?
        """
        getitem_units = {'depth':feet}
        adapter = UnitConversionAdapter(getitem_units=getitem_units)

        old_log = UnitArray((1,2,3),units=meters)

        self.context['depth'] = old_log
        self.context.push_adapter(adapter)

        new_log = self.context['depth']

        # Did the values get converted correctly?
        self.assert_(all(new_log==old_log.as_units(feet)))

        # Are the units assigned correctly?
        self.assert_(new_log.units==feet)

        return
    def setUp(self):
        unittest.TestCase.setUp(self)

        # Put unit adapters on either side of a masking adapter to see if they
        # cooperate. Store meters in the raw context, push fathoms through the
        # mask, and expose feet to the outside world.
        self.units = units = { 'in':meters, 'mid':fathom, 'out':feet }

        # Set up data for the contexts
        depth = UnitArray(linspace(0.0, 100.0, 11), units=units['in'])
        lith = array(['sand']*len(depth), dtype=object)

        # Create the contexts
        self.context = AdaptedDataContext(subcontext=DataContext())
        self.raw_context = self.context.subcontext

        # Add data (before creating the adapters)
        self.context.update(depth=depth, lith=lith)

        # (This simplifies creating UnitConversionAdapters)
        def always(value):
            class C(dict):
                def get(self, key, default=None):
                    return value
                def __repr__(self):
                    return '{*:%r}' % value
            return C()

        # Layer multiple adapters
        d = depth.view(ndarray)
        self.mask = (15.0 < d) & (d < 55.0)
        self.convert_out = lambda x: convert(x, units['in'], units['out'])
        self.convert_in = lambda x: convert(x, units['out'], units['in'])
        #self.context.push_adapter(
        #    UnitConversionAdapter(setitem_units=always(units['in']),
        #                          getitem_units=always(units['mid'])))
        self.context.push_adapter(MaskingAdapter(mask=self.mask))
        self.context.push_adapter(
        #    UnitConversionAdapter(setitem_units=always(units['mid']),
            UnitConversionAdapter(setitem_units=always(units['in']),
                                  getitem_units=always(units['out'])))
    def test_setitem_converts_correctly(self):
        """ Does setitem convert units correctly?
        """

        old_log = UnitArray((1,2,3),units=meters)
        getitem_units = {'depth':feet}
        adapter = UnitConversionAdapter(getitem_units=getitem_units)

        self.context.push_adapter(adapter)

        # pass the log into the conversion adapter as meters
        self.context['depth'] = old_log

        # Now retreive the log from the underlying context.
        new_log = self.context['depth']

        # Did the values get converted correctly?
        self.assert_(all(new_log==old_log.as_units(feet)))

        # Are the units assigned correctly?
        self.assert_(new_log.units==feet)

        return
Пример #40
0
    def test_concatenate_keeps_attribute_using_mixed_units(self):
        """ concatenating does not call __new__ on the result
            so the attribute must be set correctly in __array_finalize__.
            This test creates another unit array with different units
            before the concatenate to make sure the finalize method does not
            assign the wrong units
        """
        unit_ary_1 = UnitArray(numpy.array((1,2,3)), units=meters)
        unit_ary_2 = UnitArray(numpy.array((1,2,3)), units=meters)

        unit_ary_3 = UnitArray(numpy.array((1,2,3)), units=feet)
        new_unit_ary = UnitArray.concatenate([unit_ary_1, unit_ary_2])

        self.assertEqual(new_unit_ary.units, meters)