예제 #1
0
            public static void Run()
            {
                Z3Point3D constPoint = Z3Point3D.MkZ3Const("const"); // ("const X", "const Y", "const Z")

                Z3Point3D normalized = new Z3Point3D();

                ArithExpr higherCoord =
                    Z3Math.Max(
                        Z3Math.Max(
                            Z3Math.Abs(constPoint.X),
                            Z3Math.Abs(constPoint.Y)),
                        Z3Math.Abs(constPoint.Z));

                normalized.X = Z3.Context.MkDiv(constPoint.X, constPoint.Y);
                normalized.Y = Z3Math.One;//Z3.Context.MkDiv(constPoint.Y, higherCoord);
                normalized.Z = Z3.Context.MkDiv(constPoint.Z, constPoint.Y);

                normalized.X = CalcApproximateCoordFromManhattanToEuclidianSystem(normalized.X, normalized.Y, normalized.Z);
                normalized.Y = CalcApproximateCoordFromManhattanToEuclidianSystem(normalized.Y, normalized.X, normalized.Z);
                normalized.Z = CalcApproximateCoordFromManhattanToEuclidianSystem(normalized.Z, normalized.Y, normalized.X);

                Z3Point3D up      = Z3Point3D.DirectionPoint(Direction.Up); // (0, 1, 0)
                Z3Point3D distVec = normalized - up;

                ArithExpr distance =
                    Max(
                        Abs(CalcApproximateCoordFromManhattanToEuclidianSystem(distVec.X, distVec.Y, distVec.Z)),
                        Abs(CalcApproximateCoordFromManhattanToEuclidianSystem(distVec.Y, distVec.X, distVec.Z)),
                        Abs(CalcApproximateCoordFromManhattanToEuclidianSystem(distVec.Z, distVec.Y, distVec.X)));

                BoolExpr expr = Z3.Context.MkLt(distance, Z3.Context.MkReal(1, 2));


                Solver solver = Z3.Context.MkSolver();

                solver.Assert(expr);
                Status     status = solver.Check();
                Statistics stats  = solver.Statistics;

                switch (status)
                {
                case Status.UNKNOWN:
                    Console.WriteLine("Solver check for witness returned Status.UNKNOWN because: " + solver.ReasonUnknown);
                    throw new ArgumentException("Test Failed Expception");

                case Status.UNSATISFIABLE:
                    Console.WriteLine("There is no valid witness for " + expr);
                    throw new ArgumentException("Test Failed Expception");

                case Status.SATISFIABLE:
                    Console.WriteLine("OK, model: " + solver.Model);
                    break;
                }
            }
예제 #2
0
        public static Z3Body MkZ3Const()
        {
            Z3Body result = new Z3Body();

            var jointTypes = EnumUtil.GetValues <JointType>();

            foreach (var jointType in jointTypes)
            {
                result.Joints.Add(jointType, Z3Point3D.MkZ3Const(jointType.ToString()));
                result.Norms.Add(jointType, Z3.Context.MkRealConst(jointType.ToString() + " Norm"));
            }

            return(result);
        }
예제 #3
0
        public static Z3Body MkZ3Const()
        {
            var result = new Z3Body();

            var jointTypes = EnumUtil.GetValues <JointType>();

            foreach (var jointType in jointTypes)
            {
                result.Joints.Add(jointType, Z3Point3D.MkZ3Const(EnumUtil.GetDescription <JointType>(jointType)));
            }

            result.Norms.Add(JointType.SpineMid, Z3Math.Real(0.3));
            result.Norms.Add(JointType.SpineShoulder, Z3Math.Real(0.3));
            result.Norms.Add(JointType.ShoulderLeft, Z3Math.Real(0.2));
            result.Norms.Add(JointType.ElbowLeft, Z3Math.Real(0.2));
            result.Norms.Add(JointType.WristLeft, Z3Math.Real(0.2));
            result.Norms.Add(JointType.HandLeft, Z3Math.Real(0.1));
            result.Norms.Add(JointType.HandTipLeft, Z3Math.Real(0.1));
            result.Norms.Add(JointType.ThumbLeft, Z3Math.Real(0.1));
            result.Norms.Add(JointType.Neck, Z3Math.Real(0.1));
            result.Norms.Add(JointType.Head, Z3Math.Real(0.2));
            result.Norms.Add(JointType.ShoulderRight, Z3Math.Real(0.2));
            result.Norms.Add(JointType.ElbowRight, Z3Math.Real(0.2));
            result.Norms.Add(JointType.WristRight, Z3Math.Real(0.2));
            result.Norms.Add(JointType.HandRight, Z3Math.Real(0.1));
            result.Norms.Add(JointType.HandTipRight, Z3Math.Real(0.1));
            result.Norms.Add(JointType.ThumbRight, Z3Math.Real(0.1));
            result.Norms.Add(JointType.SpineBase, Z3Math.Real(0.0));
            result.Norms.Add(JointType.HipLeft, Z3Math.Real(0.2));
            result.Norms.Add(JointType.KneeLeft, Z3Math.Real(0.3));
            result.Norms.Add(JointType.AnkleLeft, Z3Math.Real(0.3));
            result.Norms.Add(JointType.FootLeft, Z3Math.Real(0.1));
            result.Norms.Add(JointType.HipRight, Z3Math.Real(0.2));
            result.Norms.Add(JointType.KneeRight, Z3Math.Real(0.3));
            result.Norms.Add(JointType.AnkleRight, Z3Math.Real(0.3));
            result.Norms.Add(JointType.FootRight, Z3Math.Real(0.1));

            return(result);
        }