private double differenceAverage(Vd2_3MapData loc, Vd2_3MapData unknownStat) {
   double res = 0;
   int cnt = 0;
   for (APStatistic ap : loc.getStatistics().values()) {
     if (ap.variance < SMALL_VARIANCE) {
       for (APStatistic curAP : unknownStat.getStatistics().values()) {
         if (ap.accessPoint.equals(curAP.accessPoint) && curAP.variance < SMALL_VARIANCE) {
           res += (ap.average - curAP.average) * (ap.average - curAP.average);
           ++cnt;
         }
       }
     }
   }
   if (cnt != 0) {
     return -res / cnt;
   } else return Double.NEGATIVE_INFINITY;
 }
 private double nMissingLowVariance(Vd2_3MapData loc, Vd2_3MapData unknownStat) {
   double res = 0;
   for (APStatistic ap : loc.getStatistics().values()) {
     if (ap.variance < SMALL_VARIANCE) {
       boolean ok = false;
       for (APStatistic curAP : unknownStat.getStatistics().values()) {
         if (ap.accessPoint.equals(curAP.accessPoint) && curAP.variance < SMALL_VARIANCE) {
           ok = true;
           break;
         }
       }
       if (!ok) {
         --res;
       }
     }
   }
   return res;
 }
  public void callMapdataFunction(ObjectInputStream in, ObjectOutputStream out) {
    MapData mapData;
    try {
      mapData = (MapData) in.readObject();

      if (mapData instanceof WifiMapData || mapData instanceof Vd2_3MapData) {
        LocationDatabaseObject locationDatabaseObject =
            ServerAPI.searchLocationByLocationId(mapData.getLocationId());

        LocationDatabaseObject rootLocation =
            LocationDataManagement.getRootLocationByLocationObject(locationDatabaseObject);
        Long rootLocationMAC = rootLocation.getMacaddressIDForBuildDevice();
        Long newMapMAC;

        if (mapData instanceof WifiMapData) {
          newMapMAC = ((WifiMapData) mapData).getScannerMAC();
        } else {
          newMapMAC = ((Vd2_3MapData) mapData).getScannerMAC();
        }

        System.out.println(rootLocationMAC + " : " + newMapMAC);
        out.writeBoolean(rootLocationMAC.compareTo(newMapMAC) != 0);
        out.flush();

        boolean replaceRootMAC = in.readBoolean();

        if (!replaceRootMAC) {
          out.writeBoolean(true);
          out.flush();
          return;
        }

        if (rootLocationMAC.compareTo(newMapMAC) != 0) {
          System.out.println(rootLocationMAC + " : " + newMapMAC);
          if (mapData instanceof Vd2_3MapData) {
            Vd2_3MapData vd2_3MapData = (Vd2_3MapData) mapData;
            if (rootLocation.getMacaddressIDForBuildDevice() == 0
                || rootLocation.getMacaddressIDForBuildDevice() != vd2_3MapData.getScannerMAC()) {
              rootLocation.setMacaddressIDForBuildDevice(vd2_3MapData.getScannerMAC());
              LocationDataManagement.updateLocation(rootLocation);
            }
          } else if (mapData instanceof WifiMapData) {
            WifiMapData wifiMapData = (WifiMapData) mapData;
            if (rootLocation.getMacaddressIDForBuildDevice() == 0
                || rootLocation.getMacaddressIDForBuildDevice() != wifiMapData.getScannerMAC()) {
              rootLocation.setMacaddressIDForBuildDevice(wifiMapData.getScannerMAC());
              LocationDataManagement.updateLocation(rootLocation);
            }
          }

          // need implement delete all wifi map
          String dataTypeId =
              ServerAPI.getDataTypeIdByDataTypeClassName(Vd2_3MapData.class.getName());
          LocationDataManagement.deleleAllMapData(rootLocation, dataTypeId);
          dataTypeId = ServerAPI.getDataTypeIdByDataTypeClassName(WifiMapData.class.getName());
          LocationDataManagement.deleleAllMapData(rootLocation, dataTypeId);
        }
      }

      String datatypeId =
          ServerAPI.getDataTypeIdByDataTypeClassName(mapData.getDataTypeClassName());
      File dirUser = new File(ServerConfig.dirData + "/" + mapData.getUserId() + "/");
      if (!dirUser.exists()) {
        dirUser.mkdirs();
      }
      MapData.writeMapData(
          mapData,
          dirUser.getAbsolutePath()
              + "/"
              + mapData.getLocationId()
              + "_"
              + datatypeId
              + ServerConfig.extensionMapDataFile);

      if (mapData instanceof WifiMapData || mapData instanceof Vd2_3MapData) {
        EntityManager entityManager =
            LocalizationDataManager.getEntityManagerFactory().createEntityManager();
        LocationDatabaseObject locationDatabaseObject =
            ServerAPI.searchLocationByLocationId(mapData.getLocationId());
        ArrayList<Long> listMacAddress = new ArrayList<Long>();

        if (mapData instanceof WifiMapData) {
          WifiMapData wifiMapData = (WifiMapData) mapData;
          for (ScanningPoint scanningPoint : wifiMapData.getSpsList()) {
            for (AccessPoint accessPoint : scanningPoint.getApsList()) {
              if (!listMacAddress.contains(accessPoint.getMACAddress())) {
                listMacAddress.add(accessPoint.getMACAddress());
              }
            }
          }
        } else {
          Vd2_3MapData vd2_3MapData = (Vd2_3MapData) mapData;
          for (APStatistic apStatistic : vd2_3MapData.getStatistics().values()) {
            if (!listMacAddress.contains(apStatistic.accessPoint.getMACAddress())) {
              listMacAddress.add(apStatistic.accessPoint.getMACAddress());
            }
          }
        }

        MacAddressDatabaseObject macAddress = null;
        // Boolean checkReAdd = false;
        for (Long strMACAddress : listMacAddress) {
          macAddress = ServerAPI.searchMacAddressByID(strMACAddress);
          // entityManager.getTransaction().begin();

          if (macAddress == null) {
            System.out.println("macAddress = null");
            macAddress = new MacAddressDatabaseObject();
            macAddress.setMacAddressId(strMACAddress);
            entityManager.persist(macAddress);
            macAddress.setLocations(new ArrayList<LocationDatabaseObject>());
            System.out.println("end add");
            // checkReAdd = true;
          }

          boolean contains = false;

          for (LocationDatabaseObject locationDatabaseObject2 : macAddress.getLocations()) {
            // System.out.println(locationDatabaseObject2.getLocationId());
            if (locationDatabaseObject2
                .getLocationId()
                .equals(locationDatabaseObject.getLocationId())) {
              contains = true;
            }
          }

          if (!contains) {
            System.out.println(
                macAddress.getMacAddressId() + ":" + locationDatabaseObject.getLocationId());
            macAddress.getLocations().add(locationDatabaseObject);
            macAddress.addLocation(locationDatabaseObject.getLocationId());
            // LocationDataManagement.updateLocation(location);
            // entityManager.merge(macAddress);
          }
        }
        // entityManager.getTransaction().commit();
      }

      out.writeBoolean(true);
      out.flush();
      // System.out.println("++++++++++++++++++++++++++++++");
      return;
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (ClassNotFoundException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

    try {
      out.writeBoolean(false);
      out.flush();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }