From 690105b6752ccf104379174bbdb5c8b15465f0a1 Mon Sep 17 00:00:00 2001 From: Guillaume Martres Date: Tue, 19 Feb 2019 20:44:23 +0100 Subject: [PATCH] Add scalashop assignment --- .gitignore | 16 + .gitlab-ci.yml | 36 ++ .vscode/settings.json | 8 + assignment.sbt | 9 + build.sbt | 13 + grading-tests.jar | Bin 0 -> 30248 bytes project/MOOCSettings.scala | 46 +++ project/StudentTasks.scala | 318 ++++++++++++++++++ project/build.properties | 1 + project/buildSettings.sbt | 5 + project/plugins.sbt | 2 + src/main/resources/scalashop/scala.jpg | Bin 0 -> 121271 bytes .../scala/scalashop/HorizontalBoxBlur.scala | 60 ++++ src/main/scala/scalashop/Interfaces.scala | 18 + src/main/scala/scalashop/PhotoCanvas.scala | 85 +++++ src/main/scala/scalashop/ScalaShop.scala | 140 ++++++++ .../scala/scalashop/VerticalBoxBlur.scala | 60 ++++ src/main/scala/scalashop/package.scala | 100 ++++++ src/test/scala/scalashop/BlurSuite.scala | 11 + 19 files changed, 928 insertions(+) create mode 100644 .gitignore create mode 100644 .gitlab-ci.yml create mode 100644 .vscode/settings.json create mode 100644 assignment.sbt create mode 100644 build.sbt create mode 100644 grading-tests.jar create mode 100644 project/MOOCSettings.scala create mode 100644 project/StudentTasks.scala create mode 100644 project/build.properties create mode 100644 project/buildSettings.sbt create mode 100644 project/plugins.sbt create mode 100644 src/main/resources/scalashop/scala.jpg create mode 100644 src/main/scala/scalashop/HorizontalBoxBlur.scala create mode 100644 src/main/scala/scalashop/Interfaces.scala create mode 100644 src/main/scala/scalashop/PhotoCanvas.scala create mode 100644 src/main/scala/scalashop/ScalaShop.scala create mode 100644 src/main/scala/scalashop/VerticalBoxBlur.scala create mode 100644 src/main/scala/scalashop/package.scala create mode 100644 src/test/scala/scalashop/BlurSuite.scala diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..349d2e8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +# General +*.DS_Store +*.swp +*~ + +# Dotty +*.class +*.tasty +*.hasTasty + +# sbt +target/ + +# Dotty IDE +/.dotty-ide-artifact +/.dotty-ide.json diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..9298298 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,36 @@ +# DO NOT EDIT THIS FILE + +stages: + - build + - grade + +compile: + stage: build + image: lampepfl/moocs:dotty-2020-02-12 + except: + - tags + tags: + - cs206 + script: + - sbt packageSubmission + artifacts: + expire_in: 1 day + paths: + - submission.jar + +grade: + stage: grade + except: + - tags + tags: + - cs206 + image: + name: smarter3/moocs:parprog1-scalashop-2020-02-17 + entrypoint: [""] + allow_failure: true + before_script: + - mkdir -p /shared/submission/ + - cp submission.jar /shared/submission/submission.jar + script: + - cd /grader + - /grader/grade | /grader/feedback-printer diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..a35362b --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "dotty": { + "trace": { + "remoteTracingUrl": "wss://lamppc36.epfl.ch/dotty-remote-tracer/upload/lsp.log", + "server": { "format": "JSON", "verbosity": "verbose" } + } + } +} diff --git a/assignment.sbt b/assignment.sbt new file mode 100644 index 0000000..a395cb4 --- /dev/null +++ b/assignment.sbt @@ -0,0 +1,9 @@ +// Student tasks (i.e. submit, packageSubmission) +enablePlugins(StudentTasks) + +courseraId := ch.epfl.lamp.CourseraId( + key = "OpSNmtC1EeWvXAr2bF16EQ", + itemId = "MhXvy", + premiumItemId = Some("NeGTv"), + partId = "Q2e1P" +) diff --git a/build.sbt b/build.sbt new file mode 100644 index 0000000..f2b85db --- /dev/null +++ b/build.sbt @@ -0,0 +1,13 @@ +course := "parprog1" +assignment := "scalashop" + +scalaVersion := "0.23.0-bin-20200211-5b006fb-NIGHTLY" +scalacOptions ++= Seq("-language:implicitConversions", "-deprecation") +libraryDependencies ++= Seq( + "com.storm-enroute" %% "scalameter-core" % "0.19", + "org.scala-lang.modules" %% "scala-parallel-collections" % "0.2.0", + "com.novocode" % "junit-interface" % "0.11" % Test +).map(_.withDottyCompat(scalaVersion.value)) + +testOptions in Test += Tests.Argument(TestFrameworks.JUnit, "-a", "-v", "-s") +testSuite := "scalashop.BlurSuite" diff --git a/grading-tests.jar b/grading-tests.jar new file mode 100644 index 0000000000000000000000000000000000000000..39155895775d3aab026f8698413127258c28d171 GIT binary patch literal 30248 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 I?vHQ(51cV%Gynhq literal 0 HcmV?d00001 diff --git a/project/MOOCSettings.scala b/project/MOOCSettings.scala new file mode 100644 index 0000000..171244f --- /dev/null +++ b/project/MOOCSettings.scala @@ -0,0 +1,46 @@ +package ch.epfl.lamp + +import sbt._ +import sbt.Keys._ + +/** + * Coursera uses two versions of each assignment. They both have the same assignment key and part id but have + * different item ids. + * + * @param key Assignment key + * @param partId Assignment partId + * @param itemId Item id of the non premium version + * @param premiumItemId Item id of the premium version (`None` if the assignment is optional) + */ +case class CourseraId(key: String, partId: String, itemId: String, premiumItemId: Option[String]) + +/** + * Settings shared by all assignments, reused in various tasks. + */ +object MOOCSettings extends AutoPlugin { + + object autoImport { + val course = SettingKey[String]("course") + val assignment = SettingKey[String]("assignment") + val options = SettingKey[Map[String, Map[String, String]]]("options") + val courseraId = settingKey[CourseraId]("Coursera-specific information identifying the assignment") + val testSuite = settingKey[String]("Fully qualified name of the test suite of this assignment") + // Convenient alias + type CourseraId = ch.epfl.lamp.CourseraId + val CourseraId = ch.epfl.lamp.CourseraId + } + + import autoImport._ + + override val globalSettings: Seq[Def.Setting[_]] = Seq( + // supershell is verbose, buggy and useless. + useSuperShell := false + ) + + override val projectSettings: Seq[Def.Setting[_]] = Seq( + parallelExecution in Test := false, + // Report test result after each test instead of waiting for every test to finish + logBuffered in Test := false, + name := s"${course.value}-${assignment.value}" + ) +} diff --git a/project/StudentTasks.scala b/project/StudentTasks.scala new file mode 100644 index 0000000..7604830 --- /dev/null +++ b/project/StudentTasks.scala @@ -0,0 +1,318 @@ +package ch.epfl.lamp + +import sbt._ +import Keys._ + +// import scalaj.http._ +import java.io.{File, FileInputStream, IOException} +import org.apache.commons.codec.binary.Base64 +// import play.api.libs.json.{Json, JsObject, JsPath} +import scala.util.{Failure, Success, Try} + +/** + * Provides tasks for submitting the assignment + */ +object StudentTasks extends AutoPlugin { + + override def requires = super.requires && MOOCSettings + + object autoImport { + val packageSourcesOnly = TaskKey[File]("packageSourcesOnly", "Package the sources of the project") + val packageBinWithoutResources = TaskKey[File]("packageBinWithoutResources", "Like packageBin, but without the resources") + val packageSubmissionZip = TaskKey[File]("packageSubmissionZip") + val packageSubmission = inputKey[Unit]("package solution as an archive file") + val runGradingTests = taskKey[Unit]("run black-box tests used for final grading") + } + + + import autoImport._ + import MOOCSettings.autoImport._ + + override lazy val projectSettings = Seq( + packageSubmissionSetting, + // submitSetting, + runGradingTestsSettings, + + fork := true, + connectInput in run := true, + outputStrategy := Some(StdoutOutput), + ) ++ packageSubmissionZipSettings + + lazy val runGradingTestsSettings = runGradingTests := { + val testSuiteJar = "grading-tests.jar" + if (!new File(testSuiteJar).exists) { + throw new MessageOnlyException(s"Could not find tests JarFile: $testSuiteJar") + } + + val classPath = s"${(Test / dependencyClasspath).value.map(_.data).mkString(File.pathSeparator)}${File.pathSeparator}$testSuiteJar" + val junitProcess = + Fork.java.fork( + ForkOptions(), + "-cp" :: classPath :: + "org.junit.runner.JUnitCore" :: + (Test / testSuite).value :: + Nil + ) + + // Wait for tests to complete. + junitProcess.exitValue() + } + + + /** ********************************************************** + * SUBMITTING A SOLUTION TO COURSERA + */ + + val packageSubmissionZipSettings = Seq( + packageSubmissionZip := { + val submission = crossTarget.value / "submission.zip" + val sources = (packageSourcesOnly in Compile).value + val binaries = (packageBinWithoutResources in Compile).value + IO.zip(Seq(sources -> "sources.zip", binaries -> "binaries.jar"), submission) + submission + }, + artifactClassifier in packageSourcesOnly := Some("sources"), + artifact in (Compile, packageBinWithoutResources) ~= (art => art.withName(art.name + "-without-resources")) + ) ++ + inConfig(Compile)( + Defaults.packageTaskSettings(packageSourcesOnly, Defaults.sourceMappings) ++ + Defaults.packageTaskSettings(packageBinWithoutResources, Def.task { + val relativePaths = + (unmanagedResources in Compile).value.flatMap(Path.relativeTo((unmanagedResourceDirectories in Compile).value)(_)) + (mappings in (Compile, packageBin)).value.filterNot { case (_, path) => relativePaths.contains(path) } + }) + ) + + val maxSubmitFileSize = { + val mb = 1024 * 1024 + 10 * mb + } + + /** Check that the jar exists, isn't empty, isn't crazy big, and can be read + * If so, encode jar as base64 so we can send it to Coursera + */ + def prepareJar(jar: File, s: TaskStreams): String = { + val errPrefix = "Error submitting assignment jar: " + val fileLength = jar.length() + if (!jar.exists()) { + s.log.error(errPrefix + "jar archive does not exist\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength == 0L) { + s.log.error(errPrefix + "jar archive is empty\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength > maxSubmitFileSize) { + s.log.error(errPrefix + "jar archive is too big. Allowed size: " + + maxSubmitFileSize + " bytes, found " + fileLength + " bytes.\n" + + jar.getAbsolutePath) + failSubmit() + } else { + val bytes = new Array[Byte](fileLength.toInt) + val sizeRead = try { + val is = new FileInputStream(jar) + val read = is.read(bytes) + is.close() + read + } catch { + case ex: IOException => + s.log.error(errPrefix + "failed to read sources jar archive\n" + ex.toString) + failSubmit() + } + if (sizeRead != bytes.length) { + s.log.error(errPrefix + "failed to read the sources jar archive, size read: " + sizeRead) + failSubmit() + } else encodeBase64(bytes) + } + } + + /** Task to package solution to a given file path */ + lazy val packageSubmissionSetting = packageSubmission := { + val args: Seq[String] = Def.spaceDelimited("[path]").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val base64Jar = prepareJar(jar, s) + + val path = args.headOption.getOrElse((baseDirectory.value / "submission.jar").absolutePath) + scala.tools.nsc.io.File(path).writeAll(base64Jar) + } + +/* + /** Task to submit a solution to coursera */ + val submit = inputKey[Unit]("submit solution to Coursera") + lazy val submitSetting = submit := { + // Fail if scalafix linting does not pass. + scalafixLinting.value + + val args: Seq[String] = Def.spaceDelimited("").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val assignmentDetails = + courseraId.?.value.getOrElse(throw new MessageOnlyException("This assignment can not be submitted to Coursera because the `courseraId` setting is undefined")) + val assignmentKey = assignmentDetails.key + val courseName = + course.value match { + case "capstone" => "scala-capstone" + case "bigdata" => "scala-spark-big-data" + case other => other + } + + val partId = assignmentDetails.partId + val itemId = assignmentDetails.itemId + val premiumItemId = assignmentDetails.premiumItemId + + val (email, secret) = args match { + case email :: secret :: Nil => + (email, secret) + case _ => + val inputErr = + s"""|Invalid input to `submit`. The required syntax for `submit` is: + |submit + | + |The submit token is NOT YOUR LOGIN PASSWORD. + |It can be obtained from the assignment page: + |https://www.coursera.org/learn/$courseName/programming/$itemId + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + """.stripMargin + s.log.error(inputErr) + failSubmit() + } + + val base64Jar = prepareJar(jar, s) + val json = + s"""|{ + | "assignmentKey":"$assignmentKey", + | "submitterEmail":"$email", + | "secret":"$secret", + | "parts":{ + | "$partId":{ + | "output":"$base64Jar" + | } + | } + |}""".stripMargin + + def postSubmission[T](data: String): Try[HttpResponse[String]] = { + val http = Http("https://www.coursera.org/api/onDemandProgrammingScriptSubmissions.v1") + val hs = List( + ("Cache-Control", "no-cache"), + ("Content-Type", "application/json") + ) + s.log.info("Connecting to Coursera...") + val response = Try(http.postData(data) + .headers(hs) + .option(HttpOptions.connTimeout(10000)) // scalaj default timeout is only 100ms, changing that to 10s + .asString) // kick off HTTP POST + response + } + + val connectMsg = + s"""|Attempting to submit "${assignment.value}" assignment in "$courseName" course + |Using: + |- email: $email + |- submit token: $secret""".stripMargin + s.log.info(connectMsg) + + def reportCourseraResponse(response: HttpResponse[String]): Unit = { + val code = response.code + val respBody = response.body + + /* Sample JSON response from Coursera + { + "message": "Invalid email or token.", + "details": { + "learnerMessage": "Invalid email or token." + } + } + */ + + // Success, Coursera responds with 2xx HTTP status code + if (response.is2xx) { + val successfulSubmitMsg = + s"""|Successfully connected to Coursera. (Status $code) + | + |Assignment submitted successfully! + | + |You can see how you scored by going to: + |https://www.coursera.org/learn/$courseName/programming/$itemId/ + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + |and clicking on "My Submission".""".stripMargin + s.log.info(successfulSubmitMsg) + } + + // Failure, Coursera responds with 4xx HTTP status code (client-side failure) + else if (response.is4xx) { + val result = Try(Json.parse(respBody)).toOption + val learnerMsg = result match { + case Some(resp: JsObject) => + (JsPath \ "details" \ "learnerMessage").read[String].reads(resp).get + case Some(x) => // shouldn't happen + "Could not parse Coursera's response:\n" + x + case None => + "Could not parse Coursera's response:\n" + respBody + } + val failedSubmitMsg = + s"""|Submission failed. + |There was something wrong while attempting to submit. + |Coursera says: + |$learnerMsg (Status $code)""".stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera responds with 5xx HTTP status code (server-side failure) + else if (response.is5xx) { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera seems to be unavailable at the moment (Status $code) + |Check https://status.coursera.org/ and try again in a few minutes. + """.stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera repsonds with an unexpected status code + else { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera replied with an unexpected code (Status $code) + """.stripMargin + s.log.error(failedSubmitMsg) + } + } + + // kick it all off, actually make request + postSubmission(json) match { + case Success(resp) => reportCourseraResponse(resp) + case Failure(e) => + val failedConnectMsg = + s"""|Connection to Coursera failed. + |There was something wrong while attempting to connect to Coursera. + |Check your internet connection. + |${e.toString}""".stripMargin + s.log.error(failedConnectMsg) + } + + } +*/ + + def failSubmit(): Nothing = { + sys.error("Submission failed") + } + + /** + * ***************** + * DEALING WITH JARS + */ + def encodeBase64(bytes: Array[Byte]): String = + new String(Base64.encodeBase64(bytes)) +} diff --git a/project/build.properties b/project/build.properties new file mode 100644 index 0000000..a919a9b --- /dev/null +++ b/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.3.8 diff --git a/project/buildSettings.sbt b/project/buildSettings.sbt new file mode 100644 index 0000000..8fac702 --- /dev/null +++ b/project/buildSettings.sbt @@ -0,0 +1,5 @@ +// Used for Coursera submission (StudentPlugin) +// libraryDependencies += "org.scalaj" %% "scalaj-http" % "2.4.2" +// libraryDependencies += "com.typesafe.play" %% "play-json" % "2.7.4" +// Used for Base64 (StudentPlugin) +libraryDependencies += "commons-codec" % "commons-codec" % "1.10" diff --git a/project/plugins.sbt b/project/plugins.sbt new file mode 100644 index 0000000..017735d --- /dev/null +++ b/project/plugins.sbt @@ -0,0 +1,2 @@ +addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.28") +addSbtPlugin("ch.epfl.lamp" % "sbt-dotty" % "0.4.0") diff --git a/src/main/resources/scalashop/scala.jpg b/src/main/resources/scalashop/scala.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ae448736e9a35b839d6fc5ce7ef395585199387a GIT binary patch literal 121271 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Š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 U5ziDxGQW)^oeeC1c7Q+s+1UvF5&!@I literal 0 HcmV?d00001 diff --git a/src/main/scala/scalashop/HorizontalBoxBlur.scala b/src/main/scala/scalashop/HorizontalBoxBlur.scala new file mode 100644 index 0000000..5022bae --- /dev/null +++ b/src/main/scala/scalashop/HorizontalBoxBlur.scala @@ -0,0 +1,60 @@ +package scalashop + +import org.scalameter._ + +object HorizontalBoxBlurRunner { + + val standardConfig = config( + Key.exec.minWarmupRuns -> 5, + Key.exec.maxWarmupRuns -> 10, + Key.exec.benchRuns -> 10, + Key.verbose -> true + ) withWarmer(new Warmer.Default) + + def main(args: Array[String]): Unit = { + val radius = 3 + val width = 1920 + val height = 1080 + val src = new Img(width, height) + val dst = new Img(width, height) + val seqtime = standardConfig measure { + HorizontalBoxBlur.blur(src, dst, 0, height, radius) + } + println(s"sequential blur time: $seqtime") + + val numTasks = 32 + val partime = standardConfig measure { + HorizontalBoxBlur.parBlur(src, dst, numTasks, radius) + } + println(s"fork/join blur time: $partime") + println(s"speedup: ${seqtime.value / partime.value}") + } +} + +/** A simple, trivially parallelizable computation. */ +object HorizontalBoxBlur extends HorizontalBoxBlurInterface { + + /** Blurs the rows of the source image `src` into the destination image `dst`, + * starting with `from` and ending with `end` (non-inclusive). + * + * Within each row, `blur` traverses the pixels by going from left to right. + */ + def blur(src: Img, dst: Img, from: Int, end: Int, radius: Int): Unit = { + // TODO implement this method using the `boxBlurKernel` method + + ??? + } + + /** Blurs the rows of the source image in parallel using `numTasks` tasks. + * + * Parallelization is done by stripping the source image `src` into + * `numTasks` separate strips, where each strip is composed of some number of + * rows. + */ + def parBlur(src: Img, dst: Img, numTasks: Int, radius: Int): Unit = { + // TODO implement using the `task` construct and the `blur` method + + ??? + } + +} diff --git a/src/main/scala/scalashop/Interfaces.scala b/src/main/scala/scalashop/Interfaces.scala new file mode 100644 index 0000000..db8c1a9 --- /dev/null +++ b/src/main/scala/scalashop/Interfaces.scala @@ -0,0 +1,18 @@ +package scalashop + +// Interfaces used by the grading infrastructure. Do not change signatures +// or your submission will fail with a NoSuchMethodError. + +trait HorizontalBoxBlurInterface { + def blur(src: Img, dst: Img, from: Int, end: Int, radius: Int): Unit + def parBlur(src: Img, dst: Img, numTasks: Int, radius: Int): Unit +} + +trait VerticalBoxBlurInterface { + def blur(src: Img, dst: Img, from: Int, end: Int, radius: Int): Unit + def parBlur(src: Img, dst: Img, numTasks: Int, radius: Int): Unit +} + +trait BoxBlurKernelInterface { + def boxBlurKernel(src: Img, x: Int, y: Int, radius: Int): RGBA +} diff --git a/src/main/scala/scalashop/PhotoCanvas.scala b/src/main/scala/scalashop/PhotoCanvas.scala new file mode 100644 index 0000000..522be63 --- /dev/null +++ b/src/main/scala/scalashop/PhotoCanvas.scala @@ -0,0 +1,85 @@ +package scalashop + +import java.awt._ +import java.awt.event._ +import java.awt.image._ +import java.io._ +import javax.imageio._ +import javax.swing._ +import javax.swing.event._ + +class PhotoCanvas extends JComponent { + + var imagePath: Option[String] = None + + var image = loadScalaImage() + + override def getPreferredSize = { + new Dimension(image.width, image.height) + } + + private def loadScalaImage(): Img = { + val stream = this.getClass.getResourceAsStream("/scalashop/scala.jpg") + try { + loadImage(stream) + } finally { + stream.close() + } + } + + private def loadFileImage(path: String): Img = { + val stream = new FileInputStream(path) + try { + loadImage(stream) + } finally { + stream.close() + } + } + + private def loadImage(inputStream: InputStream): Img = { + val bufferedImage = ImageIO.read(inputStream) + val width = bufferedImage.getWidth + val height = bufferedImage.getHeight + val img = new Img(width, height) + for (x <- 0 until width; y <- 0 until height) img(x, y) = bufferedImage.getRGB(x, y) + img + } + + def reload(): Unit = { + image = imagePath match { + case Some(path) => loadFileImage(path) + case None => loadScalaImage() + } + repaint() + } + + def loadFile(path: String): Unit = { + imagePath = Some(path) + reload() + } + + def applyFilter(filterName: String, numTasks: Int, radius: Int): Unit = { + val dst = new Img(image.width, image.height) + filterName match { + case "horizontal-box-blur" => + HorizontalBoxBlur.parBlur(image, dst, numTasks, radius) + case "vertical-box-blur" => + VerticalBoxBlur.parBlur(image, dst, numTasks, radius) + case "" => + } + image = dst + repaint() + } + + override def paintComponent(gcan: Graphics) = { + super.paintComponent(gcan) + + val width = image.width + val height = image.height + val bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB) + for (x <- 0 until width; y <- 0 until height) bufferedImage.setRGB(x, y, image(x, y)) + + gcan.drawImage(bufferedImage, 0, 0, null) + } + +} diff --git a/src/main/scala/scalashop/ScalaShop.scala b/src/main/scala/scalashop/ScalaShop.scala new file mode 100644 index 0000000..5d46955 --- /dev/null +++ b/src/main/scala/scalashop/ScalaShop.scala @@ -0,0 +1,140 @@ +package scalashop + +import org.scalameter._ +import java.awt._ +import java.awt.event._ +import javax.swing._ +import javax.swing.event._ +import scala.collection.mutable.ArrayBuffer +import scala.reflect.ClassTag + +object ScalaShop { + + class ScalaShopFrame extends JFrame("ScalaShop\u2122") { + setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE) + setSize(1024, 600) + setLayout(new BorderLayout) + + val rightpanel = new JPanel + rightpanel.setBorder(BorderFactory.createEtchedBorder(border.EtchedBorder.LOWERED)) + rightpanel.setLayout(new BorderLayout) + add(rightpanel, BorderLayout.EAST) + + val controls = new JPanel + controls.setLayout(new GridLayout(0, 2)) + rightpanel.add(controls, BorderLayout.NORTH) + + val filterLabel = new JLabel("Filter") + controls.add(filterLabel) + + val filterCombo = new JComboBox(Array( + "horizontal-box-blur", + "vertical-box-blur" + )) + controls.add(filterCombo) + + val radiusLabel = new JLabel("Radius") + controls.add(radiusLabel) + + val radiusSpinner = new JSpinner(new SpinnerNumberModel(3, 1, 16, 1)) + controls.add(radiusSpinner) + + val tasksLabel = new JLabel("Tasks") + controls.add(tasksLabel) + + val tasksSpinner = new JSpinner(new SpinnerNumberModel(32, 1, 128, 1)) + controls.add(tasksSpinner) + + val stepbutton = new JButton("Apply filter") + stepbutton.addActionListener(new ActionListener { + def actionPerformed(e: ActionEvent): Unit = { + val time = measure { + canvas.applyFilter(getFilterName, getNumTasks, getRadius) + } + updateInformationBox(time.value) + } + }) + controls.add(stepbutton) + + val clearButton = new JButton("Reload") + clearButton.addActionListener(new ActionListener { + def actionPerformed(e: ActionEvent): Unit = { + canvas.reload() + } + }) + controls.add(clearButton) + + val info = new JTextArea(" ") + info.setBorder(BorderFactory.createLoweredBevelBorder) + rightpanel.add(info, BorderLayout.SOUTH) + + val mainMenuBar = new JMenuBar() + + val fileMenu = new JMenu("File") + val openMenuItem = new JMenuItem("Open...") + openMenuItem.addActionListener(new ActionListener { + def actionPerformed(e: ActionEvent): Unit = { + val fc = new JFileChooser() + if (fc.showOpenDialog(ScalaShopFrame.this) == JFileChooser.APPROVE_OPTION) { + canvas.loadFile(fc.getSelectedFile.getPath) + } + } + }) + fileMenu.add(openMenuItem) + val exitMenuItem = new JMenuItem("Exit") + exitMenuItem.addActionListener(new ActionListener { + def actionPerformed(e: ActionEvent): Unit = { + sys.exit(0) + } + }) + fileMenu.add(exitMenuItem) + + mainMenuBar.add(fileMenu) + + val helpMenu = new JMenu("Help") + val aboutMenuItem = new JMenuItem("About") + aboutMenuItem.addActionListener(new ActionListener { + def actionPerformed(e: ActionEvent): Unit = { + JOptionPane.showMessageDialog(null, "ScalaShop, the ultimate image manipulation tool\nBrought to you by EPFL, 2015") + } + }) + helpMenu.add(aboutMenuItem) + + mainMenuBar.add(helpMenu) + + setJMenuBar(mainMenuBar) + + val canvas = new PhotoCanvas + + val scrollPane = new JScrollPane(canvas) + + add(scrollPane, BorderLayout.CENTER) + setVisible(true) + + def updateInformationBox(time: Double): Unit = { + info.setText(s"Time: $time") + } + + def getNumTasks: Int = tasksSpinner.getValue.asInstanceOf[Int] + + def getRadius: Int = radiusSpinner.getValue.asInstanceOf[Int] + + def getFilterName: String = { + filterCombo.getSelectedItem.asInstanceOf[String] + } + + } + + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()) + } catch { + case _: Exception => println("Cannot set look and feel, using the default one.") + } + + val frame = new ScalaShopFrame + + def main(args: Array[String]): Unit = { + frame.repaint() + } + +} diff --git a/src/main/scala/scalashop/VerticalBoxBlur.scala b/src/main/scala/scalashop/VerticalBoxBlur.scala new file mode 100644 index 0000000..f406e40 --- /dev/null +++ b/src/main/scala/scalashop/VerticalBoxBlur.scala @@ -0,0 +1,60 @@ +package scalashop + +import org.scalameter._ + +object VerticalBoxBlurRunner { + + val standardConfig = config( + Key.exec.minWarmupRuns -> 5, + Key.exec.maxWarmupRuns -> 10, + Key.exec.benchRuns -> 10, + Key.verbose -> true + ) withWarmer(new Warmer.Default) + + def main(args: Array[String]): Unit = { + val radius = 3 + val width = 1920 + val height = 1080 + val src = new Img(width, height) + val dst = new Img(width, height) + val seqtime = standardConfig measure { + VerticalBoxBlur.blur(src, dst, 0, width, radius) + } + println(s"sequential blur time: $seqtime") + + val numTasks = 32 + val partime = standardConfig measure { + VerticalBoxBlur.parBlur(src, dst, numTasks, radius) + } + println(s"fork/join blur time: $partime") + println(s"speedup: ${seqtime.value / partime.value}") + } + +} + +/** A simple, trivially parallelizable computation. */ +object VerticalBoxBlur extends VerticalBoxBlurInterface { + + /** Blurs the columns of the source image `src` into the destination image + * `dst`, starting with `from` and ending with `end` (non-inclusive). + * + * Within each column, `blur` traverses the pixels by going from top to + * bottom. + */ + def blur(src: Img, dst: Img, from: Int, end: Int, radius: Int): Unit = { + // TODO implement this method using the `boxBlurKernel` method + ??? + } + + /** Blurs the columns of the source image in parallel using `numTasks` tasks. + * + * Parallelization is done by stripping the source image `src` into + * `numTasks` separate strips, where each strip is composed of some number of + * columns. + */ + def parBlur(src: Img, dst: Img, numTasks: Int, radius: Int): Unit = { + // TODO implement using the `task` construct and the `blur` method + ??? + } + +} diff --git a/src/main/scala/scalashop/package.scala b/src/main/scala/scalashop/package.scala new file mode 100644 index 0000000..ae29e42 --- /dev/null +++ b/src/main/scala/scalashop/package.scala @@ -0,0 +1,100 @@ +import java.util.concurrent._ +import scala.util.DynamicVariable + +import org.scalameter._ + +package object scalashop extends BoxBlurKernelInterface { + + /** The value of every pixel is represented as a 32 bit integer. */ + type RGBA = Int + + /** Returns the red component. */ + def red(c: RGBA): Int = (0xff000000 & c) >>> 24 + + /** Returns the green component. */ + def green(c: RGBA): Int = (0x00ff0000 & c) >>> 16 + + /** Returns the blue component. */ + def blue(c: RGBA): Int = (0x0000ff00 & c) >>> 8 + + /** Returns the alpha component. */ + def alpha(c: RGBA): Int = (0x000000ff & c) >>> 0 + + /** Used to create an RGBA value from separate components. */ + def rgba(r: Int, g: Int, b: Int, a: Int): RGBA = { + (r << 24) | (g << 16) | (b << 8) | (a << 0) + } + + /** Restricts the integer into the specified range. */ + def clamp(v: Int, min: Int, max: Int): Int = { + if (v < min) min + else if (v > max) max + else v + } + + /** Image is a two-dimensional matrix of pixel values. */ + class Img(val width: Int, val height: Int, private val data: Array[RGBA]) { + def this(w: Int, h: Int) = this(w, h, new Array(w * h)) + def apply(x: Int, y: Int): RGBA = data(y * width + x) + def update(x: Int, y: Int, c: RGBA): Unit = data(y * width + x) = c + } + + /** Computes the blurred RGBA value of a single pixel of the input image. */ + def boxBlurKernel(src: Img, x: Int, y: Int, radius: Int): RGBA = { + + // TODO implement using while loops + ??? + } + + val forkJoinPool = new ForkJoinPool + + abstract class TaskScheduler { + def schedule[T](body: => T): ForkJoinTask[T] + def parallel[A, B](taskA: => A, taskB: => B): (A, B) = { + val right = task { + taskB + } + val left = taskA + (left, right.join()) + } + } + + class DefaultTaskScheduler extends TaskScheduler { + def schedule[T](body: => T): ForkJoinTask[T] = { + val t = new RecursiveTask[T] { + def compute = body + } + Thread.currentThread match { + case wt: ForkJoinWorkerThread => + t.fork() + case _ => + forkJoinPool.execute(t) + } + t + } + } + + val scheduler = + new DynamicVariable[TaskScheduler](new DefaultTaskScheduler) + + def task[T](body: => T): ForkJoinTask[T] = { + scheduler.value.schedule(body) + } + + def parallel[A, B](taskA: => A, taskB: => B): (A, B) = { + scheduler.value.parallel(taskA, taskB) + } + + def parallel[A, B, C, D](taskA: => A, taskB: => B, taskC: => C, taskD: => D): (A, B, C, D) = { + val ta = task { taskA } + val tb = task { taskB } + val tc = task { taskC } + val td = taskD + (ta.join(), tb.join(), tc.join(), td) + } + + // Workaround Dotty's handling of the existential type KeyValue + implicit def keyValueCoerce[T](kv: (Key[T], T)): KeyValue = { + kv.asInstanceOf[KeyValue] + } +} diff --git a/src/test/scala/scalashop/BlurSuite.scala b/src/test/scala/scalashop/BlurSuite.scala new file mode 100644 index 0000000..e45e46d --- /dev/null +++ b/src/test/scala/scalashop/BlurSuite.scala @@ -0,0 +1,11 @@ +package scalashop + +import java.util.concurrent._ +import scala.collection._ +import org.junit._ +import org.junit.Assert.assertEquals + +class BlurSuite { + + @Rule def individualTestTimeout = new org.junit.rules.Timeout(10 * 1000) +}