Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
feab8b7
Updating tests path
Pablo1990 Feb 2, 2026
812a571
Tests to ready to be tested
Pablo1990 Feb 2, 2026
8e46ed8
Initial plan
Copilot Feb 2, 2026
4508996
Add clamping to triangle energy calculations to prevent numerical ins…
Copilot Feb 2, 2026
c56fdc6
Updating uv
Pablo1990 Feb 2, 2026
9f26af9
tests are not running
Pablo1990 Feb 2, 2026
3d17363
decreasing tolerance
Pablo1990 Feb 2, 2026
2922fc9
Merge branch '5-fix-issue-with-geometry-breaking-from-time-to-time' i…
Pablo1990 Feb 2, 2026
794d76f
Allow explicit method steps to proceed when gradient is stable
Copilot Feb 2, 2026
714136a
Add adaptive step scaling to explicit Euler method
Copilot Feb 2, 2026
0ba73e7
Address code review: add constants, bounds, and init gr_before_step
Copilot Feb 2, 2026
0ff503a
Implement strict gradient non-increase policy for explicit method
Copilot Feb 2, 2026
e80ef7f
Tune safety factor to 0.9 and allow 1% gradient increase
Copilot Feb 2, 2026
32c6098
Explore alternatives: always-on safety factor approach
Copilot Feb 2, 2026
ff6e941
Explored multiple alternatives for gradient explosion prevention
Copilot Feb 2, 2026
d804b1c
Merge branch 'main' into copilot/sub-pr-6
Pablo1990 Feb 4, 2026
3322e93
Investigation complete: Identified energy terms and geometry issues
Copilot Feb 4, 2026
cf086a6
Add comprehensive investigation report with findings and recommendations
Copilot Feb 4, 2026
09bf2de
Final summary: Energy terms healthy, geometry valid, issue is integra…
Copilot Feb 4, 2026
01a794c
Add final conclusion: Energy and geometry are healthy, issue is numer…
Copilot Feb 4, 2026
49f4c94
Implement RK2 (midpoint method) time integrator for improved stability
Copilot Feb 4, 2026
fd6d551
Document RK2 implementation, performance characteristics, and recomme…
Copilot Feb 4, 2026
4d6ff0f
Merge remote-tracking branch 'origin/copilot/sub-pr-6' into copilot/s…
Pablo1990 Feb 5, 2026
ee48cb2
Tests to check if vertices are exploding are back
Pablo1990 Feb 5, 2026
3524d57
bugfix
Pablo1990 Feb 5, 2026
10116cb
minor
Pablo1990 Feb 5, 2026
6fee3e1
bugfix
Pablo1990 Feb 5, 2026
08daec9
Analyzing test_vertices_shouldnt_be_going_wild_3 failure
Copilot Feb 5, 2026
cfb35d2
Tune scale_factor for small gradients to 0.95 for better performance
Copilot Feb 5, 2026
f94dc5f
Clean up diagnostic and investigation files
Copilot Feb 5, 2026
8230ce1
Add detailed comments explaining safety factor choices
Copilot Feb 5, 2026
e4a50c2
Rename file for tests
Pablo1990 Feb 5, 2026
b41fc85
Creating tests that the geometry should pass and fail if it is correct
Pablo1990 Feb 5, 2026
4919391
Adding some tests that need to pass
Pablo1990 Feb 5, 2026
4c88287
corrected
Pablo1990 Feb 5, 2026
88e685c
Implement geometry_is_correct() function with vertex spread validation
Copilot Feb 5, 2026
2286aac
Implement expert-level geometry validation with structural checks
Copilot Feb 5, 2026
74ec4c8
Implement FIRE algorithm (Bitzek et al., 2006) for vertex model optim…
Copilot Feb 6, 2026
728b619
Add comprehensive FIRE algorithm documentation and usage guide
Copilot Feb 6, 2026
9d12369
Configure test_weird_bug_should_not_happen to use FIRE algorithm
Copilot Feb 6, 2026
564a362
Initialize FIRE parameters in test for backwards compatibility
Copilot Feb 6, 2026
be6e3eb
Tune FIRE parameters for edge case geometry in test
Copilot Feb 6, 2026
83a4cda
Add comprehensive FIRE test configuration documentation
Copilot Feb 6, 2026
8cf5aba
Working for FIRE loop
Pablo1990 Feb 6, 2026
ab186ce
Working fire
Pablo1990 Feb 6, 2026
b22ab37
updated uv
Pablo1990 Feb 9, 2026
9976294
bugfix
Pablo1990 Feb 9, 2026
dc13537
Merge remote-tracking branch 'origin/copilot/sub-pr-6' into copilot/s…
Pablo1990 Feb 9, 2026
4efb065
fire settings to set
Pablo1990 Feb 9, 2026
98134c4
fixed duplicated lines in logger
Pablo1990 Feb 9, 2026
b43e5ca
cleaning
Pablo1990 Feb 10, 2026
9d24d72
updating integrators
Pablo1990 Feb 10, 2026
4e926fb
Refactored for different pipeline fire vs euler
Pablo1990 Feb 10, 2026
ded8e7f
Improved
Pablo1990 Feb 10, 2026
73ed6f9
Corrected version simplified
Pablo1990 Feb 10, 2026
e0c5537
minor
Pablo1990 Feb 10, 2026
7695d47
constrained vertices need refactor
Pablo1990 Feb 10, 2026
bd14561
missing integrator
Pablo1990 Feb 12, 2026
13ac467
improved fire algorithm
Pablo1990 Feb 12, 2026
8601dc2
bugfix
Pablo1990 Mar 17, 2026
198d712
euler default
Pablo1990 Mar 17, 2026
1f21c5f
Merge pull request #7 from Pablo1990/copilot/sub-pr-6
Pablo1990 Mar 17, 2026
58a496f
Merge branch 'main' into 5-fix-issue-with-geometry-breaking-from-time…
Pablo1990 Mar 18, 2026
3699167
removing unnecessary files
Pablo1990 Mar 18, 2026
c07173b
Merge remote-tracking branch 'origin/5-fix-issue-with-geometry-breaki…
Pablo1990 Mar 18, 2026
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
28 changes: 27 additions & 1 deletion Tests/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,29 @@
import logging
import os
import warnings

TEST_DIRECTORY = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEST_DIRECTORY = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

PROJECT_DIRECTORY = os.getenv('PROJECT_DIR', os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

# get the logger instance
logger = logging.getLogger("pyVertexModel")

formatter = logging.Formatter(
"%(levelname)s [%(asctime)s] pyVertexModel: %(message)s",
datefmt="%Y/%m/%d %I:%M:%S %p",
)
console_handler = logging.StreamHandler()
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)

logger.setLevel(logging.DEBUG)
logger.propagate = False


# Function to handle warnings
def warning_handler(message, category, filename, lineno, file=None, line=None):
logger.warning(f'{filename}:{lineno}: {category.__name__}: {message}')

# Set the warnings' showwarning function to the handler
warnings.showwarning = warning_handler
54 changes: 54 additions & 0 deletions Tests/test_geo.py
Original file line number Diff line number Diff line change
Expand Up @@ -376,3 +376,57 @@ def test_get_node_neighbours_per_domain(self):
# Check if node neighbours are the same
assert_array1D(node_neighbours_test, np.concatenate(node_neighbours_expected))

def test_geometry_is_correct(self):
"""
Test the function geometry_is_correct
:return:
"""
# Load data
vModel_test = load_data('geometry_correct_1.pkl')

# Check if geometry is correct
self.assertTrue(vModel_test.geo.geometry_is_correct())

# Load data
vModel_test = load_data('geometry_correct_2.pkl')

# Check if geometry is correct
self.assertTrue(vModel_test.geo.geometry_is_correct())

# Load data
vModel_test = load_data('geometry_correct_3.pkl')

# Check if geometry is correct
self.assertTrue(vModel_test.geo.geometry_is_correct())

def test_geometry_is_incorrect(self):
"""
Test the function geometry_is_correct
:return:
"""
# Load data
vModel_test = load_data('vertices_going_wild_1.pkl')

# Check if geometry is correct
self.assertFalse(vModel_test.geo.geometry_is_correct())

# Another test with a different geometry
vModel_test = load_data('vertices_going_wild_2.pkl')

# Check if geometry is correct
self.assertFalse(vModel_test.geo.geometry_is_correct())

# Another test with a different geometry
vModel_test = load_data('vertices_going_wild_3.pkl')

# Check if geometry is correct
self.assertFalse(vModel_test.geo.geometry_is_correct())

# Another test with a different geometry
vModel_test = load_data('vertices_going_wild_4.pkl')

# Check if geometry is correct
self.assertFalse(vModel_test.geo.geometry_is_correct())



6 changes: 3 additions & 3 deletions Tests/test_kg.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from pyVertexModel.Kg.kgTriEnergyBarrier import KgTriEnergyBarrier
from pyVertexModel.Kg.kgViscosity import KgViscosity
from pyVertexModel.Kg.kgVolume import KgVolume
from pyVertexModel.algorithm.newtonRaphson import KgGlobal
from pyVertexModel.algorithm.integrators import KgGlobal
from pyVertexModel.geometry.geo import Geo


Expand All @@ -18,7 +18,7 @@ def test_kg_global_filename(filename):
geo_n_test = Geo(mat_info['Geo_n'])
geo_0_test = Geo(mat_info['Geo_0'])
# Compute the global K, and g
g, K, E, _ = KgGlobal(geo_0_test, geo_n_test, geo_test, set_test)
g, K, E, _ = KgGlobal(geo_test, set_test, geo_n_test)
# Get the expected results from the mat file
g_expected = mat_info['g'][:, 0]
k_expected = mat_info['K']
Expand Down Expand Up @@ -140,7 +140,7 @@ def test_KgGlobal(self):
geo_n_test = Geo(mat_info['Geo_n'])
geo_0_test = Geo(mat_info['Geo_0'])

g, K, E, _ = KgGlobal(geo_0_test, geo_n_test, geo_test, set_test)
g, K, E, _ = KgGlobal(geo_test, set_test, geo_n_test)

g_expected = (mat_expected['gs_full'] + mat_expected['gv_full'] + mat_expected['gf_full'] +
mat_expected['gBA_full'] + mat_expected['gBAR_full'] + mat_expected['gC_full'] +
Expand Down
10 changes: 5 additions & 5 deletions Tests/test_newtonRaphson.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from Tests.test_geo import check_if_cells_are_the_same
from Tests.tests import load_data, Tests, assert_array1D, assert_matrix
from pyVertexModel.algorithm.newtonRaphson import line_search, newton_raphson, newton_raphson_iteration, ml_divide, \
from pyVertexModel.algorithm.integrators import line_search, newton_raphson, newton_raphson_iteration, ml_divide, \
solve_remodeling_step
from pyVertexModel.geometry.degreesOfFreedom import DegreesOfFreedom
from pyVertexModel.geometry.geo import Geo
Expand Down Expand Up @@ -106,7 +106,7 @@ def test_newton_raphson_wingdisc(self):
t_test = mat_info['t'][0][0]

Set.iter = 1000000
geo_test, g_test, k_test, energy_test, set_test, gr_test, dyr_test, dy_test = (
geo_test, g_test, k_test, energy_test, set_test, gr_test, dyr_test, dy_test, _ = (
newton_raphson(geo_0_test,
geo_n_test,
geo_test,
Expand Down Expand Up @@ -143,7 +143,7 @@ def test_newton_raphson(self):
t_test = mat_info['t'][0][0]

Set.iter = 1000000
geo_test, g_test, k_test, energy_test, set_test, gr_test, dyr_test, dy_test = (
geo_test, g_test, k_test, energy_test, set_test, gr_test, dyr_test, dy_test, _ = (
newton_raphson(geo_0_test,
geo_n_test,
geo_test,
Expand Down Expand Up @@ -177,7 +177,7 @@ def test_line_search(self):
g_test = mat_info['g'][:, 0]
dy_test = mat_info['dy'][:, 0]
set_test = Set(mat_info['Set'])
alpha = line_search(geo_0_test, geo_n_test, geo_test, dofs_test.Free, set_test, g_test, dy_test)
alpha = line_search(geo_test, dofs_test.Free, set_test, g_test, dy_test, geo_n_test)

np.testing.assert_almost_equal(alpha, 1)

Expand All @@ -202,7 +202,7 @@ def test_line_search_cyst(self):
g_test = mat_info['g'][:, 0]
dy_test = mat_info['dy']
set_test = Set(mat_info['Set'])
alpha = line_search(geo_0_test, geo_n_test, geo_test, dofs_test.Free, set_test, g_test, dy_test)
alpha = line_search(geo_test, dofs_test.Free, set_test, g_test, dy_test, geo_n_test)

np.testing.assert_almost_equal(alpha, mat_info['alpha'][0][0])

Expand Down
Loading