Skip to content

Commit

Permalink
uploading a project
Browse files Browse the repository at this point in the history
  • Loading branch information
XAH30 authored Feb 4, 2024
0 parents commit 6ce6f39
Show file tree
Hide file tree
Showing 37 changed files with 5,496 additions and 0 deletions.
16 changes: 16 additions & 0 deletions Classes/Chunk.cpp
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;
}
};
13 changes: 13 additions & 0 deletions Classes/Feature.cpp
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;
}
};
118 changes: 118 additions & 0 deletions Classes/LSH.cpp
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;
}
};
56 changes: 56 additions & 0 deletions Classes/Results.cpp
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;
};
16 changes: 16 additions & 0 deletions Classes/Subchunk.cpp
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;
}
};
10 changes: 10 additions & 0 deletions DataPrinters/allDataPrinter.cpp
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;
}
}
16 changes: 16 additions & 0 deletions DataPrinters/bucketPrinter.cpp
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;
}
}
}
41 changes: 41 additions & 0 deletions DataPrinters/candidatesPrinter.cpp
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;
}
}
}
26 changes: 26 additions & 0 deletions DataPrinters/oneHotMatrixPrinter.cpp
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;
}
7 changes: 7 additions & 0 deletions DataPrinters/printVector.cpp
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";
}
}
16 changes: 16 additions & 0 deletions Info/cassert.txt
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.

Оба этих макросов предоставляют способ удостовериться в правильности предположений или ожиданий в
программе. Они обычно используются для проверки инвариантов, предусловий и постусловий в коде, что
помогает выявить ошибки и обеспечить корректность программы.
Loading

0 comments on commit 6ce6f39

Please sign in to comment.