Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Engines Modularized #160

Merged
merged 46 commits into from
Apr 18, 2024
Merged
Show file tree
Hide file tree
Changes from 37 commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
be29dd3
add : `engines` module added.
sadrasabouri Mar 12, 2024
5f8d021
update : code updated accordingly.
sadrasabouri Mar 12, 2024
4568221
update : logger and gen_using made dynamic.
sadrasabouri Mar 12, 2024
cf6b502
fix : minor error in logger fixed.
sadrasabouri Mar 13, 2024
11c1eff
fix : `file_name` parameter fixed.
sadrasabouri Mar 13, 2024
74c4ae6
fix : methods renamed in tests.
sadrasabouri Mar 13, 2024
9d062e1
fix : minor tests fixed.
sadrasabouri Mar 16, 2024
72e1261
remove : `logger` function removed.
sadrasabouri Mar 16, 2024
272c4e0
update : `_is_weighted`, `_get_precision`, `_threshold_calc` function…
sadrasabouri Mar 16, 2024
d2c3064
fix : `PYRGG_TEST_MODE` moved to `os.environ`.
sadrasabouri Mar 16, 2024
c76df98
revert : `is_weighted`, `get_percision`, `threshold_calc` reverted ba…
sadrasabouri Mar 16, 2024
7457c97
fix : tests fixed accordingly.
sadrasabouri Mar 16, 2024
9c0d979
edit : try/except moved into engine modules.
sadrasabouri Mar 16, 2024
8370d77
move : main module `test` moved to the `test/engine` module.
sadrasabouri Mar 16, 2024
aadda69
move : `function_test.py` moved.
sadrasabouri Mar 16, 2024
b7c1b13
fix : `function_test.py` fixed.
sadrasabouri Mar 17, 2024
52db328
move : `dimacs_maker` generation function moved to engine tests.
sadrasabouri Mar 17, 2024
ee1a4fa
move : `json_maker` gen_using methods tests moved to engine tests.
sadrasabouri Mar 17, 2024
efcbb3b
move : `json_maker` and `csv_maker` tests moved.
sadrasabouri Mar 17, 2024
9aaa9b0
move : `gdf_maker` and `gl_maker` moved to engine tests.
sadrasabouri Mar 17, 2024
30bc6dc
move : `mtx_maker` and `tsv_maker` moved to engine tests.
sadrasabouri Mar 17, 2024
ae30cee
update : remove files added.
sadrasabouri Mar 17, 2024
654c0a5
move : second tests for pyrgg engine added.
sadrasabouri Mar 17, 2024
5bbae4f
move : test3 files added.
sadrasabouri Mar 17, 2024
c54cac7
move : `wel_maker` moved to engine tests.
sadrasabouri Mar 17, 2024
ef9bd94
move : `lp_maker` moved to engine tests.
sadrasabouri Mar 17, 2024
451051c
move : `tgf_maker` moved to engine tests.
sadrasabouri Mar 17, 2024
d28e8fe
move : `dl_maker` moved to engine tests.
sadrasabouri Mar 17, 2024
8352e96
move : `dot_maker` moved to engine tests.
sadrasabouri Mar 17, 2024
c37f36b
add : sections added to test files.
sadrasabouri Mar 17, 2024
ee908d9
move : a dimacs test moved to pyrgg engine tests.
sadrasabouri Mar 17, 2024
448bc3b
move : `gml_maker` moved to engine tests.
sadrasabouri Mar 17, 2024
9a3b311
add : more tests added to csv test.
sadrasabouri Mar 17, 2024
4883d62
move : `gexf_maker` moved to engine tests.
sadrasabouri Mar 17, 2024
ca12865
update : `pyrgg_profile.py` updated.
sadrasabouri Mar 17, 2024
861d569
log : changes logged.
sadrasabouri Mar 17, 2024
8abe115
fix : `file.close()` fixed.
sadrasabouri Mar 17, 2024
9025d20
fix : engines module `__init__.py` overridden issue fixed.
sadrasabouri Mar 27, 2024
f3e3240
add : `erg_engine` added to `pyrgg_profile.py`.
sadrasabouri Mar 27, 2024
79b9b32
add : profiles added to different files.
sadrasabouri Mar 27, 2024
cdb8db0
fix : Erdős-Rényi-Gilbert engine edge_gen function modified
sepandhaghighi Apr 13, 2024
88436c3
fix : tests updated
sepandhaghighi Apr 13, 2024
5534d44
fix : changelog typo fixed.
sadrasabouri Apr 14, 2024
7c678e9
remove : extra line removed.
sadrasabouri Apr 14, 2024
7009f0d
add : punctuation added to `gen_using` function docstring.
sadrasabouri Apr 14, 2024
4728ff1
fix : `ENINGE` -> `ENGINE`.
sadrasabouri Apr 17, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,17 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.

## [Unreleased]
### Added
- `pyrgg.engines` package
- `pyrgg.engines.pyrgg` module
- `pyrgg.engines.erdos_reyni_gilbert` module
- `Erdős-Rényi-Gilbert` generation model
- `pyrgg_gen_using` function
- Generation engine menu
- `handle_string` function
- `handle_pos_int` function
- `handle_output_format` function
- `handle_engine` function
### Changed
- Tests separated in files for engines
- `README.md` modified
- `Python 3.12` added to `test.yml`
- Menu options bug fixed
Expand Down
28 changes: 16 additions & 12 deletions otherfile/pyrgg_profile.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,24 @@
"""Profile file."""
from pyrgg import *
import pyrgg.params
import pyrgg.engines.pyrgg as pyrgg_engine
sepandhaghighi marked this conversation as resolved.
Show resolved Hide resolved
import random

pyrgg.params.PYRGG_TEST_MODE = True
os.environ["PYRGG_TEST_MODE"] = "1"
random.seed(400)

pyrgg_gen_using(
pyrgg_engine.gen_using(
dimacs_maker,
file_name='profile',
min_weight=1,
max_weight=5000,
vertices_number=10000,
min_edge=5,
max_edge=600,
sign=0,
direct=1,
self_loop=1,
multigraph=1)
'profile',
{
'min_weight':1,
'max_weight':5000,
'vertices':10000,
'min_edge':5,
'max_edge':600,
'sign':0,
'direct':1,
'self_loop':1,
'multigraph':1,
}
)
1 change: 1 addition & 0 deletions pyrgg/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@
from .functions import *
from .graph_gen import *
from .params import *
from .engines import *
__version__ = PYRGG_VERSION
55 changes: 15 additions & 40 deletions pyrgg/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
import argparse
import doctest
from art import tprint
import pyrgg.engines.pyrgg as pyrgg_engine
import pyrgg.engines.erdos_reyni_gilbert as erg_engine

GENERATOR_MENU = {
1: dimacs_maker,
Expand All @@ -28,9 +30,9 @@
16: dot_maker,
}

ENGINE_GENERATOR = {
1: pyrgg_gen_using,
2: erdos_renyi_gilbert_gen_using,
ENGINE_MAPPER = {
1: pyrgg_engine,
2: erg_engine,
}


Expand All @@ -45,31 +47,12 @@ def gen_graph(input_dict, file_name):
:return: None
"""
first_time = time.perf_counter()
min_weight = input_dict["min_weight"]
max_weight = input_dict["max_weight"]
vertices_number = input_dict["vertices"]
min_edge = input_dict["min_edge"]
max_edge = input_dict["max_edge"]
sign = input_dict["sign"]
direct = input_dict["direct"]
self_loop = input_dict["self_loop"]
multigraph = input_dict["multigraph"]
output_format = input_dict["output_format"]
probability = input_dict["probability"]
engine = input_dict["engine"]
edge_number = ENGINE_GENERATOR[engine](
input_dict["edge_number"] = ENGINE_MAPPER[engine].gen_using(
GENERATOR_MENU[output_format],
file_name=file_name,
min_weight=min_weight,
max_weight=max_weight,
vertices_number=vertices_number,
min_edge=min_edge,
max_edge=max_edge,
sign=sign,
direct=direct,
self_loop=self_loop,
multigraph=multigraph,
probability=probability)
file_name,
input_dict)
if output_format == 4:
json_to_yaml(file_name)
if output_format == 7:
Expand All @@ -78,23 +61,15 @@ def gen_graph(input_dict, file_name):
second_time = time.perf_counter()
elapsed_time = second_time - first_time
elapsed_time_format = time_convert(elapsed_time)
print("Total Number of Edges : " + str(edge_number))
print("Total Number of Edges : " + str(input_dict["edge_number"]))
print("Graph Generated in " + elapsed_time_format)
print("Where --> " + SOURCE_DIR)
logger(
file_name + SUFFIX_MENU[output_format],
vertices_number,
edge_number,
max_edge,
min_edge,
direct,
sign,
multigraph,
self_loop,
max_weight,
min_weight,
engine,
elapsed_time_format)
with open("logfile.log", "a") as file:
ENGINE_MAPPER[engine].logger(file,
file_name + SUFFIX_MENU[output_format],
elapsed_time_format,
input_dict)



def run(input_dict=None):
Expand Down
4 changes: 4 additions & 0 deletions pyrgg/engines/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
"""Engines module."""
from .pyrgg import *
from .erdos_reyni_gilbert import *
sepandhaghighi marked this conversation as resolved.
Show resolved Hide resolved
103 changes: 103 additions & 0 deletions pyrgg/engines/erdos_reyni_gilbert.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
# -*- coding: utf-8 -*-
"""Erdős-Rényi-Gilbert Engine module."""
import datetime
from random import random
from pyrgg.params import ENGINE_MENU, PYRGG_LOGGER_ERROR_MESSAGE

LOGGER_TEMPLATE = """{0}
Filename : {1}
Probability : {2}
Vertices : {3}
Total Edges : {4}
Engine : {5} ({6})
Elapsed Time : {7}
-------------------------------
"""


def edge_gen(n, p):
"""
Generate each vertex connection number.

:param n: number of vertices
:type n: int
:param p: probability
:type p: float
:return: list of dicts
"""
edge_dic = {}
edge_number = 0
for i in range(1, n + 1):
edge_dic[i] = []
for j in range(i + 1, n + 1):
if random() < p:
edge_dic[i].append(j)
edge_number += 1
return [edge_dic, edge_number]


def gen_using(
gen_function,
file_name,
input_dict):
"""
Generate graph using given function based on Erdos Renyi Gilbert model.

Refer to (https://en.wikipedia.org/wiki/Erd%C5%91s%E2%80%93R%C3%A9nyi_model)

:param gen_function: generation function
:type gen_function: function object
:param file_name: file name
:type file_name: str
:param input_dict: input data
:type input_dict: dict
:return: number of edges as int
"""
edge_dic, edge_number = edge_gen(
input_dict['vertices'],
input_dict['probability'])
weight_dic = {key: [1] * edge_number for key in range(1, input_dict['vertices'] + 1)}
gen_function(
edge_dic,
weight_dic,
{
"file_name": file_name,
"vertices_number": input_dict['vertices'],
"max_weight": 1,
"min_weight": 1,
"min_edge": edge_number,
"max_edge": edge_number,
"sign": False,
"direct": False,
"self_loop": False,
"multigraph": False,
"edge_number": edge_number,
})
return edge_number


def logger(file, file_name, elapsed_time, input_dict):
"""
Save generated graph logs for Erdős-Rényi-Gilbert engine.

:param file: file to write log into
:type file: file object
:param file_name: file name
:type file_name: str
:param elapsed_time: elapsed time
:type elapsed_time: str
:param input_dict: input data
:type input_dict: dict
:return: None
"""
try:
file.write(LOGGER_TEMPLATE.format(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
file_name,
str(input_dict["probability"]),
str(input_dict["vertices"]),
str(input_dict["edge_number"]),
input_dict["engine"],
ENGINE_MENU[input_dict["engine"]],
elapsed_time))
except Exception:
print(PYRGG_LOGGER_ERROR_MESSAGE)
Loading
Loading