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; } }
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); }
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); }