From 5f03e8cf8f9a2d22a1157eec311b71286fab4e1a Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 28 Oct 2020 09:31:55 +0100 Subject: [PATCH 01/15] 0-based material indices --- python/damask/_geom.py | 6 +++--- python/tests/test_Geom.py | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/python/damask/_geom.py b/python/damask/_geom.py index f7ac6c437..c9122ca09 100644 --- a/python/damask/_geom.py +++ b/python/damask/_geom.py @@ -417,7 +417,7 @@ class Geom: Number of periods per unit cell. Defaults to 1. materials : (int, int), optional Material IDs. Defaults to (1,2). - + Notes ----- The following triply-periodic minimal surfaces are implemented: @@ -687,10 +687,10 @@ class Geom: def renumber(self): - """Renumber sorted material indices to 1,...,N.""" + """Renumber sorted material indices to 0,...,N-1.""" renumbered = np.empty(self.grid,dtype=self.material.dtype) for i, oldID in enumerate(np.unique(self.material)): - renumbered = np.where(self.material == oldID, i+1, renumbered) + renumbered = np.where(self.material == oldID, i, renumbered) return Geom(material = renumbered, size = self.size, diff --git a/python/tests/test_Geom.py b/python/tests/test_Geom.py index 368d8ec8f..aa6cf4baf 100644 --- a/python/tests/test_Geom.py +++ b/python/tests/test_Geom.py @@ -176,6 +176,7 @@ class TestGeom: material = default.material.copy() for m in np.unique(material): material[material==m] = material.max() + np.random.randint(1,30) + default.material -= 1 modified = Geom(material, default.size, default.origin) From b38a498197ad8f20cb099ff1d39bd7538f7ca2ea Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 28 Oct 2020 09:43:20 +0100 Subject: [PATCH 02/15] fast --- python/damask/_geom.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/python/damask/_geom.py b/python/damask/_geom.py index c9122ca09..c084b8041 100644 --- a/python/damask/_geom.py +++ b/python/damask/_geom.py @@ -688,11 +688,9 @@ class Geom: def renumber(self): """Renumber sorted material indices to 0,...,N-1.""" - renumbered = np.empty(self.grid,dtype=self.material.dtype) - for i, oldID in enumerate(np.unique(self.material)): - renumbered = np.where(self.material == oldID, i, renumbered) + _,renumbered = np.unique(self.material,return_inverse=True) - return Geom(material = renumbered, + return Geom(material = renumbered.reshape(self.grid), size = self.size, origin = self.origin, comments = self.comments+[util.execution_stamp('Geom','renumber')], From d72343c865ff7d161c73c3f1f6ad3b31b844c8a3 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 28 Oct 2020 11:41:34 +0100 Subject: [PATCH 03/15] keep order of unique values found in table --- PRIVATE | 2 +- python/damask/_geom.py | 21 +++++++++++++-------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/PRIVATE b/PRIVATE index 1e8c66897..3112a4dbf 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit 1e8c66897820468ab46958d995005e2b69204d0e +Subproject commit 3112a4dbfa1e926c07b7f9443161239b8a7e85ca diff --git a/python/damask/_geom.py b/python/damask/_geom.py index c084b8041..d5abe29a7 100644 --- a/python/damask/_geom.py +++ b/python/damask/_geom.py @@ -4,6 +4,7 @@ from functools import partial from os import path import numpy as np +import pandas as pd import h5py from scipy import ndimage,spatial @@ -260,15 +261,19 @@ class Geom: Each unique combintation of values results in a material. """ - t = table.sort_by([f'{i}_{coordinates}' for i in range(3,0,-1)]) - - grid,size,origin = grid_filters.cell_coord0_gridSizeOrigin(t.get(coordinates)) + coords = table.sort_by([f'{i}_{coordinates}' for i in range(3,0,-1)]).get(coordinates) + grid,size,origin = grid_filters.cell_coord0_gridSizeOrigin(coords) labels_ = [labels] if isinstance(labels,str) else labels - _,unique_inverse = np.unique(np.hstack([t.get(l) for l in labels_]),return_inverse=True,axis=0) - ma = unique_inverse.reshape(grid,order='F') + 1 + unique,unique_inverse = np.unique(np.hstack([table.get(l) for l in labels_]),return_inverse=True,axis=0) + if len(unique) == grid.prod(): + ma = np.arange(grid.prod()) + else: + ma = np.empty(grid.prod(),'i') + for to_ma,from_ma in enumerate(pd.unique(unique_inverse)): + ma[unique_inverse==from_ma] = to_ma - return Geom(ma,size,origin,util.execution_stamp('Geom','from_table')) + return Geom(ma.reshape(grid,order='F'),size,origin,util.execution_stamp('Geom','from_table')) @staticmethod @@ -782,8 +787,8 @@ class Geom: """ substituted = self.material.copy() - for from_ms,to_ms in zip(from_material,to_material): - substituted[self.material==from_ms] = to_ms + for from_ma,to_ma in zip(from_material,to_material): + substituted[self.material==from_ma] = to_ma return Geom(material = substituted, size = self.size, From 98e0ef3881ca2c13794c741618500ad9f0fd64cd Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 28 Oct 2020 13:38:20 +0100 Subject: [PATCH 04/15] no loops taken from https://stackoverflow.com/questions/3403973 --- python/damask/_geom.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/python/damask/_geom.py b/python/damask/_geom.py index d5abe29a7..e0e6fcdc6 100644 --- a/python/damask/_geom.py +++ b/python/damask/_geom.py @@ -269,9 +269,10 @@ class Geom: if len(unique) == grid.prod(): ma = np.arange(grid.prod()) else: - ma = np.empty(grid.prod(),'i') - for to_ma,from_ma in enumerate(pd.unique(unique_inverse)): - ma[unique_inverse==from_ma] = to_ma + from_ma = pd.unique(unique_inverse) + sort_idx = np.argsort(from_ma) + idx = np.searchsorted(from_ma,unique_inverse,sorter = sort_idx) + ma = np.arange(from_ma.size)[sort_idx][idx] return Geom(ma.reshape(grid,order='F'),size,origin,util.execution_stamp('Geom','from_table')) From 855bf124d397450e988c5e6a1704a5eec5290727 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 28 Oct 2020 14:39:41 +0100 Subject: [PATCH 05/15] faster https://stackoverflow.com/questions/16992713 --- python/damask/_geom.py | 11 +++++++---- python/tests/test_Geom.py | 7 +++++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/python/damask/_geom.py b/python/damask/_geom.py index e0e6fcdc6..7dfca4cd1 100644 --- a/python/damask/_geom.py +++ b/python/damask/_geom.py @@ -787,11 +787,14 @@ class Geom: New material indices. """ - substituted = self.material.copy() - for from_ma,to_ma in zip(from_material,to_material): - substituted[self.material==from_ma] = to_ma + mapper = dict(zip(from_material,to_material)) + + def mp(entry): + return mapper[entry] if entry in mapper else entry + + mp = np.vectorize(mp) - return Geom(material = substituted, + return Geom(material = mp(self.material).reshape(self.grid), size = self.size, origin = self.origin, comments = self.comments+[util.execution_stamp('Geom','substitute')], diff --git a/python/tests/test_Geom.py b/python/tests/test_Geom.py index aa6cf4baf..73d157cfd 100644 --- a/python/tests/test_Geom.py +++ b/python/tests/test_Geom.py @@ -195,6 +195,13 @@ class TestGeom: modified.substitute(np.arange(default.material.max())+1+offset, np.arange(default.material.max())+1)) + def test_substitute_invariant(self,default): + f = np.unique(default.material.flatten())[:np.random.randint(1,default.material.max())] + t = np.random.permutation(f) + modified = default.substitute(f,t) + assert np.array_equiv(t,f) or (not geom_equal(modified,default)) + assert geom_equal(default, modified.substitute(t,f)) + @pytest.mark.parametrize('axis_angle',[np.array([1,0,0,86.7]), np.array([0,1,0,90.4]), np.array([0,0,1,90]), np.array([1,0,0,175]),np.array([0,-1,0,178]),np.array([0,0,1,180])]) From 4ff99a7af4c75cd6c4e7adafb7951ef8134e8a84 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 28 Oct 2020 21:51:20 +0100 Subject: [PATCH 06/15] more logical layout --- python/damask/_geom.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/python/damask/_geom.py b/python/damask/_geom.py index 7dfca4cd1..c76cc8c5a 100644 --- a/python/damask/_geom.py +++ b/python/damask/_geom.py @@ -787,14 +787,13 @@ class Geom: New material indices. """ - mapper = dict(zip(from_material,to_material)) - - def mp(entry): + def mp(entry,mapper): return mapper[entry] if entry in mapper else entry mp = np.vectorize(mp) + mapper = dict(zip(from_material,to_material)) - return Geom(material = mp(self.material).reshape(self.grid), + return Geom(material = mp(self.material,mapper).reshape(self.grid), size = self.size, origin = self.origin, comments = self.comments+[util.execution_stamp('Geom','substitute')], From 1b2cd6caf6277ba0b169e799bffadce863b7e6d4 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Wed, 28 Oct 2020 21:52:51 +0100 Subject: [PATCH 07/15] documentation was misleading --- python/damask/_configmaterial.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/python/damask/_configmaterial.py b/python/damask/_configmaterial.py index a7ecec108..47b5fa37c 100644 --- a/python/damask/_configmaterial.py +++ b/python/damask/_configmaterial.py @@ -229,11 +229,9 @@ class ConfigMaterial(Config): Parameters ---------- constituents : dict - Entries for 'constituents'. The key is the name and the value specifies - the label of the data column in the table + Entries for 'constituents' as key-value pair. **kwargs - Keyword arguments where the key is the name and the value specifies - the label of the data column in the table + Key-value pairs. Examples -------- @@ -264,7 +262,7 @@ class ConfigMaterial(Config): for k,v in kwargs.items(): if hasattr(v,'__len__') and not isinstance(v,str): if len(v) != len(c): - raise ValueError('len mismatch 1') + raise ValueError('Cannot add entries of different length') for i,vv in enumerate(v): c[i][k] = [w.item() for w in vv] if isinstance(vv,np.ndarray) else vv.item() else: @@ -288,7 +286,7 @@ class ConfigMaterial(Config): for k,v in kwargs.items(): if hasattr(v,'__len__') and not isinstance(v,str): if len(v) != N_material: - raise ValueError('len mismatch 2') + raise ValueError('Cannot add entries of different length') for i,vv in enumerate(np.array(v)): m[i][0][k] = [w.item() for w in vv] if isinstance(vv,np.ndarray) else vv.item() else: From 3be0c462a801a628dc556303bc04371e496b4258 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 29 Oct 2020 07:17:41 +0100 Subject: [PATCH 08/15] explicit is better then implicit: user should sort Table according to coordinates to create geometry. This allows to have consistent behavior for from_table in Geom and ConfigMaterial. We always ensure to keep the order --- python/damask/_configmaterial.py | 19 +++++-------------- python/damask/_geom.py | 4 ++-- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/python/damask/_configmaterial.py b/python/damask/_configmaterial.py index 47b5fa37c..c625e6251 100644 --- a/python/damask/_configmaterial.py +++ b/python/damask/_configmaterial.py @@ -26,7 +26,7 @@ class ConfigMaterial(Config): @staticmethod - def from_table(table,coordinates=None,constituents={},**kwargs): + def from_table(table,constituents={},**kwargs): """ Load from an ASCII table. @@ -34,10 +34,6 @@ class ConfigMaterial(Config): ---------- table : damask.Table Table that contains material information. - coordinates : str, optional - Label of spatial coordiates. Used for sorting and performing a - sanity check. Default to None, in which case no sorting or checking is - peformed. constituents : dict, optional Entries for 'constituents'. The key is the name and the value specifies the label of the data column in the table @@ -54,7 +50,7 @@ class ConfigMaterial(Config): pos pos pos qu qu qu qu phase homog 0 0 0 0 0.19 0.8 0.24 -0.51 Aluminum SX 1 1 0 0 0.8 0.19 0.24 -0.51 Steel SX - >>> cm.from_table(t,'pos',{'O':'qu','phase':'phase'},homogenization='homog') + >>> cm.from_table(t,{'O':'qu','phase':'phase'},homogenization='homog') material: - constituents: - O: [0.19, 0.8, 0.24, -0.51] @@ -68,17 +64,12 @@ class ConfigMaterial(Config): homogenization: SX """ - if coordinates is not None: - t = table.sort_by([f'{i}_{coordinates}' for i in range(3,0,-1)]) - grid_filters.coord0_check(t.get(coordinates)) - else: - t = table - - constituents_ = {k:t.get(v) for k,v in constituents.items()} - kwargs_ = {k:t.get(v) for k,v in kwargs.items()} + constituents_ = {k:table.get(v) for k,v in constituents.items()} + kwargs_ = {k:table.get(v) for k,v in kwargs.items()} _,idx = np.unique(np.hstack(list({**constituents_,**kwargs_}.values())),return_index=True,axis=0) + idx = np.sort(idx) constituents_ = {k:v[idx].squeeze() for k,v in constituents_.items()} kwargs_ = {k:v[idx].squeeze() for k,v in kwargs_.items()} diff --git a/python/damask/_geom.py b/python/damask/_geom.py index c76cc8c5a..6c5e3907a 100644 --- a/python/damask/_geom.py +++ b/python/damask/_geom.py @@ -255,13 +255,13 @@ class Geom: table : damask.Table Table that contains material information. coordinates : str - Label of the column containing the spatial coordinates. + Label of the column containing the vector of spatial coordinates. + Need to be ordered (1./x fast, 3./z slow). labels : str or list of str Label(s) of the columns containing the material definition. Each unique combintation of values results in a material. """ - coords = table.sort_by([f'{i}_{coordinates}' for i in range(3,0,-1)]).get(coordinates) grid,size,origin = grid_filters.cell_coord0_gridSizeOrigin(coords) labels_ = [labels] if isinstance(labels,str) else labels From 999cf53c079c846be8eba6c4d3cbb160db6f2290 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 29 Oct 2020 07:42:41 +0100 Subject: [PATCH 09/15] tests+fixes --- python/damask/_geom.py | 2 +- python/tests/test_ConfigMaterial.py | 13 +++++++++++++ python/tests/test_Geom.py | 13 +++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/python/damask/_geom.py b/python/damask/_geom.py index 6c5e3907a..48f022805 100644 --- a/python/damask/_geom.py +++ b/python/damask/_geom.py @@ -262,7 +262,7 @@ class Geom: Each unique combintation of values results in a material. """ - grid,size,origin = grid_filters.cell_coord0_gridSizeOrigin(coords) + grid,size,origin = grid_filters.cell_coord0_gridSizeOrigin(table.get(coordinates)) labels_ = [labels] if isinstance(labels,str) else labels unique,unique_inverse = np.unique(np.hstack([table.get(l) for l in labels_]),return_inverse=True,axis=0) diff --git a/python/tests/test_ConfigMaterial.py b/python/tests/test_ConfigMaterial.py index 4863a8ac4..d0bcd2a56 100644 --- a/python/tests/test_ConfigMaterial.py +++ b/python/tests/test_ConfigMaterial.py @@ -1,8 +1,10 @@ import os import pytest +import numpy as np from damask import ConfigMaterial +from damask import Table @pytest.fixture def reference_dir(reference_dir_base): @@ -74,3 +76,14 @@ class TestConfigMaterial: material_config = ConfigMaterial.load(reference_dir/'material.yaml') new = material_config.material_rename_homogenization({'Taylor':'isostrain'}) assert not new.is_complete + + def test_from_table(self): + N = np.random.randint(3,10) + a = np.vstack((np.hstack((np.arange(N),np.arange(N)[::-1])),np.ones(N*2),np.zeros(N*2),np.ones(N*2))).T + t = Table(a,{'varying':2,'constant':2}) + c = ConfigMaterial.from_table(t,constituents={'a':'varying','b':'1_constant'},c='2_constant') + assert len(c['material']) == N + for i,m in enumerate(c['material']): + c = m['constituents'][0] + assert m['c'] == 1 and c['b'] == 0 and c['a'] == [i,1] + diff --git a/python/tests/test_Geom.py b/python/tests/test_Geom.py index 73d157cfd..dd9c28a3e 100644 --- a/python/tests/test_Geom.py +++ b/python/tests/test_Geom.py @@ -3,8 +3,10 @@ import numpy as np from damask import VTK from damask import Geom +from damask import Table from damask import Rotation from damask import util +from damask import grid_filters def geom_equal(a,b): @@ -371,3 +373,14 @@ class TestGeom: grid = np.ones(3,dtype=int)*64 geom = Geom.from_minimal_surface(grid,np.ones(3),surface,threshold) assert np.isclose(np.count_nonzero(geom.material==1)/np.prod(geom.grid),.5,rtol=1e-3) + + + def test_from_table(self): + grid = np.random.randint(60,100,3) + size = np.ones(3)+np.random.rand(3) + coords = grid_filters.cell_coord0(grid,size).reshape(-1,3,order='F') + x = np.ones(grid.prod()).reshape(-1,1) + y = np.hstack([np.arange(grid[1])]*grid[0]*grid[2]).reshape(-1,1) + t = Table(np.hstack((coords,x,y)),{'coords':3,'x':1,'y':1}) + g = Geom.from_table(t,'coords',['x','y']) + assert g.N_materials == g.grid[2] From 2736bbaba7a6931a01d9981a6b206977e5ec51e4 Mon Sep 17 00:00:00 2001 From: Test User Date: Thu, 29 Oct 2020 15:49:28 +0100 Subject: [PATCH 10/15] [skip ci] updated version information after successful test of v3.0.0-alpha-579-g4b25097a9 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index b2c5b72c6..eaf9a5b74 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v3.0.0-alpha-567-g21f095c9d +v3.0.0-alpha-579-g4b25097a9 From 4b700d367e1ebb6e07453e167348028fcb840d29 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 29 Oct 2020 17:52:16 +0100 Subject: [PATCH 11/15] improved test --- python/damask/_configmaterial.py | 1 - python/tests/test_Geom.py | 11 ++++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/python/damask/_configmaterial.py b/python/damask/_configmaterial.py index c625e6251..8b4f1c5ea 100644 --- a/python/damask/_configmaterial.py +++ b/python/damask/_configmaterial.py @@ -2,7 +2,6 @@ import copy import numpy as np -from . import grid_filters from . import Config from . import Lattice from . import Rotation diff --git a/python/tests/test_Geom.py b/python/tests/test_Geom.py index dd9c28a3e..03bd92e13 100644 --- a/python/tests/test_Geom.py +++ b/python/tests/test_Geom.py @@ -379,8 +379,9 @@ class TestGeom: grid = np.random.randint(60,100,3) size = np.ones(3)+np.random.rand(3) coords = grid_filters.cell_coord0(grid,size).reshape(-1,3,order='F') - x = np.ones(grid.prod()).reshape(-1,1) - y = np.hstack([np.arange(grid[1])]*grid[0]*grid[2]).reshape(-1,1) - t = Table(np.hstack((coords,x,y)),{'coords':3,'x':1,'y':1}) - g = Geom.from_table(t,'coords',['x','y']) - assert g.N_materials == g.grid[2] + z=np.ones(grid.prod()) + z[int(z.size/2):]=0 + t = Table(np.column_stack((coords,z)),{'coords':3,'z':1}) + g = Geom.from_table(t,'coords',['1_coords','z']) + assert g.N_materials == g.grid[0]*2 and \ + (g.material[:,:,-1]-g.material[:,:,0]-grid[:1].prod() == 0).all() From 0e499eedf367d64e2fba6c4dc13532c31ce579b8 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 29 Oct 2020 18:35:22 +0100 Subject: [PATCH 12/15] correct rounding/clearer logic --- python/tests/test_Geom.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/python/tests/test_Geom.py b/python/tests/test_Geom.py index 03bd92e13..0d393a4c4 100644 --- a/python/tests/test_Geom.py +++ b/python/tests/test_Geom.py @@ -380,8 +380,7 @@ class TestGeom: size = np.ones(3)+np.random.rand(3) coords = grid_filters.cell_coord0(grid,size).reshape(-1,3,order='F') z=np.ones(grid.prod()) - z[int(z.size/2):]=0 + z[grid[:2].prod()*int(grid[2]/2):]=0 t = Table(np.column_stack((coords,z)),{'coords':3,'z':1}) g = Geom.from_table(t,'coords',['1_coords','z']) - assert g.N_materials == g.grid[0]*2 and \ - (g.material[:,:,-1]-g.material[:,:,0]-grid[:1].prod() == 0).all() + assert g.N_materials == g.grid[0]*2 and (g.material[:,:,-1]-g.material[:,:,0] == grid[0]).all() From b2289e80b22c1fa9eceee5362752a885e0259e74 Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 29 Oct 2020 20:09:13 +0100 Subject: [PATCH 13/15] simplified --- python/damask/_configmaterial.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/python/damask/_configmaterial.py b/python/damask/_configmaterial.py index 8b4f1c5ea..0f8d4efa1 100644 --- a/python/damask/_configmaterial.py +++ b/python/damask/_configmaterial.py @@ -226,10 +226,11 @@ class ConfigMaterial(Config): Examples -------- >>> import damask - >>> m = damask.ConfigMaterial() >>> O = damask.Rotation.from_random(3).as_quaternion() >>> phase = ['Aluminum','Steel','Aluminum'] - >>> m.material_add(constituents={'phase':phase,'O':O},homogenization='SX') + >>> m = damask.ConfigMaterial().material_add(constituents={'phase':phase,'O':O}, + ... homogenization='SX') + >>> m material: - constituents: - O: [0.577764, -0.146299, -0.617669, 0.513010] @@ -259,8 +260,7 @@ class ConfigMaterial(Config): for i in range(len(c)): c[i][k] = v dup = copy.deepcopy(self) - if 'material' not in dup: dup['material'] = [] - dup['material'] +=c + dup['material'] = dup['material'] + c if 'material' in dup else c return dup From 10ba53721dec264e9d94d215df6a4b13294e124d Mon Sep 17 00:00:00 2001 From: Martin Diehl Date: Thu, 29 Oct 2020 20:47:15 +0100 Subject: [PATCH 14/15] not needed anymore --- examples/.gitignore | 3 --- 1 file changed, 3 deletions(-) diff --git a/examples/.gitignore b/examples/.gitignore index 3cb6b9820..93d78295b 100644 --- a/examples/.gitignore +++ b/examples/.gitignore @@ -3,6 +3,3 @@ *.xdmf *.sta *.vt* -*.geom -*.seeds -postProc From 0af81e1af7e808d46695f4431ead4d0692390359 Mon Sep 17 00:00:00 2001 From: Test User Date: Fri, 30 Oct 2020 05:57:50 +0100 Subject: [PATCH 15/15] [skip ci] updated version information after successful test of v3.0.0-alpha-594-g46e5023f8 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index eaf9a5b74..002deaea7 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v3.0.0-alpha-579-g4b25097a9 +v3.0.0-alpha-594-g46e5023f8