-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 6ce6f39
Showing
37 changed files
with
5,496 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
class Chunk { | ||
private: | ||
string data; | ||
size_t size; | ||
|
||
public: | ||
Chunk(const string& chunkData, size_t chunkSize) : data(chunkData), size(chunkSize) {} | ||
|
||
const string& getData() const { | ||
return data; | ||
} | ||
|
||
size_t getSize() const { | ||
return size; | ||
} | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
class Feature { | ||
private: | ||
string hash; | ||
|
||
public: | ||
Feature(const string& featureHash) : hash(featureHash) {} | ||
|
||
Feature() {} | ||
|
||
const string& getHash() const { | ||
return hash; | ||
} | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,118 @@ | ||
class LSH { | ||
std::vector<std::unordered_map<std::string, std::vector<int>>> buckets; | ||
int counter; | ||
|
||
public: | ||
LSH(int b) : buckets(b), counter(0) { | ||
for (int i = 0; i < b; i++) { | ||
buckets[i] = {}; | ||
} | ||
} | ||
|
||
// Функция makeSubVecs создает подвекторы (subvecs) на основе входного вектора signature. Размер каждого подвектора | ||
// определяется на основе количества корзин (buckets) в объекте LSH. | ||
|
||
// Аргумент функции: | ||
|
||
// signature: вектор, для которого нужно создать подвекторы. | ||
|
||
// Алгоритм функции: | ||
|
||
// Получается размер входного вектора l. | ||
// Проверяется, что l делится нацело на количество корзин (buckets.size()). В противном случае будет вызвано исключение assert. | ||
// Вычисляется размер каждого подвектора r путем деления l на количество корзин (buckets.size()). | ||
// Создается пустой двумерный вектор subvecs, который будет содержать подвекторы. | ||
// В цикле с шагом r проходится по входному вектору signature и на каждой итерации создается подвектор subvec. Подвектор | ||
// создается путем выбора элементов из входного вектора signature в диапазоне от i до i + r (не включая i + r). | ||
// Затем созданный подвектор добавляется в двумерный вектор subvecs. | ||
// В конце функция возвращает созданный двумерный вектор subvecs. | ||
std::vector<std::vector<int>> makeSubVecs(const std::vector<int>& signature) { | ||
int l = signature.size(); | ||
assert(l % buckets.size() == 0); | ||
int r = l / buckets.size(); | ||
std::vector<std::vector<int>> subvecs; | ||
for (int i = 0; i < l; i += r) { | ||
std::vector<int> subvec(signature.begin() + i, signature.begin() + i + r); | ||
subvecs.push_back(subvec); | ||
} | ||
return subvecs; | ||
} | ||
|
||
// Функция addHash добавляет хэш (hash) в объект LSH. Хэш создается путем разделения входного вектора | ||
// signature на подвекторы и сохранения соответствующих хэш-значений в соответствующих корзинах (buckets) объекта LSH. | ||
|
||
// Аргумент функции: | ||
|
||
// signature: вектор, для которого нужно создать хэш и добавить его в объект LSH. | ||
|
||
// Алгоритм функции: | ||
|
||
// Создается пустой двумерный вектор subvecs путем вызова функции makeSubVecs с входным вектором signature. | ||
// Функция makeSubVecs разделяет signature на подвекторы на основе количества корзин в объекте LSH. | ||
// В цикле проходится по каждому подвектору в subvecs с помощью индекса i. | ||
// Создается пустая строка subvec_str, которая будет использоваться для формирования строки хэша подвектора. | ||
// Во внутреннем цикле проходится по каждому элементу подвектора subvecs[i] с помощью индекса j. | ||
// Каждое значение элемента преобразуется в строку с помощью std::to_string и добавляется к subvec_str. | ||
// Если это не последний элемент подвектора, то к subvec_str добавляется запятая. | ||
// Проверяется, существует ли в корзине i элемент с ключом subvec_str. Если его нет, то создается пустой вектор в корзине i с ключом subvec_str. | ||
// Вектор counter добавляется в корзину i с ключом subvec_str. | ||
// Увеличивается значение счетчика counter на единицу. | ||
void addHash(const std::vector<int>& signature) { | ||
std::vector<std::vector<int>> subvecs = makeSubVecs(signature); | ||
for (int i = 0; i < subvecs.size(); i++) { | ||
std::string subvec_str = ""; | ||
for (int j = 0; j < subvecs[i].size(); j++) { | ||
subvec_str += std::to_string(subvecs[i][j]); | ||
if (j < subvecs[i].size() - 1) { | ||
subvec_str += ","; | ||
} | ||
} | ||
if (buckets[i].find(subvec_str) == buckets[i].end()) { | ||
buckets[i][subvec_str] = {}; | ||
} | ||
buckets[i][subvec_str].push_back(counter); | ||
} | ||
counter++; | ||
} | ||
|
||
// Функция check_candidates выполняет проверку кандидатов для заданного вектора query в объекте LSH. | ||
// Она использует хэш-таблицы и корзины объекта LSH для поиска потенциально близких векторов к query. | ||
|
||
// Аргументы функции: | ||
|
||
// query: вектор, для которого нужно найти потенциально близкие векторы. | ||
|
||
// Алгоритм функции: | ||
|
||
// Создается пустой вектор candidates, который будет содержать найденных кандидатов. | ||
// Создается двумерный вектор subvecs путем вызова функции makeSubVecs с входным вектором query. | ||
// Функция makeSubVecs разделяет query на подвекторы в соответствии с количеством корзин в объекте LSH. | ||
// В цикле проходится по каждому подвектору в subvecs с помощью индекса i. | ||
// Создается пустая строка subvec_str, которая будет использоваться для формирования строки хэша подвектора. | ||
// Во внутреннем цикле проходится по каждому элементу подвектора subvecs[i] с помощью индекса j. | ||
// Каждое значение элемента преобразуется в строку с помощью std::to_string и добавляется к subvec_str. | ||
// Если это не последний элемент подвектора, то к subvec_str добавляется запятая. | ||
// Проверяется, существует ли корзина i в объекте LSH. Если это так, то выполняется поиск элемента с ключом subvec_str в корзине i. | ||
// Если элемент с ключом subvec_str найден, то его значения добавляются в вектор candidates. | ||
// Возвращается вектор candidates. | ||
std::set<std::pair<int, int>> check_candidates() { | ||
std::set<std::pair<int, int>> candidates; | ||
for (const auto& bucket_band : buckets) { | ||
for (const auto& bucket : bucket_band) { | ||
const std::vector<int>& hits = bucket.second; | ||
if (hits.size() > 1) { | ||
for (int i = 0; i < hits.size(); i++) { | ||
for (int j = i + 1; j < hits.size(); j++) { | ||
candidates.insert({hits[i], hits[j]}); | ||
} | ||
} | ||
} | ||
} | ||
} | ||
return candidates; | ||
} | ||
|
||
const std::vector<std::unordered_map<std::string, std::vector<int>>>& getBuckets() const { | ||
return buckets; | ||
} | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
class Results { | ||
public: | ||
Results(const set<pair<int, int>>& results, const string& methodName) | ||
: results(results), methodName(methodName) {} | ||
|
||
Results() {} | ||
|
||
void head(int count = 5) const { | ||
cout << "Results from " << methodName << " (head " << count << "):" << endl; | ||
int printedCount = 0; | ||
for (const auto& result : results) { | ||
cout << "(" << result.first << ", " << result.second << ")" << endl; | ||
printedCount++; | ||
if (printedCount >= count) { | ||
break; | ||
} | ||
} | ||
} | ||
|
||
void tail(int count = 5) const { | ||
cout << "Results from " << methodName << " (tail " << count << "):" << endl; | ||
int resultCount = results.size(); | ||
int printedCount = 0; | ||
for (auto it = results.rbegin(); it != results.rend(); ++it) { | ||
cout << "(" << it->first << ", " << it->second << ")" << endl; | ||
printedCount++; | ||
if (printedCount >= count || printedCount >= resultCount) { | ||
break; | ||
} | ||
} | ||
} | ||
|
||
void sample(int count = 5) const { | ||
cout << "Results from " << methodName << " (random sample " << count << "):" << endl; | ||
vector<pair<int, int>> resultVector(results.begin(), results.end()); | ||
random_device rd; | ||
mt19937 g(rd()); | ||
shuffle(resultVector.begin(), resultVector.end(), g); | ||
int printedCount = 0; | ||
for (const auto& result : resultVector) { | ||
cout << "(" << result.first << ", " << result.second << ")" << endl; | ||
printedCount++; | ||
if (printedCount >= count) { | ||
break; | ||
} | ||
} | ||
} | ||
|
||
string getName() const{ | ||
return methodName; | ||
} | ||
|
||
private: | ||
set<pair<int, int>> results; | ||
string methodName; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
class Subchunk { | ||
private: | ||
string data; | ||
size_t size; | ||
|
||
public: | ||
Subchunk(const string& subchunkData, size_t subchunkSize) : data(subchunkData), size(subchunkSize) {} | ||
|
||
const string& getData() const { | ||
return data; | ||
} | ||
|
||
size_t getSize() const { | ||
return size; | ||
} | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
// Вывод датасета | ||
|
||
template<typename Type> | ||
void printAllData(std::vector<std::vector<Type>> data) { | ||
for (const auto& row : data) { | ||
for (const Type& value : row) | ||
std::cout << value << " "; | ||
std::cout << std::endl; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
// Вывод индексов рассматриваемых строк и строк, с которыми они похожи | ||
void printBucket(std::vector<std::unordered_map<std::string, std::vector<int>>> buckets){ | ||
for (int i = 0; i < buckets.size(); i++) { | ||
std::cout << "Bucket " << i << ":" << std::endl; | ||
const std::unordered_map<std::string, std::vector<int>>& bucket_band = buckets[i]; | ||
for (const auto& bucket : bucket_band) { | ||
const std::string& subvec_str = bucket.first; | ||
const std::vector<int>& hits = bucket.second; | ||
std::cout << " Subvector: " << subvec_str << ", Hits: "; | ||
for (int hit : hits) { | ||
std::cout << hit << " "; | ||
} | ||
std::cout << std::endl; | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
// Функция printCandidates используется для печати пар кандидатов на основе входных данных candidate_pairs1, candidate_pairs2 и sentences. | ||
|
||
// Аргументы функции: | ||
|
||
// candidate_pairs1: множество пар кандидатов. | ||
// candidate_pairs2: множество пар кандидатов. | ||
// sentences: вектор строк, содержащих предложения. | ||
|
||
// Алгоритм функции: | ||
|
||
// Создается указатель checker на множество пар для добавления ппар, которые уже были выведены. | ||
// Инициализируется переменная count со значением 0. | ||
// Инициализируется флаг flag со значением true. | ||
// Вложенным циклом перебираются пары из candidate_pairs2 и candidate_pairs1. | ||
// Если пара {pair1.first, pair1.second} отсутствует в множестве checker, предложения sentences[pair1.first] и sentences[pair1.second] различны, | ||
// а предложения sentences[pair2.first] и sentences[pair1.first], а также sentences[pair2.second] и sentences[pair1.second] совпадают, | ||
// то выводится информация о паре кандидатов pair1 и увеличивается счетчик count. Затем пара {pair1.first, pair1.second} добавляется в множество checker. | ||
// Если значение счетчика count достигает 20, флаг flag устанавливается в false, и происходит прерывание цикла. | ||
// Если флаг flag равен false, происходит прерывание внешнего цикла. | ||
void printCandidates(std::set<std::pair<int, int>> candidate_pairs1, std::set<std::pair<int, int>> candidate_pairs2, std::vector<std::string> sentences){ | ||
std::set<std::pair<int, int>> *checker = new std::set<std::pair<int, int>>; | ||
int count = 0; | ||
std::cout << "First 20 candidate pairs:" << std::endl; | ||
bool flag = true; | ||
for (const auto& pair2 : candidate_pairs2) { | ||
for (const auto& pair1 : candidate_pairs1) { | ||
if (checker->count({pair1.first, pair1.second}) < 1 && sentences[pair1.first] != sentences[pair1.second] && sentences[pair2.first] == sentences[pair1.first] && sentences[pair2.second] == sentences[pair1.second]){ | ||
std::cout << pair1.first << ")" << sentences[pair1.first] << " : " << pair1.second << ")" << sentences[pair1.second] << std::endl << std::endl; | ||
count++; | ||
checker->insert({pair1.first, pair1.second}); | ||
} | ||
if (count >= 20) { | ||
flag = false; | ||
break; | ||
} | ||
} | ||
if (flag == false){ | ||
break; | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
// Вывод one-hot matrix в формате матрицы | ||
|
||
// one-hot encoding представляет собой способ представления категориальных данных в виде | ||
// бинарных векторов. Основная идея заключается в том, что каждая уникальная категория или | ||
// класс данных представляется вектором фиксированной длины, где только один элемент равен 1, | ||
// а все остальные элементы равны 0 | ||
|
||
// Шинглы (shingles) - это последовательности элементов фиксированной длины | ||
template<typename Type> | ||
void printOneHotMatrix(std::vector<std::vector<Type>> shingles_1hot_matrix){ | ||
std::cout << "["; | ||
for (int i = 0; i < shingles_1hot_matrix.size(); i++) { | ||
std::cout << "["; | ||
for (int j = 0; j < shingles_1hot_matrix[i].size(); j++) { | ||
std::cout << shingles_1hot_matrix[i][j]; | ||
if (j != shingles_1hot_matrix[i].size() - 1) { | ||
std::cout << ", "; | ||
} | ||
} | ||
std::cout << "]"; | ||
if (i != shingles_1hot_matrix.size() - 1) { | ||
std::cout << ", "; | ||
} | ||
} | ||
std::cout << "]" << std::endl; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
// Вывод вектора в столбец | ||
template<typename Type> | ||
void printVector(vector<Type> data) { | ||
for (const Type& value : data) { | ||
cout << value << "\n"; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
cassert - это заголовочный файл стандартной библиотеки C++, который содержит макросы и функции | ||
для проверки утверждений (assertions) в программе. Он предоставляет средства для проверки предположений, | ||
условий и инвариантов во время выполнения программы. | ||
|
||
Основные функции и макросы, предоставляемые cassert, включают: | ||
|
||
assert(expression) - макрос, который используется для проверки условия expression. Если условие | ||
является ложным (т.е., имеет значение 0), то макрос assert вызывает аварийную остановку программы | ||
и выводит сообщение об ошибке, указывающее на то, какое условие не выполнено. | ||
|
||
static_assert(expression, message) - статический макрос, который используется для проверки условия | ||
expression во время компиляции. Если условие является ложным, то компилятор выдаст ошибку с сообщением message. | ||
|
||
Оба этих макросов предоставляют способ удостовериться в правильности предположений или ожиданий в | ||
программе. Они обычно используются для проверки инвариантов, предусловий и постусловий в коде, что | ||
помогает выявить ошибки и обеспечить корректность программы. |
Oops, something went wrong.