Research Article

Approximate Bisimulation and Optimization of Software Programs Based on Symbolic-Numeric Computation

Algorithm 2

Approximate multithreading program.
#include “main.h”
WINMULTITHREAD Branch1Thread3(LPVOID pParam)
{PThreadArg tharg = (PThreadArg)pParam;
  double y1 = tharg->i1, y2 = tharg->i2;
  double z1 = MINIMUMVALUE, z2 = MINIMUMVALUE;
  do {
  do {
  if (((-(y1*y2 + 1)*(y1*y2 + 1) + 3*z1) > -APPZERO &&
  (-(y1*y2 + 1)*(y1*y2 + 1) + 3*z1) < APPZERO) &&
  ((-z1 + z2*(y1*y2 + 1)) > -APPZERO &&
  (-z1 + z2*(y1*y2 + 1)) < APPZERO)) {
  printf(“one solution of NLPS13 is z1 = %f, z2 = %fn”, z1, z2);
  }
  z2 += GRANULARITY;
  }while (z2 <= MAXIMUMVALUE);
  z1 += GRANULARITY;
  z2 = MINIMUMVALUE;
  } while (z1 <= MAXIMUMVALUE);
  return 0;
}
WINMULTITHREAD Branch1Thread4(LPVOID pParam)
{PThreadArg tharg = (PThreadArg)pParam;
  double y1 = tharg->i1, y2 = tharg->i2;
  double z1 = MINIMUMVALUE, z2 = MINIMUMVALUE;
  do {
  do {
  if (((y1*y1 - z1) > -APPZERO &&
  (y1*y1 - z1) < APPZERO) &&
  ((2*y1*y2 - z2) > -APPZERO &&
  (2*y1*y2 - z2) < APPZERO)) {
  printf(“one solution of NLPS14 is z1 = %f, z2 = %fn”, z1, z2);
  }
  z2 += GRANULARITY;
  }while (z2 <= MAXIMUMVALUE);
  z1 += GRANULARITY;
  z2 = MINIMUMVALUE;
  } while (z1 <= MAXIMUMVALUE);
  return 0;
}
WINMULTITHREAD Branch1Thread2(LPVOID pParam)
{HANDLE hThread13 = NULL, hThread14 = NULL;
  PThreadArg tharg = (PThreadArg)pParam;
  ThreadArg tharg12 = {0};
  double x1 = tharg->i1, x2 = tharg->i2;
  double y1 = MINIMUMVALUE, y2 = MINIMUMVALUE;
  do {
  do {
  if (((3*x1 - y1*y1 + x2) > -APPZERO &&
  (3*x1 - y1*y1 + x2) < APPZERO) &&
  ((x2 - y2*y1) > -APPZERO &&
  (x2 - y2*y1) < APPZERO)) {
  printf(“one solution of NLPS12 is y1 = %f, y2 = %fn”, y1, y2);
  tharg12.i1 = y1;
  tharg12.i2 = y2;
  hThread13 = CreateThread(NULL, 0, Branch1Thread3,
         (LPVOID)&tharg12, 0, NULL);
  hThread14 = CreateThread(NULL, 0, Branch1Thread4,
    (LPVOID)&tharg12, 0, NULL);
  WaitForSingleObject(hThread13, INFINITE);
  WaitForSingleObject(hThread14, INFINITE);
  CloseHandle(hThread13);
  CloseHandle(hThread14);
  }
  y2 += GRANULARITY;
  }while (y2 <= MAXIMUMVALUE);
  y1 += GRANULARITY;
  y2 = MINIMUMVALUE;
  } while (y1 <= MAXIMUMVALUE);
  return 0;
}
WINMULTITHREAD Branch1Thread1(LPVOID pParam)
{HANDLE hThread12 = NULL;
  PThreadArg tharg = (PThreadArg)pParam;
  ThreadArg tharg11 = {0};
  double m1 = tharg->i1, m2 = tharg->i2;
  double x1 = MINIMUMVALUE, x2 = MINIMUMVALUE;
  do {
  do {
  if (((m2*m2 - x1) > -APPZERO &&
  (m2*m2 - x1) < APPZERO) &&
  ((2*m1*m2 + x2) > -APPZERO &&
  (2*m1*m2 + x2) < APPZERO)) {
  printf(“one solution of NLPS11 is x1 = %f, x2 = %fn”, x1, x2);
  tharg11.i1 = x1;
  tharg11.i2 = x2;
  hThread12 = CreateThread(NULL, 0, Branch1Thread2,
         (LPVOID)&tharg11, 0, NULL);
  WaitForSingleObject(hThread12, INFINITE);
  CloseHandle(hThread12);
  }
  x2 += GRANULARITY;
  }while (x2 <= MAXIMUMVALUE);
  x1 += GRANULARITY;
  x2 = MINIMUMVALUE;
  } while (x1 <= MAXIMUMVALUE);
  return 0;
}
int main()
{LARGE_INTEGER litc, litStart, litEnd;
  HANDLE hThread1 = NULL;
  ThreadArg iTharg = {0};
  printf(“Please enter the value of input m1 = ”);
  scanf(“%lf”, &iTharg.i1);
  printf(“Please enter the value of input m2 = ”);
  scanf(“%lf”, &iTharg.i2);
  QueryPerformanceFrequency(&litc);
  QueryPerformanceCounter(&litStart);
  hThread1 = CreateThread(NULL, 0, Branch1Thread1,
        (LPVOID)&iTharg, 0, NULL);
  WaitForSingleObject(hThread1, INFINITE);
  QueryPerformanceCounter(&litEnd);
  printf(“Execution time is %fsn”, (double)
  (litEnd.QuadPart - litStart.QuadPart)/litc.QuadPart);
  return 0;
}