public static MultiVariatePieceWiseLinearFunction createSenseSleepFunction(
      ScenarioProperties scenario,
      List<SensorProperties> sensorProperties,
      double overlappingArea) {
    System.out.println(
        "Creating continuous sense sleep function with " + sensorProperties.size() + " dimensions");

    NCube domain = createDomain(sensorProperties, scenario);

    if (sensorProperties.size() == 1) {
      return MultiVariatePieceWiseLinearFunctionUtilities.createConstantFunction(
          domain, overlappingArea * sensorProperties.iterator().next().getSenseIntervalLength());
    }

    // max(0, min(x1 + l1, x2 + l2) - max(x1, x2))
    MultiVariatePieceWiseLinearFunction zero =
        MultiVariatePieceWiseLinearFunctionUtilities.createZeroFunction(domain);

    // double l = scenario.getScheduleIntervalLength();

    MultiVariatePieceWiseLinearFunction maxStart = createMaxStartFunction(domain);

    MultiVariatePieceWiseLinearFunction minEnd = createMinEndFunction(domain, sensorProperties);

    MultiVariatePieceWiseLinearFunction minMinusMax = minEnd.subtract(maxStart);

    MultiVariatePieceWiseLinearFunction overlap = minMinusMax.max(zero);

    // MultiVariatePieceWiseLinearFunction result =
    // overlap.add(-l).multiply(
    // -1.0);

    MultiVariatePieceWiseLinearFunction result = overlap;

    for (SensorProperties properties : sensorProperties) {
      result = result.add(-properties.getSenseIntervalLength());
    }

    result = result.multiply(-1);

    return result.multiply(overlappingArea);
  }