Пример #1
0
 def test_print_node(self):
     checks = [
         'a', 'a+b', 'a-b', 'a*b', 'a/b', 'a-(b-c)', 'a+b*c', 'a[0]',
         'a[0::]', 'a[:0:]', 'a[::0]', 'a[(0,0)]', 'a[::,0]', 'a[0,::]'
     ]
     for check in checks:
         node = ast.parse(check, mode='eval')
         self.assertEqual(check, print_node(node))
Пример #2
0
 def test_print_node(self):
     checks = [
         'a',
         'a+b',
         'a-b',
         'a*b',
         'a/b',
         'a-(b-c)',
         'a+b*c',
     ]
     for check in checks:
         node = ast.parse(check, mode='eval')
         self.assertEqual(check, print_node(node))
 def test_print_node(self):
     checks = [
         'a',
         'a+b',
         'a-b',
         'a*b',
         'a/b',
         'a-(b-c)',
         'a+b*c',
         ]
     for check in checks:
         node = ast.parse(check, mode='eval')
         self.assertEqual(check, print_node(node))
 def test_print_node(self):
     checks = [
         'a',
         'a+b',
         'a-b',
         'a*b',
         'a/b',
         'a-(b-c)',
         'a+b*c',
         'a[0]',
         'a[0::]',
         'a[:0:]',
         'a[::0]',
         'a[(0,0)]',
         'a[::,0]',
         'a[0,::]'
         ]
     for check in checks:
         node = ast.parse(check, mode='eval')
         self.assertEqual(check, print_node(node))
Пример #5
0
    def __init__(self,
                 parent,
                 srcexpr,
                 destexpr=None,
                 translate=True,
                 pseudo_type=None):
        if destexpr is None:
            destexpr = DummyExpr()
        self.name = _get_new_name()
        self._inmap = {}  # mapping of component vars to our inputs
        self._meta = {}
        self._valid = False
        self._parent = parent
        self._inputs = []
        self.force_fd = False
        self._provideJ_bounds = None
        self._pseudo_type = pseudo_type  # a string indicating the type of pseudocomp
        # this is, e.g., 'units', 'constraint', 'objective',
        # or 'multi_var_expr'
        self._orig_src = srcexpr.text
        self._orig_dest = destexpr.text
        self.Jsize = None

        varmap = {}
        rvarmap = {}
        for i, ref in enumerate(srcexpr.refs()):
            in_name = 'in%d' % i
            self._inputs.append(in_name)
            self._inmap[ref] = in_name
            varmap[ref] = in_name
            rvarmap.setdefault(_get_varname(ref), set()).add(ref)
            setattr(self, in_name, None)

        refs = list(destexpr.refs())
        if refs:
            if len(refs) == 1:
                setattr(self, 'out0', None)
            else:
                raise RuntimeError(
                    "output of PseudoComponent must reference only one variable"
                )
        varmap[refs[0]] = 'out0'
        rvarmap.setdefault(_get_varname(refs[0]), set()).add(refs[0])

        for name, meta in srcexpr.get_metadata():
            for rname in rvarmap[name]:
                self._meta[varmap[rname]] = meta

        for name, meta in destexpr.get_metadata():
            for rname in rvarmap[name]:
                self._meta[varmap[rname]] = meta

        if translate:
            xformed_src = transform_expression(srcexpr.text, self._inmap)
        else:
            xformed_src = srcexpr.text

        out_units = self._meta['out0'].get('units')
        pq = None
        if out_units is not None:
            # evaluate the src expression using UnitsOnlyPQ objects

            tmpdict = {}

            # First, replace values with UnitsOnlyPQ objects
            for inp in self._inputs:
                units = self._meta[inp].get('units')
                if units:
                    tmpdict[inp] = UnitsOnlyPQ(0., units)
                else:
                    tmpdict[inp] = 0.

            pq = eval(xformed_src, _expr_dict, tmpdict)
            self._srcunits = pq.unit

            unitnode = ast.parse(xformed_src)
            try:
                unitxform = unit_xform(unitnode, self._srcunits, out_units)
            except Exception as err:
                raise TypeError("Incompatible units for '%s' and '%s': %s" %
                                (srcexpr.text, destexpr.text, err))
            unit_src = print_node(unitxform)
            xformed_src = unit_src
        else:
            self._srcunits = None

        self._srcexpr = ConnectedExprEvaluator(xformed_src, scope=self)

        # this is just the equation string (for debugging)
        if self._orig_dest:
            self._outdests = [self._orig_dest]
            if pq is None:
                sunit = dunit = ''
            else:
                sunit = "'%s'" % pq.get_unit_name()
                dunit = "'%s'" % out_units
            self._orig_expr = "%s %s -> %s %s" % (self._orig_src, sunit,
                                                  self._orig_dest, dunit)
        else:
            self._outdests = []
            self._orig_expr = self._orig_src

        #if destexpr and destexpr.text:
        #out = destexpr.text
        #else:
        #out = 'out0'
        #if translate:
        #src = transform_expression(self._srcexpr.text,
        #_invert_dict(self._inmap))
        #else:
        #src = self._srcexpr.text

        #self._expr_conn = (src, out)  # the actual expression connection

        self.missing_deriv_policy = 'error'
Пример #6
0
    def __init__(self, parent, srcexpr, destexpr=None, translate=True, pseudo_type=None):
        if destexpr is None:
            destexpr = DummyExpr()
        self.name = _get_new_name()
        self._inmap = {} # mapping of component vars to our inputs
        self._meta = {}
        self._valid = False
        self._parent = parent
        self._inputs = []
        self.force_fd = False
        self._provideJ_bounds = None
        self._pseudo_type = pseudo_type # a string indicating the type of pseudocomp
                                        # this is, e.g., 'units', 'constraint', 'objective',
                                        # or 'multi_var_expr'
        self._orig_src = srcexpr.text
        self._orig_dest = destexpr.text
        self.Jsize = None

        if destexpr.text:
            self._outdests = [destexpr.text]
        else:
            self._outdests = []

        varmap = {}
        rvarmap = {}
        for i,ref in enumerate(srcexpr.refs()):
            in_name = 'in%d' % i
            self._inputs.append(in_name)
            self._inmap[ref] = in_name
            varmap[ref] = in_name
            rvarmap.setdefault(_get_varname(ref), set()).add(ref)
            setattr(self, in_name, None)

        refs = list(destexpr.refs())
        if refs:
            if len(refs) == 1:
                setattr(self, 'out0', None)
            else:
                raise RuntimeError("output of PseudoComponent must reference only one variable")
        varmap[refs[0]] = 'out0'
        rvarmap.setdefault(_get_varname(refs[0]), set()).add(refs[0])

        for name, meta in srcexpr.get_metadata():
            for rname in rvarmap[name]:
                self._meta[varmap[rname]] = meta

        for name, meta in destexpr.get_metadata():
            for rname in rvarmap[name]:
                self._meta[varmap[rname]] = meta

        if translate:
            xformed_src = transform_expression(srcexpr.text, self._inmap)
        else:
            xformed_src = srcexpr.text

        out_units = self._meta['out0'].get('units')
        if out_units is not None:
            # evaluate the src expression using UnitsOnlyPQ objects

            tmpdict = {}

            # First, replace values with UnitsOnlyPQ objects
            for inp in self._inputs:
                units = self._meta[inp].get('units')
                if units:
                    tmpdict[inp] = UnitsOnlyPQ(0., units)
                else:
                    tmpdict[inp] = 0.

            pq = eval(xformed_src, _expr_dict, tmpdict)
            self._srcunits = pq.unit

            unitnode = ast.parse(xformed_src)
            try:
                unitxform = unit_xform(unitnode, self._srcunits, out_units)
            except Exception as err:
                raise TypeError("Incompatible units for '%s' and '%s': %s" % (srcexpr.text,
                                                                    destexpr.text, err))
            unit_src = print_node(unitxform)
            xformed_src = unit_src
        else:
            self._srcunits = None

        self._srcexpr = ConnectedExprEvaluator(xformed_src, scope=self)

        # this is just the equation string (for debugging)
        if destexpr and destexpr.text:
            out = destexpr.text
        else:
            out = 'out0'
        if translate:
            src = transform_expression(self._srcexpr.text,
                                       _invert_dict(self._inmap))
        else:
            src = self._srcexpr.text

        self._expr_conn = (src, out)  # the actual expression connection

        self.missing_deriv_policy = 'error'
Пример #7
0
 def test_scaler_adder_conversion(self):
     node = ast.parse('a')
     cnv = unit_xform(node, 'degC', 'degF')
     newexpr = print_node(cnv)
     self.assertEqual(newexpr, '(a+17.7777777778)*1.8')
Пример #8
0
 def test_simple_conversion(self):
     node = ast.parse('a')
     cnv = unit_xform(node, 'ft', 'inch')
     newexpr = print_node(cnv)
     self.assertEqual(newexpr, 'a*12.0')
Пример #9
0
    def __init__(self, parent, srcexpr, destexpr=None,
                 translate=True, pseudo_type=None, subtype=None,
                 exprobject=None):
        if destexpr is None:
            destexpr = DummyExpr()
        self._parent = None
        self.parent = parent
        self.name = _get_new_name(parent)
        self._inmap = {}  # mapping of component vars to our inputs
        self._meta = {}
        self._inputs = []

        # Flags and caching used by the derivatives calculation
        self.force_fd = False
        self._provideJ_bounds = None

        self._pseudo_type = pseudo_type  # a string indicating the type of pseudocomp
                                         # this is, e.g., 'units', 'constraint', 'objective',
                                         # or 'multi_var_expr'
        self._subtype = subtype  # for constraints, 'equality' or 'inequality'

        self._exprobj = exprobject  # object responsible for creation of this pcomp, e.g. a Constraint

        self._orig_src = srcexpr.text
        self._orig_dest = destexpr.text
        self.Jsize = None
        self.mpi = MPI_info()

        varmap = {}
        rvarmap = {}
        for i, ref in enumerate(srcexpr.ordered_refs()):
            in_name = 'in%d' % i
            self._inputs.append(in_name)
            self._inmap[ref] = in_name
            varmap[ref] = in_name
            rvarmap.setdefault(_get_varname(ref), set()).add(ref)
            setattr(self, in_name, 0.)

        refs = list(destexpr.refs())
        if refs:
            if len(refs) == 1:
                setattr(self, 'out0', None)
            else:
                raise RuntimeError("output of PseudoComponent must reference"
                                   " only one variable")
        varmap[refs[0]] = 'out0'
        rvarmap.setdefault(_get_varname(refs[0]), set()).add(refs[0])

        noflat = False
        for name, meta in srcexpr.get_metadata():

            # If any input is noflat, then the output must be too.
            if 'noflat' in meta:
                noflat = True
            for rname in rvarmap[name]:
                self._meta[varmap[rname]] = meta

        for name, meta in destexpr.get_metadata():
            if noflat and 'noflat' not in meta:
                meta['noflat'] = True
            for rname in rvarmap[name]:
                self._meta[varmap[rname]] = meta

        if translate:
            xformed_src = transform_expression(srcexpr.text, self._inmap)
        else:
            xformed_src = srcexpr.text

        out_units = self._meta['out0'].get('units')
        pq = None
        if out_units is not None:
            # evaluate the src expression using UnitsOnlyPQ objects

            tmpdict = {}

            # First, replace values with UnitsOnlyPQ objects
            for inp in self._inputs:
                units = self._meta[inp].get('units')
                if units:
                    tmpdict[inp] = UnitsOnlyPQ(0., units)
                else:
                    tmpdict[inp] = 0.

            pq = eval(xformed_src, _expr_dict, tmpdict)
            self._srcunits = pq.unit

            unitnode = ast.parse(xformed_src)
            try:
                unitxform = unit_xform(unitnode, self._srcunits, out_units)
            except Exception as err:
                raise TypeError("Incompatible units for '%s' and '%s': %s"
                                % (srcexpr.text, destexpr.text, err))
            unit_src = print_node(unitxform)
            xformed_src = unit_src
        else:
            self._srcunits = None

        self._srcexpr = ConnectedExprEvaluator(xformed_src,
                                               scope=self)

        # this is just the equation string (for debugging)
        if self._orig_dest:
            self._outdests = [self._orig_dest]
            if pq is None:
                sunit = dunit = ''
            else:
                sunit = "'%s'" % pq.get_unit_name()
                dunit = "'%s'" % out_units
            self._orig_expr = "%s %s -> %s %s" % (self._orig_src, sunit,
                                                  self._orig_dest, dunit)
        else:
            self._outdests = []
            self._orig_expr = self._orig_src

        self.missing_deriv_policy = 'error'
        self._negate = False
Пример #10
0
 def test_scaler_adder_conversion(self):
     node = ast.parse('a')
     cnv = unit_xform(node, 'degC', 'degF')
     newexpr = print_node(cnv)
     self.assertEqual(newexpr, '(a+17.7777777778)*1.8')
Пример #11
0
 def test_simple_conversion(self):
     node = ast.parse('a')
     cnv = unit_xform(node, 'ft', 'inch')
     newexpr = print_node(cnv)
     self.assertEqual(newexpr, 'a*12.0')