From dec770fa2935a775feb760edf548df1e0722cfc3 Mon Sep 17 00:00:00 2001 From: Keith Alcock Date: Mon, 20 Feb 2023 09:28:27 -0700 Subject: [PATCH] Let PrintWriter manage its own files --- .../examples/InfiniteParallelProcessorExample.scala | 2 +- .../examples/ParallelProcessorExample.scala | 2 +- main/src/main/scala/org/clulab/dynet/Metal.scala | 12 +++++++----- .../src/main/scala/org/clulab/learning/Dataset.scala | 4 ++-- .../scala/org/clulab/learning/RankingDataset.scala | 2 +- .../main/scala/org/clulab/learning/RegDataset.scala | 4 ++-- .../org/clulab/sequences/BiMEMMSequenceTagger.scala | 4 ++-- .../org/clulab/sequences/MEMMSequenceTagger.scala | 4 ++-- .../scala/org/clulab/sequences/NormalizeParens.scala | 4 ++-- .../clulab/sequences/SequenceTaggerEvaluator.scala | 5 +++-- .../src/main/scala/org/clulab/utils/NullWriter.scala | 10 ++++++++++ 11 files changed, 33 insertions(+), 20 deletions(-) create mode 100644 main/src/main/scala/org/clulab/utils/NullWriter.scala diff --git a/corenlp/src/main/scala/org/clulab/processors/examples/InfiniteParallelProcessorExample.scala b/corenlp/src/main/scala/org/clulab/processors/examples/InfiniteParallelProcessorExample.scala index f8f18d6bd..d9d162adf 100644 --- a/corenlp/src/main/scala/org/clulab/processors/examples/InfiniteParallelProcessorExample.scala +++ b/corenlp/src/main/scala/org/clulab/processors/examples/InfiniteParallelProcessorExample.scala @@ -76,7 +76,7 @@ object InfiniteParallelProcessorExample { def run(args: Array[String]): Unit = { mainWithCallback(args) { case (file: File, contents: String) => - Using.resource(new PrintWriter(new BufferedOutputStream(new FileOutputStream(file)))) { printWriter => + Using.resource(new PrintWriter(file)) { printWriter => printWriter.println(contents) } } diff --git a/corenlp/src/main/scala/org/clulab/processors/examples/ParallelProcessorExample.scala b/corenlp/src/main/scala/org/clulab/processors/examples/ParallelProcessorExample.scala index eee1b7029..f0d8de789 100644 --- a/corenlp/src/main/scala/org/clulab/processors/examples/ParallelProcessorExample.scala +++ b/corenlp/src/main/scala/org/clulab/processors/examples/ParallelProcessorExample.scala @@ -73,7 +73,7 @@ object ParallelProcessorExample { def run(args: Array[String]): Unit = { mainWithCallback(args) { case (file: File, contents: String) => - Using.resource(new PrintWriter(new BufferedOutputStream(new FileOutputStream(file)))) { printWriter => + Using.resource(new PrintWriter(file)) { printWriter => printWriter.println(contents) } } diff --git a/main/src/main/scala/org/clulab/dynet/Metal.scala b/main/src/main/scala/org/clulab/dynet/Metal.scala index 0fb5763e3..179329d00 100644 --- a/main/src/main/scala/org/clulab/dynet/Metal.scala +++ b/main/src/main/scala/org/clulab/dynet/Metal.scala @@ -12,7 +12,7 @@ import org.clulab.struct.Counter import org.clulab.utils.{ProgressBar, StringUtils} import org.slf4j.{Logger, LoggerFactory} -import java.io.{FileWriter, PrintWriter} +import java.io.PrintWriter import scala.collection.mutable.ArrayBuffer import scala.util.Random @@ -304,10 +304,12 @@ class Metal(val taskManagerOpt: Option[TaskManager], logger.debug(s"Started evaluation on the $name dataset for task $taskNumber ($taskName)...") - Using.resource( - if (epoch >= 0) new PrintWriter(new FileWriter(s"task$taskNumber.dev.output.$epoch")) - else new PrintWriter(new FileWriter(s"task$taskNumber.test.output")) - ) { pw => + Using.resource { + val filename = + if (epoch >= 0) s"task$taskNumber.dev.output.$epoch" + else s"task$taskNumber.test.output" + new PrintWriter(filename) + } { pw => val reader = new MetalRowReader val insertNegatives = taskManager.tasks(taskId).insertNegatives diff --git a/main/src/main/scala/org/clulab/learning/Dataset.scala b/main/src/main/scala/org/clulab/learning/Dataset.scala index 08297e23f..1f1d7eebd 100644 --- a/main/src/main/scala/org/clulab/learning/Dataset.scala +++ b/main/src/main/scala/org/clulab/learning/Dataset.scala @@ -6,7 +6,7 @@ import org.clulab.struct.Lexicon import org.clulab.utils.Files import org.slf4j.{Logger, LoggerFactory} -import java.io.{FileWriter, PrintWriter} +import java.io.PrintWriter import java.util.zip.GZIPInputStream import scala.collection.mutable import scala.collection.mutable.{ArrayBuffer, ListBuffer} @@ -454,7 +454,7 @@ object RVFDataset { featureLexicon:Lexicon[String], fn:String): Unit = { - Using.resource(new PrintWriter(new FileWriter(fn))) { os => + Using.resource(new PrintWriter(fn)) { os => for (datum <- datums) { os.print(datum.label) val fs = new ListBuffer[(Int, Double)] diff --git a/main/src/main/scala/org/clulab/learning/RankingDataset.scala b/main/src/main/scala/org/clulab/learning/RankingDataset.scala index f38749b4e..829882e08 100644 --- a/main/src/main/scala/org/clulab/learning/RankingDataset.scala +++ b/main/src/main/scala/org/clulab/learning/RankingDataset.scala @@ -451,7 +451,7 @@ object RVFRankingDataset { featureLexicon:Lexicon[String], fn:String): Unit = { var qid = 0 - Using.resource (new PrintWriter(new FileWriter(fn))) { os => + Using.resource(new PrintWriter(fn)) { os => for (query <- queries) { qid += 1 for (datum <- query) { diff --git a/main/src/main/scala/org/clulab/learning/RegDataset.scala b/main/src/main/scala/org/clulab/learning/RegDataset.scala index cb0d39e49..b7ca17f47 100644 --- a/main/src/main/scala/org/clulab/learning/RegDataset.scala +++ b/main/src/main/scala/org/clulab/learning/RegDataset.scala @@ -6,7 +6,7 @@ import org.clulab.struct.Lexicon import org.clulab.utils.Files import org.slf4j.LoggerFactory -import java.io.{BufferedInputStream, FileInputStream, FileWriter, PrintWriter} +import java.io.PrintWriter import java.util.zip.GZIPInputStream import scala.collection.mutable import scala.collection.mutable.{ArrayBuffer, ListBuffer} @@ -450,7 +450,7 @@ object RVFRegDataset { featureLexicon:Lexicon[String], fn:String): Unit = { - Using.resource(new PrintWriter(new FileWriter(fn))) { os => + Using.resource(new PrintWriter(fn)) { os => for (datum <- datums) { os.print(datum.label) val fs = new ListBuffer[(Int, Double)] diff --git a/main/src/main/scala/org/clulab/sequences/BiMEMMSequenceTagger.scala b/main/src/main/scala/org/clulab/sequences/BiMEMMSequenceTagger.scala index 33d887ca5..65473dd88 100644 --- a/main/src/main/scala/org/clulab/sequences/BiMEMMSequenceTagger.scala +++ b/main/src/main/scala/org/clulab/sequences/BiMEMMSequenceTagger.scala @@ -56,7 +56,7 @@ abstract class BiMEMMSequenceTagger[L: ClassTag, F: ClassTag]( } else { logger.debug("Generating first-pass labels from scratch...") val labels = mkFirstPassLabels(sentences) - Using.resource(new PrintWriter(new FileWriter(FIRST_PASS_FILE))) { pw => + Using.resource(new PrintWriter(FIRST_PASS_FILE)) { pw => for (s <- labels) { pw.println(s.mkString("\t")) } @@ -249,7 +249,7 @@ abstract class BiMEMMSequenceTagger[L: ClassTag, F: ClassTag]( override def save(fn:File): Unit = { // save meta data - Using.resource(new PrintWriter(new FileWriter(fn))) { w => + Using.resource(new PrintWriter(fn)) { w => w.println(order) w.println(leftToRight) diff --git a/main/src/main/scala/org/clulab/sequences/MEMMSequenceTagger.scala b/main/src/main/scala/org/clulab/sequences/MEMMSequenceTagger.scala index 37591f2e9..4daa72a52 100644 --- a/main/src/main/scala/org/clulab/sequences/MEMMSequenceTagger.scala +++ b/main/src/main/scala/org/clulab/sequences/MEMMSequenceTagger.scala @@ -83,8 +83,8 @@ abstract class MEMMSequenceTagger[L: ClassTag, F: ClassTag](var order:Int = 1, v if(leftToRight) history.toArray else SeqUtils.revert(history).toArray } - override def save(fn:File): Unit = { - Using.resource(new PrintWriter(new FileWriter(fn))) { w => + override def save(file: File): Unit = { + Using.resource(new PrintWriter(file)) { w => w.println(order) model.get.saveTo(w) } diff --git a/main/src/main/scala/org/clulab/sequences/NormalizeParens.scala b/main/src/main/scala/org/clulab/sequences/NormalizeParens.scala index 9d15e3abe..97377244d 100644 --- a/main/src/main/scala/org/clulab/sequences/NormalizeParens.scala +++ b/main/src/main/scala/org/clulab/sequences/NormalizeParens.scala @@ -2,7 +2,7 @@ package org.clulab.sequences import org.clulab.scala.Using._ -import java.io.{FileWriter, PrintWriter} +import java.io.PrintWriter import scala.io.Source /** @@ -15,7 +15,7 @@ import scala.io.Source object NormalizeParens { def main(args: Array[String]): Unit = { val isConll = args(1) == "conll" - Using.resource(new PrintWriter(new FileWriter(args(0) + ".parens"))) { pw => + Using.resource(new PrintWriter(args(0) + ".parens")) { pw => for (line <- Source.fromFile(args(0)).getLines()) { if (line.trim.isEmpty) { pw.println(line) diff --git a/main/src/main/scala/org/clulab/sequences/SequenceTaggerEvaluator.scala b/main/src/main/scala/org/clulab/sequences/SequenceTaggerEvaluator.scala index a816c7943..1ca29245c 100644 --- a/main/src/main/scala/org/clulab/sequences/SequenceTaggerEvaluator.scala +++ b/main/src/main/scala/org/clulab/sequences/SequenceTaggerEvaluator.scala @@ -3,9 +3,10 @@ package org.clulab.sequences import org.clulab.processors.Document import org.clulab.scala.Using._ import org.clulab.sequences.SequenceTaggerEvaluator._ +import org.clulab.utils.NullWriter import org.slf4j.{Logger, LoggerFactory} -import java.io.{PrintWriter, StringWriter} +import java.io.PrintWriter /** * Implements evaluation of a sequence tagger @@ -15,7 +16,7 @@ class SequenceTaggerEvaluator[L, F] { def accuracy(tagger:SequenceTagger[L, F], docs:Iterator[Document], saveOutput:Boolean = true): Double = { Using.resource( if (saveOutput) new PrintWriter("output_for_conlleval.txt") - else new PrintWriter(new StringWriter()) + else new PrintWriter(new NullWriter()) ) { pw => var correct = 0 var total = 0 diff --git a/main/src/main/scala/org/clulab/utils/NullWriter.scala b/main/src/main/scala/org/clulab/utils/NullWriter.scala new file mode 100644 index 000000000..9d5638804 --- /dev/null +++ b/main/src/main/scala/org/clulab/utils/NullWriter.scala @@ -0,0 +1,10 @@ +package org.clulab.utils + +import java.io.Writer + +// Java 11 has thigs built in: Writer.nullWriter() +class NullWriter extends Writer { + override def write(cbuf: Array[Char], off: Int, len: Int): Unit = () + override def flush(): Unit = () + override def close(): Unit = () +}