Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
T
Tooling
Manage
Activity
Members
Plan
Wiki
Code
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Terraform modules
Analyze
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
FOCUS
Tooling
Commits
0581dc55
Commit
0581dc55
authored
1 year ago
by
Christoph von Oy
Browse files
Options
Downloads
Patches
Plain Diff
Added resampling of variables
parent
fa52bcad
No related branches found
No related tags found
No related merge requests found
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
dynamics/Dynamic.py
+108
-12
108 additions, 12 deletions
dynamics/Dynamic.py
with
108 additions
and
12 deletions
dynamics/Dynamic.py
+
108
−
12
View file @
0581dc55
...
@@ -23,6 +23,7 @@ THE SOFTWARE.
...
@@ -23,6 +23,7 @@ THE SOFTWARE.
"""
"""
import
pandas
as
pd
import
pandas
as
pd
import
pyomo.environ
as
pyo
# The root dynamic is
# The root dynamic is
# for TrivialDynamic: self
# for TrivialDynamic: self
...
@@ -414,11 +415,9 @@ def resample_to_backed(values, dynamic, source_p_start, source_p_end, target_dyn
...
@@ -414,11 +415,9 @@ def resample_to_backed(values, dynamic, source_p_start, source_p_end, target_dyn
target_values
=
values
.
loc
[
target_dynamic
.
indices
[
target_p_start
:
target_p_end
]]
target_values
=
values
.
loc
[
target_dynamic
.
indices
[
target_p_start
:
target_p_end
]]
for
target_position
in
range
(
target_p_start
,
target_p_end
):
for
target_position
in
range
(
target_p_start
,
target_p_end
):
acc
=
0
acc
=
0
sum
=
0
for
source_index
in
dynamic
.
get_indices_within
(
target_dynamic
.
indices
[
target_position
],
target_dynamic
.
indices
[
target_position
+
1
]):
for
source_index
in
dynamic
.
get_indices_within
(
target_dynamic
.
indices
[
target_position
],
target_dynamic
.
indices
[
target_position
+
1
]):
acc
+=
values
.
loc
[
source_index
]
*
dynamic
.
step_size
(
source_index
)
acc
+=
values
.
loc
[
source_index
]
*
dynamic
.
step_size
(
source_index
)
sum
+=
dynamic
.
step_size
(
source_index
)
target_values
.
loc
[
target_dynamic
.
indices
[
target_position
]]
=
acc
/
target_dynamic
.
step_size_p
(
target_position
)
target_values
.
loc
[
target_dynamic
.
indices
[
target_position
]]
=
acc
/
float
(
sum
)
return
target_values
return
target_values
def
resample_into_to_backed
(
values
,
dynamic
,
source_p_start
,
source_p_end
,
target_dynamic
,
target_p_start
,
target_p_end
,
target_values
):
def
resample_into_to_backed
(
values
,
dynamic
,
source_p_start
,
source_p_end
,
target_dynamic
,
target_p_start
,
target_p_end
,
target_values
):
...
@@ -446,11 +445,9 @@ def resample_into_to_backed(values, dynamic, source_p_start, source_p_end, targe
...
@@ -446,11 +445,9 @@ def resample_into_to_backed(values, dynamic, source_p_start, source_p_end, targe
target_p_end
=
target_dynamic
.
get_position_of
(
source_i_end
)
target_p_end
=
target_dynamic
.
get_position_of
(
source_i_end
)
for
target_position
in
range
(
target_p_start
,
target_p_end
):
for
target_position
in
range
(
target_p_start
,
target_p_end
):
acc
=
0
acc
=
0
sum
=
0
for
source_index
in
dynamic
.
get_indices_within
(
target_dynamic
.
indices
[
target_position
],
target_dynamic
.
indices
[
target_position
+
1
]):
for
source_index
in
dynamic
.
get_indices_within
(
target_dynamic
.
indices
[
target_position
],
target_dynamic
.
indices
[
target_position
+
1
]):
acc
+=
values
.
loc
[
source_index
]
*
dynamic
.
step_size
(
source_index
)
acc
+=
values
.
loc
[
source_index
]
*
dynamic
.
step_size
(
source_index
)
sum
+=
dynamic
.
step_size
(
source_index
)
target_values
.
loc
[
target_dynamic
.
indices
[
target_position
]]
=
acc
/
target_dynamic
.
step_size_p
(
target_position
)
target_values
.
loc
[
target_dynamic
.
indices
[
target_position
]]
=
acc
/
float
(
sum
)
return
target_values
return
target_values
# dynamic is BackedDynamic and has target_dynamic as an ancestor
# dynamic is BackedDynamic and has target_dynamic as an ancestor
...
@@ -602,6 +599,96 @@ def resample_into_common_reference(values, dynamic, source_p_start, source_p_end
...
@@ -602,6 +599,96 @@ def resample_into_common_reference(values, dynamic, source_p_start, source_p_end
target_position
+=
1
target_position
+=
1
return
target_values
return
target_values
# only works if both dynamics share the same root dynamic
def
resample_variable
(
variable
,
dynamic
,
target_dynamic
,
target_set
):
if
dynamic
.
get_root_dynamic
()
!=
target_dynamic
.
get_root_dynamic
():
raise
ValueError
(
"
Both dynamics have to have the same root dynamic!
"
)
if
target_dynamic
.
get_index_of
(
0
)
!=
dynamic
.
get_index_of
(
0
)
or
dynamic
.
get_index_of
(
dynamic
.
number_of_steps
())
!=
target_dynamic
.
get_index_of
(
target_dynamic
.
number_of_steps
()):
raise
ValueError
(
"
The source and target dynamic has to cover the same interval of time!
"
)
non_partial_dynamic
=
dynamic
while
isinstance
(
non_partial_dynamic
,
PartialDynamic
):
non_partial_dynamic
=
non_partial_dynamic
.
reference
source_p_start
=
non_partial_dynamic
.
get_position_of
(
dynamic
.
get_index_of
(
0
))
source_p_end
=
non_partial_dynamic
.
get_position_of
(
dynamic
.
get_index_of
(
dynamic
.
number_of_steps
()))
non_partial_target_dynamic
=
target_dynamic
while
isinstance
(
non_partial_target_dynamic
,
PartialDynamic
):
non_partial_target_dynamic
=
non_partial_target_dynamic
.
reference
target_p_start
=
non_partial_target_dynamic
.
get_position_of
(
target_dynamic
.
get_index_of
(
0
))
target_p_end
=
non_partial_target_dynamic
.
get_position_of
(
target_dynamic
.
get_index_of
(
target_dynamic
.
number_of_steps
()))
if
non_partial_dynamic
==
non_partial_target_dynamic
:
return
resample_variable_same
(
variable
,
non_partial_dynamic
,
source_p_start
,
source_p_end
,
non_partial_target_dynamic
,
target_p_start
,
target_p_end
,
target_set
)
elif
isinstance
(
non_partial_target_dynamic
,
BackedDynamic
)
and
non_partial_target_dynamic
.
has_ancestor
(
non_partial_dynamic
):
return
resample_variable_to_backed
(
variable
,
non_partial_dynamic
,
source_p_start
,
source_p_end
,
non_partial_target_dynamic
,
target_p_start
,
target_p_end
,
target_set
)
elif
isinstance
(
non_partial_dynamic
,
BackedDynamic
)
and
non_partial_dynamic
.
has_ancestor
(
non_partial_target_dynamic
):
return
resample_variable_from_backed
(
variable
,
non_partial_dynamic
,
source_p_start
,
source_p_end
,
non_partial_target_dynamic
,
target_p_start
,
target_p_end
,
target_set
)
else
:
return
resample_variable_common_reference
(
variable
,
non_partial_dynamic
,
source_p_start
,
source_p_end
,
non_partial_target_dynamic
,
target_p_start
,
target_p_end
,
target_set
)
# source_dynamic and target_dynamic are the same dynamic
def
resample_variable_same
(
variable
,
dynamic
,
source_p_start
,
source_p_end
,
target_dnymiac
,
target_p_start
,
target_p_end
,
target_set
):
def
rule
(
m
,
t
):
return
variable
[
t
]
return
pyo
.
Expression
(
target_set
,
rule
=
rule
)
# target_dynamic is BackedDynamic and has dynamic as an ancestor
def
resample_variable_to_backed
(
variable
,
dynamic
,
source_p_start
,
source_p_end
,
target_dynamic
,
target_p_start
,
target_p_end
,
target_set
):
def
rule
(
m
,
t
):
target_position
=
target_dynamic
.
get_position_of
(
t
)
acc
=
0
for
source_index
in
dynamic
.
get_indices_within
(
target_dynamic
.
indices
[
target_position
],
target_dynamic
.
indices
[
target_position
+
1
]):
acc
+=
variable
[
source_index
]
*
dynamic
.
step_size
(
source_index
)
return
acc
/
target_dynamic
.
step_size_p
(
target_position
)
return
pyo
.
Expression
(
target_set
,
rule
=
rule
)
# dynamic is BackedDynamic and has target_dynamic as an ancestor
def
resample_variable_from_backed
(
variable
,
dynamic
,
source_p_start
,
source_p_end
,
target_dynamic
,
target_p_start
,
target_p_end
,
target_set
):
assignment
=
dict
()
source_i_start
=
dynamic
.
indices
[
source_p_start
]
target_i_start
=
target_dynamic
.
get_index_of
(
target_p_start
)
if
source_i_start
<
target_i_start
:
source_p_start
=
dynamic
.
get_position_of
(
target_i_start
)
source_i_end
=
dynamic
.
indices
[
source_p_end
]
target_i_end
=
target_dynamic
.
get_index_of
(
target_p_end
)
if
target_i_end
<
source_i_end
:
source_p_end
=
dynamic
.
get_position_of
(
target_i_end
)
for
source_position
in
range
(
source_p_start
,
source_p_end
):
target_indices
=
target_dynamic
.
get_indices_within
(
dynamic
.
indices
[
source_position
],
dynamic
.
indices
[
source_position
+
1
])
for
target_index
in
target_indices
:
assignment
[
target_index
]
=
variable
[
dynamic
.
indices
[
source_position
]]
def
rule
(
m
,
t
):
return
assignment
[
t
]
return
pyo
.
Expression
(
target_set
,
rule
=
rule
)
# dynamic and target_dynamic share the same root dynamic
def
resample_variable_common_reference
(
variable
,
dynamic
,
source_p_start
,
source_p_end
,
target_dynamic
,
target_p_start
,
target_p_end
,
target_set
):
assignment
=
dict
()
target_i_start
=
target_dynamic
.
get_index_of
(
target_p_start
)
source_position
=
dynamic
.
get_position_of
(
target_i_start
)
target_position
=
target_p_start
remaining_length
=
dynamic
.
step_size_p
(
source_position
)
while
target_position
<
target_p_end
:
remaining_target_length
=
target_dynamic
.
step_size_p
(
target_position
)
acc
=
[]
while
remaining_target_length
>
0
:
if
remaining_length
==
0
:
source_position
+=
1
remaining_length
=
dynamic
.
step_size_p
(
source_position
)
if
remaining_target_length
<=
remaining_length
:
acc
.
append
((
variable
[
dynamic
.
get_index_of
(
source_position
)],
remaining_target_length
))
remaining_length
-=
remaining_target_length
remaining_target_length
-=
remaining_target_length
else
:
acc
.
append
((
variable
[
dynamic
.
get_index_of
(
source_position
)],
remaining_length
))
remaining_target_length
-=
remaining_length
remaining_length
-=
remaining_length
for
i
,
(
single_variable
,
factor
)
in
enumerate
(
acc
):
acc
[
i
]
=
(
single_variable
,
factor
/
target_dynamic
.
step_size_p
(
target_position
))
assignment
[
target_dynamic
.
get_index_of
(
target_position
)]
=
acc
target_position
+=
1
def
rule
(
m
,
t
):
return
pyo
.
quicksum
(
variable
*
factor
for
variable
,
factor
in
assignment
[
t
])
return
pyo
.
Expression
(
target_set
,
rule
=
rule
)
def
test_single_resampling
(
dynamic
,
target_dynamic
):
def
test_single_resampling
(
dynamic
,
target_dynamic
):
index
=
[
dynamic
.
get_index_of
(
position
)
for
position
in
range
(
dynamic
.
number_of_steps
())]
index
=
[
dynamic
.
get_index_of
(
position
)
for
position
in
range
(
dynamic
.
number_of_steps
())]
values
=
pd
.
Series
(
data
=
[
float
(
i
)
for
i
in
range
(
len
(
index
))],
index
=
index
)
values
=
pd
.
Series
(
data
=
[
float
(
i
)
for
i
in
range
(
len
(
index
))],
index
=
index
)
...
@@ -611,7 +698,19 @@ def test_single_resampling(dynamic, target_dynamic):
...
@@ -611,7 +698,19 @@ def test_single_resampling(dynamic, target_dynamic):
print
(
'
hey
'
)
print
(
'
hey
'
)
target_index
=
[
target_dynamic
.
get_index_of
(
position
)
for
position
in
range
(
target_dynamic
.
number_of_steps
())]
target_index
=
[
target_dynamic
.
get_index_of
(
position
)
for
position
in
range
(
target_dynamic
.
number_of_steps
())]
target_values
=
pd
.
Series
(
dtype
=
float
,
index
=
target_index
)
target_values
=
pd
.
Series
(
dtype
=
float
,
index
=
target_index
)
try
:
print
(
resample_into
(
values
,
dynamic
,
target_dynamic
,
target_values
))
print
(
resample_into
(
values
,
dynamic
,
target_dynamic
,
target_values
))
except
:
print
(
'
hey
'
)
model
=
pyo
.
ConcreteModel
()
model
.
set
=
pyo
.
Set
(
initialize
=
list
(
dynamic
.
time_steps
()),
ordered
=
True
)
model
.
target_set
=
pyo
.
Set
(
initialize
=
list
(
target_dynamic
.
time_steps
()),
ordered
=
True
)
model
.
variable
=
pyo
.
Var
(
model
.
set
)
try
:
model
.
expression
=
resample_variable
(
model
.
variable
,
dynamic
,
target_dynamic
,
model
.
target_set
)
print
(
model
.
expression
.
pprint
())
except
:
print
(
'
hey
'
)
def
test_resampling
():
def
test_resampling
():
dynamics
=
{}
dynamics
=
{}
...
@@ -636,9 +735,6 @@ def test_resampling():
...
@@ -636,9 +735,6 @@ def test_resampling():
dynamics
[
'
d_4_4
'
]
=
BackedDynamic
(
dynamics
[
'
d_4
'
],
[
6
,
12
,
18
,
24
,
30
])
dynamics
[
'
d_4_4
'
]
=
BackedDynamic
(
dynamics
[
'
d_4
'
],
[
6
,
12
,
18
,
24
,
30
])
dynamics
[
'
d_4_4_1
'
]
=
PartialDynamic
(
dynamics
[
'
d_4_4
'
],
0
,
4
)
dynamics
[
'
d_4_4_1
'
]
=
PartialDynamic
(
dynamics
[
'
d_4_4
'
],
0
,
4
)
dynamics
[
'
d_4_4_2
'
]
=
PartialDynamic
(
dynamics
[
'
d_4_4
'
],
1
,
3
)
dynamics
[
'
d_4_4_2
'
]
=
PartialDynamic
(
dynamics
[
'
d_4_4
'
],
1
,
3
)
dynamics
[
'
d_5
'
]
=
BackedDynamic
(
dynamics
[
'
d
'
],
[
0
,
3
,
6
,
9
,
12
,
15
,
18
,
21
,
24
,
27
,
30
,
33
,
36
])
test_resampling
(
dynamics
[
'
d_1
'
],
dynamics
[
'
d_2
'
])
test_single_resampling
(
dynamics
[
'
d
'
],
dynamics
[
'
d
'
])
test_resampling
(
dynamics
[
'
d_3_4
'
],
dynamics
[
'
d_4
'
])
test_resampling
(
dynamics
[
'
d_3_4_2
'
],
dynamics
[
'
d_4
'
])
test_resampling
(
dynamics
[
'
d_3_4
'
],
dynamics
[
'
d_4_2
'
])
test_resampling
(
dynamics
[
'
d_3_4_2
'
],
dynamics
[
'
d_4_2
'
])
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment