Skip to content

Commit f7c2b6c

Browse files
authored
merge: merge init
Initial PR
2 parents e8dfc8a + db6b746 commit f7c2b6c

64 files changed

Lines changed: 55878 additions & 169 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 88 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,107 @@
1-
# C++ project template with Google Tests and CI/CD
1+
# ProbabilityTheoryModeling
2+
## Сборка и тесты
3+
4+
```bash
5+
mkdir -p cmake-build-debug
6+
cd cmake-build-debug
7+
cmake ..
8+
cmake --build .
9+
ctest # или ./bin/cpp_tests
10+
```
211

3-
This is a project template. Feel free to use & fork it. It contains all pre-configured
4-
CMakeLists.txt, so to use it, replace project name with your one in
5-
[main CmakeLists.txt](CMakeLists.txt), and all target and executable names in
6-
[CI/CD script](./.github/workflows/ci_tests.yml). Sample program prints a greeting for the first argument.
12+
---
713

8-
## How to build and run
14+
## Задание 1. Конечное вероятностное пространство и σ-алгебра
915

10-
Run the following commands from the project directory.
1116

12-
1. Create CMake cache
17+
* Реализовать конечное пространство исходов `OutcomeSpace`.
18+
* Реализовать класс `Event` (событие как подмножество Ω).
19+
* Реализовать `ProbabilityMeasure`, задающую вероятности атомов и событий.
20+
* Реализовать дискретную случайную величину `DiscreteRandomVariable` и вычисление ее математического ожидания.
21+
* Опционально: проверить, что набор событий образует σ-алгебру.
1322

14-
```shell
15-
cmake -S . -B cmake-build
16-
```
23+
Ожидается, что можно:
1724

18-
2. Build executable target
25+
* Создать Ω (например, исходы броска кубика).
26+
* Задать события (чётные числа и т.п.).
27+
* Посчитать их вероятности и E[X] для простой X.
1928

20-
```shell
21-
cmake --build cmake-build --target cpp_tests
22-
```
29+
---
2330

24-
3. Build tests target
31+
## Задание 2. Распределения и моделирование
2532

26-
```shell
27-
cmake --build cmake-build --target cpp_tests_tests
28-
```
33+
* Есть базовый интерфейс `Distribution` с методами:
2934

30-
4. Run executable target
35+
* `Pdf(x)` / `Cdf(x)`
36+
* `Sample(rng)`
37+
* теоретические `Mean`, `Cariance`
38+
* Реализовать/использовать распределения:
3139

32-
* On Windows:
40+
* Бернулли, биномиальное, геометрическое, Пуассон
41+
* Нормальное, равномерное, экспоненциальное
42+
* Коши, Лапласа (или другое «интересное» распределение)
43+
* Класс `DistributionExperiment`:
3344

34-
```shell
35-
.\cmake-build\cpp_tests.exe World
36-
```
45+
* сэмплирует N значений,
46+
* считает выборочные среднее и дисперсию,
47+
* сравнивает с теорией,
48+
* может строить эмпирическую CDF и считать расстояние Колмогорова.
3749

38-
* On *nix:
50+
Ожидается, что можно:
3951

40-
```shell
41-
./cmake-build/bin/cpp_tests World
42-
```
52+
* Для каждого распределения провести эксперимент.
53+
* Убедиться, что выборочные характеристики приближаются к теоретическим.
4354

44-
5. Run tests
55+
---
4556

46-
* On Windows:
57+
## Задание 3. Закон больших чисел
4758

48-
```shell
49-
.\cmake-build\cpp_tests_tests.exe
50-
```
59+
* Класс `LawOfLargeNumbersSimulator`:
5160

52-
* On *nix:
61+
* принимает `std::shared_ptr<Distribution>`,
62+
* моделирует одну траекторию выборочного среднего
63+
$\overline{X}_n = (X_1 + \dots + X_n)/n$ при $n = \text{step}, 2\text{step}, \dots$,
64+
* возвращает вектор записей `(n, sample_mean, |sample_mean - theoretical_mean|)`.
5365

54-
```shell
55-
./cmake-build/tests/cpp_tests_tests
56-
```
66+
Ожидается, что можно:
67+
68+
* Для разных распределений (Ber, Uniform, Exp, Laplace) показать численно, что
69+
$|\overline{X}_n - \mu|$ уменьшается при росте `n`.
70+
* Обсудить поведение для распределения, у которого матожидание не определено (Коши).
71+
72+
---
73+
74+
## Задание 4. Цепи Маркова и генерация текста
75+
76+
* Класс `MarkovChain`:
77+
78+
* состояния - строки (`std::string`),
79+
* инкрементальное обучение по последовательностям состояний,
80+
* хранение счётчиков переходов и оценка `P(next | current)`,
81+
* генерация цепочки заданной длины.
82+
* Класс `MarkovTextModel`:
83+
84+
* два режима токенизации: `Character` (символы) и `Word` (слова),
85+
* `trainFromText(text)` - токенизировать и обучить цепь Маркова,
86+
* `generateText(num_tokens, rng, start_token)` - сгенерировать текст.
87+
* Интеграционный тест:
88+
89+
* обучить word-level модель на «Войне и мире»,
90+
* проверить размер словаря,
91+
* убедиться, что типичные слова попали в модель,
92+
* проверить, что генерация текста работает.
93+
94+
Ожидается, что можно:
95+
96+
* Обучить Markov-модель на большом корпусе.
97+
* Генерировать текст в стиле корпуса.
98+
* Сравнить word- и char-модели.
99+
100+
---
101+
102+
Краткое резюме:
103+
104+
* Задание 1: моделируем конечное Ω, события и вероятности.
105+
* Задание 2: реализуем и исследуем разные распределения.
106+
* Задание 3: показываем закон больших чисел на численных экспериментах.
107+
* Задание 4: строим цепь Маркова и генерируем текст (в т.ч. по «Войне и миру»).

bin/CMakeLists.txt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
add_executable(${PROJECT_NAME} main.cpp)
22

33
target_link_libraries(${PROJECT_NAME} PUBLIC
4-
ui
4+
sigma-algebra
5+
distributions
6+
markov-chain
7+
law-of-large-numbers
58
)
69

710
target_include_directories(${PROJECT_NAME} PUBLIC ${PROJECT_SOURCE_DIR})

bin/main.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
#include <iostream>
1+
#include <cstdint>
22

3-
#include "lib/ui/ui_functions.hpp"
4-
5-
int main(int32_t argc, char** argv) {
6-
std::vector<std::string> args = std::vector<std::string>(argv, argv + argc);
7-
return StartConsoleUI(args, std::cout);
3+
int main(std::int32_t argc, char** argv) {
4+
// You can add anything you want here
5+
return 0;
86
}

lib/CMakeLists.txt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
cmake_minimum_required(VERSION 3.12)
22

3-
add_subdirectory(mylib)
4-
add_subdirectory(ui)
3+
add_subdirectory(sigma-algebra)
4+
add_subdirectory(distributions)
5+
add_subdirectory(law-of-large-numbers)
6+
add_subdirectory(markov-chain)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#include "BernoulliDistribution.hpp"
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#ifndef PTM_BERNOULLIDISTRIBUTION_HPP_
2+
#define PTM_BERNOULLIDISTRIBUTION_HPP_
3+
4+
#include <random>
5+
6+
#include "Distribution.hpp"
7+
8+
namespace ptm {
9+
10+
// Бернулли Bernoulli(p)
11+
class BernoulliDistribution : public Distribution {
12+
public:
13+
explicit BernoulliDistribution(double p);
14+
15+
[[nodiscard]] double Pdf(double x) const override;
16+
[[nodiscard]] double Cdf(double x) const override;
17+
double Sample(std::mt19937& rng) const override;
18+
19+
[[nodiscard]] double TheoreticalMean() const override;
20+
[[nodiscard]] double TheoreticalVariance() const override;
21+
22+
private:
23+
double p_;
24+
};
25+
26+
} // namespace ptm
27+
28+
#endif // PTM_BERNOULLIDISTRIBUTION_HPP_
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#include "BinomialDistribution.hpp"
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#ifndef PTM_BINOMIALDISTRIBUTION_HPP_
2+
#define PTM_BINOMIALDISTRIBUTION_HPP_
3+
4+
#include <random>
5+
6+
#include "Distribution.hpp"
7+
8+
namespace ptm {
9+
10+
// Биномиальное Binomial(n, p)
11+
class BinomialDistribution : public Distribution {
12+
public:
13+
BinomialDistribution(unsigned int n, double p);
14+
15+
[[nodiscard]] double Pdf(double x) const override;
16+
[[nodiscard]] double Cdf(double x) const override;
17+
double Sample(std::mt19937& rng) const override;
18+
19+
[[nodiscard]] double TheoreticalMean() const override;
20+
[[nodiscard]] double TheoreticalVariance() const override;
21+
22+
private:
23+
unsigned int n_;
24+
double p_;
25+
};
26+
27+
} // namespace ptm
28+
29+
#endif // PTM_BINOMIALDISTRIBUTION_HPP_

lib/distributions/CMakeLists.txt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
add_library(distributions STATIC
2+
NormalDistribution.cpp
3+
UniformDistribution.cpp
4+
ExponentialDistribution.cpp
5+
CauchyDistribution.cpp
6+
LaplaceDistribution.cpp
7+
BernoulliDistribution.cpp
8+
BinomialDistribution.cpp
9+
GeometricDistribution.cpp
10+
PoissonDistribution.cpp
11+
DistributionExperiment.cpp
12+
)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#include "CauchyDistribution.hpp"

0 commit comments

Comments
 (0)