Skip to content

Commit a289ed4

Browse files
committed
--parse: show index origins whenever modified + code style improvements
1 parent 340343e commit a289ed4

File tree

15 files changed

+57
-61
lines changed

15 files changed

+57
-61
lines changed

__dependency_graph.dot

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
digraph {
2+
sha2 -> "(cstring)" [color=blue]
23
sha2 -> "(iomanip)" [color=blue]
34
sha2 -> "(iostream)" [color=blue]
45
sha2 -> "(sstream)" [color=blue]
5-
sha2 -> "(cstring)" [color=blue]
66
sha2 -> "(cstdint)" [color=red]
77
sha2 -> "(string)" [color=red]
88
subgraph "cluster_D:/Dropbox/eclipse/pmGenerator\cryptography" {
@@ -19,8 +19,8 @@ digraph {
1919
CfgGrammar
2020
CfgGrammar
2121
}
22-
FctHelper -> "(iostream)" [color=blue]
2322
FctHelper -> "(cmath)" [color=blue]
23+
FctHelper -> "(iostream)" [color=blue]
2424
FctHelper -> "(algorithm)" [color=red]
2525
FctHelper -> "(array)" [color=red]
2626
FctHelper -> "(charconv)" [color=red]

cryptography/sha2.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
#include "sha2.h"
22

3+
#include <cstring>
34
#include <iomanip>
45
#include <iostream>
56
#include <sstream>
6-
#include <cstring>
77

88
using namespace std;
99

grammar/CfgGrammar.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ CfgGrammar::CfgGrammar(const string& startSymbolString, const string& grammarStr
2525
const vector<string>& ruleElements = FctHelper::stringSplit(grammarLine, " ");
2626
if (!FctHelper::vectorContains(nonterminals, ruleElements[0]))
2727
nonterminals.push_back(ruleElements[0]);
28-
const vector<string>& splitGrammarLine = FctHelper::stringSplit(grammarLine, " -> ");
28+
const vector<string>& splitGrammarLine = FctHelper::stringSplit(grammarLine, " ::= ");
2929

3030
vector<string> grammarRule;
3131
if (splitGrammarLine[1].find('|') != string::npos) { // multiple rules
@@ -59,7 +59,7 @@ CfgGrammar::CfgGrammar(const string& startSymbolString, const string& grammarStr
5959
while (getline(reader2, grammarLine)) {
6060
const vector<string>& ruleElements = FctHelper::stringSplit(grammarLine, " ");
6161
for (size_t i = 1; i < ruleElements.size(); i++)
62-
if (!FctHelper::vectorContains(nonterminals, ruleElements[i]) && !FctHelper::vectorContains(terminals, ruleElements[i]) && (ruleElements[i] != "->") && (ruleElements[i] != "|"))
62+
if (!FctHelper::vectorContains(nonterminals, ruleElements[i]) && !FctHelper::vectorContains(terminals, ruleElements[i]) && (ruleElements[i] != "::=") && (ruleElements[i] != "|"))
6363
terminals.push_back(ruleElements[i]);
6464
}
6565

grammar/CfgGrammar.h

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ namespace xamidi {
1111
namespace grammar {
1212

1313
// Represents a context-free grammar
14-
struct CfgGrammar: public helper::IPrintable {
15-
private:
14+
class CfgGrammar: public helper::IPrintable {
1615
std::uint32_t _elementCounter;
1716
std::string _startSymbolString;
1817
std::string _grammarString;
@@ -30,39 +29,31 @@ struct CfgGrammar: public helper::IPrintable {
3029
CfgGrammar(const std::string& startSymbolString, const std::string& grammarString);
3130

3231
const std::string& startSymbolString() const;
33-
3432
std::uint32_t startSymbolId() const;
3533

3634
const std::string& grammarString() const;
3735

3836
const std::vector<std::uint32_t>& nonterminalIds() const;
39-
4037
const std::vector<std::uint32_t>& terminalIds() const;
4138

4239
const std::vector<std::string>& nonterminalStrings() const;
43-
4440
const std::vector<std::string>& terminalStrings() const;
4541

4642
const std::unordered_map<std::uint32_t, const std::string>& nonterminalStringLookup() const;
47-
4843
const std::unordered_map<std::uint32_t, const std::string>& terminalStringLookup() const;
4944

5045
const std::string& stringOf(std::uint32_t id) const;
51-
5246
std::vector<std::string> stringsOf(const std::vector<std::uint32_t>& ids) const;
53-
5447
std::string symbolSequenceOf(const std::vector<std::uint32_t>& ids) const;
5548

5649
const std::unordered_map<std::uint32_t, std::vector<std::vector<std::uint32_t>>>& productionRules() const;
5750

5851
std::uint32_t maybeStoreNonterminal(const std::string&);
59-
6052
std::uint32_t maybeStoreTerminal(const std::string&);
6153

6254
std::uint32_t idLookup(const std::string&) const;
6355

6456
std::string productionString() const;
65-
6657
virtual std::string toString() const override;
6758
};
6859

helper/FctHelper.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#include "FctHelper.h"
22

3-
#include <iostream>
43
#include <cmath>
4+
#include <iostream>
55

66
using namespace std;
77

helper/ProgressData.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
namespace xamidi {
1111
namespace helper {
1212

13-
struct ProgressData { // Note: Displays only integer percentage values, which might be generously rounded up, but less so for larger data sets (i.e. higher 'maximum'). 'percentageStepSize' must be a divisor of 100.
13+
struct ProgressData { // NOTE: Displays only integer percentage values, which might be generously rounded up, but less so for larger data sets (i.e. higher 'maximum'). 'percentageStepSize' must be a divisor of 100.
1414
unsigned percentageStepSize = 0;
1515
std::uint64_t maximum = 0;
1616
bool maximumEstimated = false;

logic/DlCore.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1352,7 +1352,7 @@ string::size_type DlCore::traverseFormulas_polishNotation_noRename_numVars(const
13521352
}
13531353

13541354
string DlCore::substitutionRepresentation_traverse(const map<string, shared_ptr<DlFormula>>& substitutions) {
1355-
return FctHelper::mapStringF(substitutions, [](const pair<string, shared_ptr<DlFormula>>& pair) { return "\u3008" + pair.first + ", " + formulaRepresentation_traverse(pair.second) + "\u3009"; }, { }, { });
1355+
return FctHelper::mapStringF(substitutions, [](const pair<const string, shared_ptr<DlFormula>>& pair) { return "\u3008" + pair.first + ", " + formulaRepresentation_traverse(pair.second) + "\u3009"; }, { }, { });
13561356
}
13571357

13581358
shared_ptr<DlFormula> DlCore::substitute(const shared_ptr<DlFormula>& formula, const map<string, shared_ptr<DlFormula>>& substitutions) {

logic/DlCore.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
namespace xamidi {
1616
namespace helper { struct String; }
1717
namespace tree { template<typename T> class TreeNode; }
18-
namespace grammar { struct CfgGrammar; }
18+
namespace grammar { class CfgGrammar; }
1919

2020
namespace logic {
2121

@@ -138,7 +138,7 @@ struct DlCore {
138138
// Note that the unifier for trees can be exponential in size w.r.t. the input, e.g. formulas { a\orz\ory\orx\orw, w\or(x\or(y\or(z\ora))) } [n := 5 variables each] result in
139139
// unifier 〈w, a\ora\or(a\ora)\or(a\ora\or(a\ora))〉, 〈x, a\ora\or(a\ora)〉, 〈y, a\ora〉, 〈z, a〉 [15 variables, generally 2^(n-2) + ... + 2^1 + 2^0 = sum_(k=0)^(n-2)2^k = 2^(n-1)-1].
140140
// Their unified formula is thereby a\ora\or(a\ora)\or(a\ora\or(a\ora))\or(a\ora\or(a\ora)\or(a\ora\or(a\ora))) [16 variables, generally 2^(n-1)].
141-
static bool tryUnifyTrees(const std::shared_ptr<logic::DlFormula>& formulaA, const std::shared_ptr<logic::DlFormula>& formulaB, std::map<std::string, std::shared_ptr<logic::DlFormula>>* optOut_substitutions = nullptr, bool debug = false);
141+
static bool tryUnifyTrees(const std::shared_ptr<DlFormula>& formulaA, const std::shared_ptr<DlFormula>& formulaB, std::map<std::string, std::shared_ptr<DlFormula>>* optOut_substitutions = nullptr, bool debug = false);
142142

143143
// A standard formula representation, except that topmost binary operators are not surrounded by parentheses.
144144
static std::string formulaRepresentation_traverse(const std::shared_ptr<DlFormula>& formula);
@@ -203,7 +203,7 @@ struct DlCore {
203203
private:
204204
// Helper functions
205205
static bool _isSchemaOf(const std::shared_ptr<DlFormula>& potentialSchema, const std::shared_ptr<DlFormula>& formula, std::map<std::string, std::shared_ptr<DlFormula>>& substitutions);
206-
static bool _tryUnifyTrees(const std::shared_ptr<logic::DlFormula>& formulaA, const std::shared_ptr<logic::DlFormula>& formulaB, std::map<std::string, std::shared_ptr<logic::DlFormula>>& substitutions, bool debug);
206+
static bool _tryUnifyTrees(const std::shared_ptr<DlFormula>& formulaA, const std::shared_ptr<DlFormula>& formulaB, std::map<std::string, std::shared_ptr<DlFormula>>& substitutions, bool debug);
207207
static void _toBasicDlFormula(const std::shared_ptr<DlFormula>& destinationNode, const std::shared_ptr<DlFormula>& formula, std::unordered_map<std::shared_ptr<DlFormula>, std::shared_ptr<DlFormula>>* optOut_originals, bool calculateMeanings);
208208
static void _substitute(const std::shared_ptr<DlFormula>& destinationNode, const std::shared_ptr<DlFormula>& formula, const std::map<std::string, std::shared_ptr<DlFormula>>& substitutions);
209209
};

logic/DlProofEnumerator.cpp

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -761,7 +761,7 @@ void DlProofEnumerator::sampleCombinations() {
761761
cerr << "Some tests failed." << endl;
762762
}
763763

764-
void DlProofEnumerator::printProofs(const vector<string>& dProofs, DlFormulaStyle outputNotation, bool conclusionsOnly, bool summaryMode, unsigned minUseAmountToCreateHelperProof, bool abstractProofStrings, const string* inputFile, const string* outputFile, bool debug) {
764+
void DlProofEnumerator::printProofs(const vector<string>& dProofs, DlFormulaStyle outputNotation, bool conclusionsOnly, bool summaryMode, unsigned minUseAmountToCreateHelperProof, bool abstractProofStrings, const string* inputFile, const string* outputFile, bool debug, string* optOut_result, unordered_map<size_t, size_t>* optOut_indexOrigins) {
765765
chrono::time_point<chrono::steady_clock> startTime;
766766
vector<string> dProofsFromFile;
767767
if (inputFile) {
@@ -869,20 +869,40 @@ void DlProofEnumerator::printProofs(const vector<string>& dProofs, DlFormulaStyl
869869
}
870870
}
871871
}
872-
if (!outputFile)
873-
cout << ss.str() << flush;
874-
else {
872+
if (optOut_result)
873+
*optOut_result = ss.str();
874+
if (optOut_indexOrigins)
875+
*optOut_indexOrigins = indexOrigins;
876+
if (outputFile) {
875877
if (debug)
876878
startTime = chrono::steady_clock::now();
877879
if (!FctHelper::writeToFile(*outputFile, ss.str()))
878880
throw runtime_error("Failed to write to file at \"" + *outputFile + "\".");
879881
if (debug)
880882
cout << FctHelper::durationStringMs(chrono::duration_cast<chrono::microseconds>(chrono::steady_clock::now() - startTime)) << " taken to save " << ss.str().length() << " bytes to \"" << *outputFile << "\"." << endl;
881-
}
882-
if (!conclusionsOnly && (_dProofs.size() != rawParseData.size() || !duplicates.empty()))
883+
} else if (!optOut_result)
884+
cout << ss.str() << flush;
885+
if (!conclusionsOnly && (_dProofs.size() != rawParseData.size() || !duplicates.empty() || any_of(indexOrigins.begin(), indexOrigins.end(), [](const pair<const size_t, size_t>& p) { return p.first != p.second; })))
883886
cout << "Index correspondences (out,in) are " << FctHelper::mapString(map<size_t, size_t>(indexOrigins.begin(), indexOrigins.end())) << "." << endl;
884887
}
885888

889+
string::size_type DlProofEnumerator::printProofSummary(ostream& mout, const vector<DRuleParser::AxiomInfo>& axioms, const vector<string>& abstractDProof, const vector<shared_ptr<DlFormula>>& conclusions, bool normalPolishNotation, bool printInfixUnicode) {
890+
auto infixUnicode = [](const shared_ptr<DlFormula>& f) { string s = DlCore::formulaRepresentation_traverse(f); boost::replace_all(s, DlCore::terminalStr_and(), "∧"); boost::replace_all(s, DlCore::terminalStr_or(), "∨"); boost::replace_all(s, DlCore::terminalStr_nand(), "↑"); boost::replace_all(s, DlCore::terminalStr_nor(), "↓"); boost::replace_all(s, DlCore::terminalStr_imply(), "→"); boost::replace_all(s, DlCore::terminalStr_implied(), "←"); boost::replace_all(s, DlCore::terminalStr_nimply(), "↛"); boost::replace_all(s, DlCore::terminalStr_nimplied(), "↚"); boost::replace_all(s, DlCore::terminalStr_equiv(), "↔"); boost::replace_all(s, DlCore::terminalStr_xor(), "↮"); boost::replace_all(s, DlCore::terminalStr_com(), "↷"); boost::replace_all(s, DlCore::terminalStr_app(), "↝"); boost::replace_all(s, DlCore::terminalStr_not(), "¬"); boost::replace_all(s, DlCore::terminalStr_nece(), "□"); boost::replace_all(s, DlCore::terminalStr_poss(), "◇"); boost::replace_all(s, DlCore::terminalStr_obli(), "○"); boost::replace_all(s, DlCore::terminalStr_perm(), "⌔"); boost::replace_all(s, DlCore::terminalStr_top(), "⊤"); boost::replace_all(s, DlCore::terminalStr_bot(), "⊥"); return s; };
891+
string::size_type bytes = 0;
892+
for (const DRuleParser::AxiomInfo& ax : axioms) {
893+
string f = printInfixUnicode ? infixUnicode(ax.refinedAxiom) : normalPolishNotation ? DlCore::toPolishNotation(ax.refinedAxiom) : DlCore::toPolishNotation_noRename(ax.refinedAxiom);
894+
mout << " " << f << " = " << ax.name << "\n";
895+
bytes += 9 + f.length();
896+
}
897+
for (size_t i = 0; i < abstractDProof.size(); i++) {
898+
string f = printInfixUnicode ? infixUnicode(conclusions[i]) : normalPolishNotation ? DlCore::toPolishNotation(conclusions[i]) : DlCore::toPolishNotation_noRename(conclusions[i]);
899+
const string& p = abstractDProof[i];
900+
mout << "[" << i << "] " << f << " = " << p << "\n";
901+
bytes += 7 + FctHelper::digitsNum_uint64(i) + f.length() + p.length();
902+
}
903+
return bytes;
904+
}
905+
886906
void DlProofEnumerator::convertProofSummaryToAbstractDProof(const string& input, vector<DRuleParser::AxiomInfo>* optOut_customAxioms, vector<string>* optOut_abstractDProof, vector<DRuleParser::AxiomInfo>* optOut_requiredIntermediateResults, bool useInputFile, bool normalPolishNotation, bool noInputConclusions, bool debug) {
887907
vector<string> summaryLines;
888908
{
@@ -942,7 +962,7 @@ void DlProofEnumerator::convertProofSummaryToAbstractDProof(const string& input,
942962
throw invalid_argument("Missing axiom name in \"" + line + "\".");
943963
string axName = line.substr(pos);
944964
if (axName.length() != 1 || ((axName[0] < '1' || axName[0] > '9') && (axName[0] < 'a' || axName[0] > 'z')))
945-
throw invalid_argument("Invalid axiom name in \"" + line + "\".");
965+
throw invalid_argument("Invalid axiom name (\"" + axName + "\") in \"" + line + "\".");
946966
size_t num = axName[0] >= '1' && axName[0] <= '9' ? axName[0] - '1' : 10 + axName[0] - 'a' - 1;
947967
if (num != axiomIndex++)
948968
throw invalid_argument("[axiomIndex = " + to_string(axiomIndex - 1) + ", char = " + to_string(axiomIndex - 10 + 'a') + "] Invalid axiom number in \"" + line + "\". Should be " + (axiomIndex <= 9 ? string { char(axiomIndex + '0') } : string { char(axiomIndex - 10 + 'a') }) + ".");
@@ -1013,22 +1033,6 @@ void DlProofEnumerator::recombineProofSummary(const string& input, bool useInput
10131033
vector<shared_ptr<DlFormula>> conclusions;
10141034
const vector<string> abstractDProof = DRuleParser::recombineAbstractDProof(abstractDProof_input, conclusions, &customAxioms, targetEverything, filterForTheorems && !targetEverything ? *filterForTheorems != "." || noInputConclusions ? &filterForTheorems_axInfo : &requiredIntermediateResults : nullptr, conclusionsWithHelperProofs ? &conclusionsWithHelperProofs_axInfo : nullptr, minUseAmountToCreateHelperProof, noInputConclusions ? nullptr : &requiredIntermediateResults, debug, maxLengthToKeepProof, abstractProofStrings, storeIntermediateUnfoldingLimit, maxLengthToComputeDProof, removeDuplicateConclusions, compress, compress_concurrentDRuleSearch, compress_modificationRange, compress_keepMaxRules, compress_vaultFile, compress_sureSaves, compress_skipFirstPrep);
10151035

1016-
auto print = [&](ostream& mout) -> string::size_type {
1017-
auto infixUnicode = [](const shared_ptr<DlFormula>& f) { string s = DlCore::formulaRepresentation_traverse(f); boost::replace_all(s, DlCore::terminalStr_and(), "∧"); boost::replace_all(s, DlCore::terminalStr_or(), "∨"); boost::replace_all(s, DlCore::terminalStr_nand(), "↑"); boost::replace_all(s, DlCore::terminalStr_nor(), "↓"); boost::replace_all(s, DlCore::terminalStr_imply(), "→"); boost::replace_all(s, DlCore::terminalStr_implied(), "←"); boost::replace_all(s, DlCore::terminalStr_nimply(), "↛"); boost::replace_all(s, DlCore::terminalStr_nimplied(), "↚"); boost::replace_all(s, DlCore::terminalStr_equiv(), "↔"); boost::replace_all(s, DlCore::terminalStr_xor(), "↮"); boost::replace_all(s, DlCore::terminalStr_com(), "↷"); boost::replace_all(s, DlCore::terminalStr_app(), "↝"); boost::replace_all(s, DlCore::terminalStr_not(), "¬"); boost::replace_all(s, DlCore::terminalStr_nece(), "□"); boost::replace_all(s, DlCore::terminalStr_poss(), "◇"); boost::replace_all(s, DlCore::terminalStr_obli(), "○"); boost::replace_all(s, DlCore::terminalStr_perm(), "⌔"); boost::replace_all(s, DlCore::terminalStr_top(), "⊤"); boost::replace_all(s, DlCore::terminalStr_bot(), "⊥"); return s; };
1018-
string::size_type bytes = 0;
1019-
for (const DRuleParser::AxiomInfo& ax : customAxioms) {
1020-
string f = printInfixUnicode ? infixUnicode(ax.refinedAxiom) : normalPolishNotation ? DlCore::toPolishNotation(ax.refinedAxiom) : DlCore::toPolishNotation_noRename(ax.refinedAxiom);
1021-
mout << " " << f << " = " << ax.name << "\n";
1022-
bytes += 9 + f.length();
1023-
}
1024-
for (size_t i = 0; i < abstractDProof.size(); i++) {
1025-
string f = printInfixUnicode ? infixUnicode(conclusions[i]) : normalPolishNotation ? DlCore::toPolishNotation(conclusions[i]) : DlCore::toPolishNotation_noRename(conclusions[i]);
1026-
const string& p = abstractDProof[i];
1027-
mout << "[" << i << "] " << f << " = " << p << "\n";
1028-
bytes += 7 + FctHelper::digitsNum_uint64(i) + f.length() + p.length();
1029-
}
1030-
return bytes;
1031-
};
10321036
chrono::time_point<chrono::steady_clock> startTime;
10331037
if (debug)
10341038
startTime = chrono::steady_clock::now();
@@ -1039,12 +1043,12 @@ void DlProofEnumerator::recombineProofSummary(const string& input, bool useInput
10391043
string::size_type bytes;
10401044
{
10411045
ofstream fout(file, fstream::out | fstream::binary);
1042-
bytes = print(fout);
1046+
bytes = printProofSummary(fout, customAxioms, abstractDProof, conclusions, normalPolishNotation, printInfixUnicode);
10431047
}
10441048
if (debug)
10451049
cout << FctHelper::durationStringMs(chrono::duration_cast<chrono::microseconds>(chrono::steady_clock::now() - startTime)) << " taken to print and save " << bytes << " bytes to " << file.string() << "." << endl;
10461050
} else {
1047-
string::size_type bytes = print(cout);
1051+
string::size_type bytes = printProofSummary(cout, customAxioms, abstractDProof, conclusions, normalPolishNotation, printInfixUnicode);
10481052
cout << flush;
10491053
if (debug)
10501054
cout << FctHelper::durationStringMs(chrono::duration_cast<chrono::microseconds>(chrono::steady_clock::now() - startTime)) << " taken to print " << bytes << " bytes." << endl;
@@ -4063,9 +4067,9 @@ void DlProofEnumerator::printConclusionLengthPlotData(bool measureSymbolicLength
40634067
++it;
40644068
}
40654069
if (table)
4066-
ss << FctHelper::mapStringF(allAmounts, [](const pair<size_t, size_t>& p) { return to_string(p.first) + "\t" + to_string(p.second); }, { }, "\n", "\n") << "\n";
4070+
ss << FctHelper::mapStringF(allAmounts, [](const pair<const size_t, size_t>& p) { return to_string(p.first) + "\t" + to_string(p.second); }, { }, "\n", "\n") << "\n";
40674071
else
4068-
ss << FctHelper::mapStringF(allAmounts, [](const pair<size_t, size_t>& p) { return to_string(p.first) + " " + to_string(p.second); }, { }, "\n", " ") << "\n";
4072+
ss << FctHelper::mapStringF(allAmounts, [](const pair<const size_t, size_t>& p) { return to_string(p.first) + " " + to_string(p.second); }, { }, "\n", " ") << "\n";
40694073
} else
40704074
ss << "\n";
40714075
// formula representation lengths: ([1,1000] data) [x <= 500] https://www.desmos.com/calculator/b9qvvkinal, https://i.imgur.com/IMFY84S.png ; [x,y <= 1000] https://www.desmos.com/calculator/tjej0cpyju, https://i.imgur.com/1Z4WjJa.png ; [x <= 1000, y <= 100] https://www.desmos.com/calculator/zpe5zw41cm, https://i.imgur.com/6aCR6iq.png

0 commit comments

Comments
 (0)