Example #1
0
        private static ObjectFormulaTree reduce(ObjectFormulaTree tree)
        {
            bool mult = false;

            if (tree.Operation is ElementaryBinaryOperation)
            {
                ElementaryBinaryOperation op = tree.Operation as ElementaryBinaryOperation;
                if (op.Symbol == '*')
                {
                    mult = true;
                }
            }
            if (mult)
            {
                PolyMult pm = new PolyMult();
                for (int i = 0; i < tree.Count; i++)
                {
                    pm.add(tree);
                }
                pm.repeatReduce();
                List <ObjectFormulaTree> list = new List <ObjectFormulaTree>(pm.l);
                pm.l.Clear();
                foreach (ObjectFormulaTree t in list)
                {
                    ObjectFormulaTree r = reduce(t);
                    list.Add(r);
                    pm.add(r);
                }
                return(new ObjectFormulaTree(pm, list));
            }

            List <ObjectFormulaTree> listr = new List <ObjectFormulaTree>();

            for (int i = 0; i < tree.Count; i++)
            {
                listr.Add(reduce(tree[i]));
            }
            return(new ObjectFormulaTree(tree.Operation, listr));
        }
Example #2
0
        internal static ObjectFormulaTree MultMult(ObjectFormulaTree tree)
        {
            List <ObjectFormulaTree> l = new List <ObjectFormulaTree>();

            for (int i = 0; i < tree.Count; i++)
            {
                ObjectFormulaTree tr = tree[i];
                // tr = ElementaryFormulaSimplification.Object.Simplify(tr);
                l.Add(MultMult(tr));
            }
            IObjectOperation op = tree.Operation;

            if (op is ElementaryBinaryOperation)
            {
                ElementaryBinaryOperation bo = op as ElementaryBinaryOperation;
                if (bo.Symbol == '*')
                {
                    List <ObjectFormulaTree> ll = new List <ObjectFormulaTree>();
                    PolyMult pm = new PolyMult();
                    foreach (ObjectFormulaTree t in l)
                    {
                        if (!(t.Operation is PolyMult))
                        {
                            pm.add(t);
                            ll.Add(t);
                            continue;
                        }
                        for (int i = 0; i < t.Count; i++)
                        {
                            pm.add(t[i]);
                            ll.Add(t[i]);
                        }
                    }
                    return(new ObjectFormulaTree(pm, ll));
                }
            }
            return(new ObjectFormulaTree(op, l));
        }
Example #3
0
        static internal ObjectFormulaTree simplify(ObjectFormulaTree tree, out bool simple)
        {
            //bool s = true;
            simple = true;
            List <ObjectFormulaTree> l = new List <ObjectFormulaTree>();

            for (int i = 0; i < tree.Count; i++)
            {
                ObjectFormulaTree t = simplifyRecursive(tree[i]);
                l.Add(t);
            }
            if (!(tree.Operation is PolyMult))
            {
                return(new ObjectFormulaTree(tree.Operation, l));
            }
            List <ObjectFormulaTree> consts = new List <ObjectFormulaTree>();
            List <ObjectFormulaTree> forms  = new List <ObjectFormulaTree>();

            for (int i = 0; i < tree.Count; i++)
            {
                if (ElementaryFormulaSimplification.IsConst(tree[i]))
                {
                    consts.Add(tree[i]);
                    continue;
                }
                forms.Add(tree[i]);
            }
            double a = 1;

            foreach (ObjectFormulaTree t in consts)
            {
                double x = (double)t.Result;
                a *= x;
            }
            if (a == 0)
            {
                ElementaryRealConstant x = new ElementaryRealConstant(0);
                simple = true;
                return(new ObjectFormulaTree(x, new List <ObjectFormulaTree>()));
            }
            if (a == 1)
            {
                PolyMult pm = new PolyMult();
                foreach (ObjectFormulaTree t in forms)
                {
                    pm.add(t);
                }
                if (consts.Count > 0)
                {
                    simple = false;
                }
                return(new ObjectFormulaTree(pm, forms));
            }
            if (consts.Count <= 1)
            {
                PolyMult pm = new PolyMult();
                pm.l = l;
                return(new ObjectFormulaTree(tree.Operation, l));
            }
            simple = false;
            ElementaryRealConstant   xx = new ElementaryRealConstant(a);
            ObjectFormulaTree        yy = new ObjectFormulaTree(xx, new List <ObjectFormulaTree>());
            List <ObjectFormulaTree> ll = new List <ObjectFormulaTree>();

            ll.Add(yy);
            ll.AddRange(forms);
            PolyMult pmm = new PolyMult();

            pmm.l = new List <ObjectFormulaTree>(ll);
            return(new ObjectFormulaTree(pmm, ll));
        }