package net.seninp.grammarviz.cli; import net.seninp.gi.logic.GrammarRuleRecord; import net.seninp.gi.logic.GrammarRules; import net.seninp.gi.logic.RuleInterval; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.Arrays; import java.util.List; /** * Write GrammarRules to an output file. */ public class RulesWriter { private static final Logger logger = LoggerFactory.getLogger(RulesWriter.class); private static final String NEWLINE = System.lineSeparator(); private String fname; private BufferedWriter writer; public RulesWriter(String fname) { this.fname = fname; this.writer = null; } public RulesWriter write(GrammarRules rules) { try (BufferedWriter writer = new BufferedWriter(new FileWriter(new File(this.fname)))) { this.writer = writer; this.writeHeader() .writeRules(rules); } catch (IOException e) { if (logger.isDebugEnabled()) { logger.error("Encountered error while writing stats file: " + e.getMessage(), e); } else { logger.error("Encountered error while writing stats file: " + e.getMessage()); } } return this; } private RulesWriter writeHeader() throws IOException { String output = "# filename: " + fname + NEWLINE + "# sliding window: " + TS2GrammarParameters.SAX_WINDOW_SIZE + NEWLINE + "# paa size: " + TS2GrammarParameters.SAX_PAA_SIZE + NEWLINE + "# alphabet size: " + TS2GrammarParameters.SAX_ALPHABET_SIZE + NEWLINE; writer.write(output); return this; } private void writeRules(GrammarRules rules) throws IOException { StringBuilder sb = new StringBuilder(); for (GrammarRuleRecord ruleRecord : rules) { sb.setLength(0); // reset sb.append("/// ").append(ruleRecord.getRuleName()).append(NEWLINE); sb.append(ruleRecord.getRuleName()).append(" -> \'") .append(ruleRecord.getRuleString().trim()).append("\', expanded rule string: \'") .append(ruleRecord.getExpandedRuleString()).append("\'").append(NEWLINE); if (!ruleRecord.getOccurrences().isEmpty()) { List<RuleInterval> intervals = ruleRecord.getRuleIntervals(); int[] starts = new int[intervals.size()]; int[] lengths = new int[intervals.size()]; for (int i = 0; i < intervals.size(); i++) { starts[i] = intervals.get(i).getStart(); lengths[i] = intervals.get(i).getEnd() - intervals.get(i).getStart(); } sb.append("subsequences starts: ").append(Arrays.toString(starts)).append(NEWLINE); sb.append("subsequences lengths: ").append(Arrays.toString(lengths)).append(NEWLINE); } sb.append("rule occurrence frequency ").append(ruleRecord.getOccurrences().size()).append(NEWLINE); sb.append("rule use frequency ").append(ruleRecord.getRuleUseFrequency()).append(NEWLINE); sb.append("min length ").append(ruleRecord.minMaxLengthAsString().split(" - ")[0]).append(NEWLINE); sb.append("max length ").append(ruleRecord.minMaxLengthAsString().split(" - ")[1]).append(NEWLINE); sb.append("mean length ").append(ruleRecord.getMeanLength()).append(NEWLINE); writer.write(sb.toString()); } } }