package edu.rice.hj.example.comp322.labs.lab2; import edu.rice.hj.api.HjMetrics; import edu.rice.hj.api.SuspendableException; import edu.rice.hj.runtime.config.HjSystemProperty; import edu.rice.hj.runtime.metrics.AbstractMetricsManager; import static edu.rice.hj.Module1.*; /** * ************************************************************ *

* Reads in two strings, the pattern and the input text, and searches for the pattern in the input text. *

* % hj Search rabrabracad abacadabrabracabracadabrabrabracad text: abacadabrabracabracadababacadabrabracabracadabrabrabracad * pattern: rabrabracad *

* HJ version ported from Java version in http://algs4.cs.princeton.edu/53substring/Brute.java.html * * @author Vivek Sarkar (vsarkar@rice.edu) *

* ************************************************************* */ public class Search2Sol { // return number of occurrences of pattern in text /** *

main.

* * @param args an array of {@link String} objects. */ public static void main(final String[] args) { // Setup metrics HjSystemProperty.abstractMetrics.set(true); launchHabaneroApp(() -> { final String default_pat = "rabrabracad"; final String default_txt = "abacadabrabracabracadababacadabrabracabracadabrabrabracad"; String pat = default_pat; String txt = default_txt; if (args.length >= 1) { pat = args[0]; } if (args.length >= 2) { txt = args[1]; } char[] pattern = pat.toCharArray(); char[] text = txt.toCharArray(); int count = search(pattern, text); // print results System.out.println("text: " + txt); System.out.println("pattern: " + pat); System.out.println("Number of occurrences: " + count); }, () -> { // Print out the metrics data final HjMetrics actualMetrics = abstractMetrics(); AbstractMetricsManager.dumpStatistics(actualMetrics); }); } // test client /** *

search.

* * @param pattern an array of char. * @param text an array of char. * @return a int. */ public static int search(char[] pattern, char[] text) throws SuspendableException { int M = pattern.length; int N = text.length; int[] counts = new int[N - M + 1]; // Array of counts finish(() -> { for (int i = 0; i <= N - M; i++) { final int ii = i; asyncNb(() -> { int j; for (j = 0; j < M; j++) { doWork(1); // Count each char comparison as 1 unit of work if (text[ii + j] != pattern[j]) { break; } } if (j == M) { counts[ii] = 1; } }); } }); int count = 0; for (int arrayCount : counts) { count += arrayCount; } return count; } }