-
Notifications
You must be signed in to change notification settings - Fork 122
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
Add a feature to enable thermal power plants to burn multiple fuels #586
Changes from 43 commits
10c5d76
f44eeb8
3c9a23a
4983584
fbc6395
e0e34d2
4c3b11c
ae47121
84b0f5f
7e32e58
9fa2a31
8fb2e2b
70333d6
f06db58
d3e14cc
56ddfec
896e942
23a33aa
e2e0df3
1537f63
0de8a13
7e5b829
9aecca8
f998ec4
b0d2ec2
1660932
79162ea
13ec11d
27d06db
6e5d76c
82e5cd4
e43e3b0
eaeafa2
7c80cc7
39faec5
48945f1
3d7df51
34a9d62
eb157d1
15ba005
c0c89b8
2a1616e
8dd4aff
77afe78
8f48fa4
5b983be
4ac5a63
4805818
d518d99
ab22570
92ad0cf
6bc4c5b
8ec89b0
e8fc0cb
488d849
289558b
a0f4a70
c06660b
0f54cc5
1b25178
3ca43a4
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
,Network_zones,CO_2_Cap_Zone_1,CO_2_Max_tons_MWh_1,CO_2_Max_Mtons_1 | ||
NE,z1,1,0.05,0.018 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
,Network_zones,CapRes_1 | ||
NE,z1,0.156 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
Voll,Demand_Segment,Cost_of_Demand_Curtailment_per_MW,Max_Demand_Curtailment,Rep_Periods,Timesteps_per_Rep_Period,Sub_Weights,Time_Index,Demand_MW_z1 | ||
50000,1,1,1,1,24,8760,1,11162 | ||
,,,,,,,2,10556 | ||
,,,,,,,3,10105 | ||
,,,,,,,4,9878 | ||
,,,,,,,5,9843 | ||
,,,,,,,6,10017 | ||
,,,,,,,7,10390 | ||
,,,,,,,8,10727 | ||
,,,,,,,9,11298 | ||
,,,,,,,10,11859 | ||
,,,,,,,11,12196 | ||
,,,,,,,12,12321 | ||
,,,,,,,13,12381 | ||
,,,,,,,14,12270 | ||
,,,,,,,15,12149 | ||
,,,,,,,16,12219 | ||
,,,,,,,17,13410 | ||
,,,,,,,18,14539 | ||
,,,,,,,19,14454 | ||
,,,,,,,20,14012 | ||
,,,,,,,21,13494 | ||
,,,,,,,22,12772 | ||
,,,,,,,23,11877 | ||
,,,,,,,24,10874 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
,Network_zones,ESR_1,ESR_2 | ||
NE,z1,0.259,0.348 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
Time_Index,NG,None,H2 | ||
0,0.05306,0,0 | ||
1,5.28,0,16 | ||
2,5.28,0,16 | ||
3,5.28,0,16 | ||
4,5.28,0,16 | ||
5,5.28,0,16 | ||
6,5.28,0,16 | ||
7,5.28,0,16 | ||
8,5.28,0,16 | ||
9,5.28,0,16 | ||
10,5.28,0,16 | ||
11,5.28,0,16 | ||
12,5.28,0,16 | ||
13,5.28,0,16 | ||
14,5.28,0,16 | ||
15,5.28,0,16 | ||
16,5.28,0,16 | ||
17,5.28,0,16 | ||
18,5.28,0,16 | ||
19,5.28,0,16 | ||
20,5.28,0,16 | ||
21,5.28,0,16 | ||
22,5.28,0,16 | ||
23,5.28,0,16 | ||
24,5.28,0,16 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
Resource,Zone,THERM,MUST_RUN,STOR,FLEX,HYDRO,VRE,LDS,Num_VRE_Bins,MULTI_FUELS,New_Build,Can_Retire,Existing_Cap_MW,Existing_Cap_MWh,Existing_Charge_Cap_MW,Max_Cap_MW,Max_Cap_MWh,Max_Charge_Cap_MW,Min_Cap_MW,Min_Cap_MWh,Min_Charge_Cap_MW,Inv_Cost_per_MWyr,Inv_Cost_per_MWhyr,Inv_Cost_Charge_per_MWyr,Fixed_OM_Cost_per_MWyr,Fixed_OM_Cost_per_MWhyr,Fixed_OM_Cost_Charge_per_MWyr,Var_OM_Cost_per_MWh,Var_OM_Cost_per_MWh_In,Heat_Rate_MMBTU_per_MWh,Fuel,Cap_Size,Start_Cost_per_MW,Start_Fuel_MMBTU_per_MW,Up_Time,Down_Time,Ramp_Up_Percentage,Ramp_Dn_Percentage,Hydro_Energy_to_Power_Ratio,Min_Power,Self_Disch,Eff_Up,Eff_Down,Min_Duration,Max_Duration,Max_Flexible_Demand_Advance,Max_Flexible_Demand_Delay,Flexible_Demand_Energy_Eff,Reg_Max,Rsv_Max,Reg_Cost,Rsv_Cost,MaxCapTag_1,MaxCapTag_2,MaxCapTag_3,MinCapTag_1,MinCapTag_2,MinCapTag_3,MGA,Resource_Type,CapRes_1,ESR_1,ESR_2,region,cluster,Num_Fuels,Fuel1,Heat_Rate1_MMBTU_per_MWh,Fuel1_Min_Cofire_Level,Fuel1_Max_Cofire_Level,Fuel1_Min_Cofire_Level_Start,Fuel1_Max_Cofire_Level_Start,Fuel2,Heat_Rate2_MMBTU_per_MWh,Fuel2_Min_Cofire_Level,Fuel2_Max_Cofire_Level,Fuel2_Min_Cofire_Level_Start,Fuel2_Max_Cofire_Level_Start | ||
natural_gas_combined_cycle,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,-1,-1,-1,0,0,0,65400,0,0,10287,0,0,3.55,0,7.43,NG,250,91,2,6,6,0.64,0.64,0,0.468,0,1,1,0,0,0,0,1,0.25,0.5,0,0,0,0,0,0,0,0,1,natural_gas_fired_combined_cycle,0.93,0,0,NE,1,2,NG,7.43,0,1,0,1,H2,7.43,0.05,1,0.05,1 | ||
solar_pv,1,0,0,0,0,0,1,0,1,0,1,0,0,0,0,-1,-1,-1,0,0,0,85300,0,0,18760,0,0,0,0,9.13,None,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,solar_photovoltaic,0.8,1,1,NE,1,1,None,0,0,0,0,0,None,0,0,0,0,1 | ||
onshore_wind,1,0,0,0,0,0,1,0,1,0,1,0,0,0,0,-1,-1,-1,0,0,0,97200,0,0,43205,0,0,0.1,0,9.12,None,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,1,onshore_wind_turbine,0.8,1,1,NE,1,1,None,0,0,0,0,1,None,0,0,0,0,1 | ||
battery,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,-1,-1,-1,0,0,0,19584,22494,0,4895,5622,0,0.15,0.15,0,None,0,0,0,0,0,1,1,0,0,0,0.92,0.92,1,10,0,0,1,0,0,0,0,0,0,1,0,0,1,0,battery_mid,0.95,0,0,NE,0,1,None,0,0,0,0,0,None,0,0,0,0,1 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
Time_Index,natural_gas_combined_cycle,solar_pv,onshore_wind,battery | ||
1,1,0,0.889717042,1 | ||
2,1,0,0.877715468,1 | ||
3,1,0,0.903424203,1 | ||
4,1,0,0.895153165,1 | ||
5,1,0,0.757258117,1 | ||
6,1,0,0.630928695,1 | ||
7,1,0,0.557177782,1 | ||
8,1,0,0.6072492,1 | ||
9,1,0.1779,0.423417866,1 | ||
10,1,0.429,0.007470775,1 | ||
11,1,0.5748,0.002535942,1 | ||
12,1,0.6484,0.002153709,1 | ||
13,1,0.6208,0.00445132,1 | ||
14,1,0.596,0.007711587,1 | ||
15,1,0.5013,0.100848213,1 | ||
16,1,0.3311,0.201802149,1 | ||
17,1,0.0642,0.141933054,1 | ||
18,1,0,0.567022562,1 | ||
19,1,0,0.946024895,1 | ||
20,1,0,0.923394203,1 | ||
21,1,0,0.953386247,1 | ||
22,1,0,0.929205418,1 | ||
23,1,0,0.849528909,1 | ||
24,1,0,0.665570974,1 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
MaxCapReqConstraint,ConstraintDescription,Max_MW | ||
1,PV,50000 | ||
2,Wind,100000 | ||
3,Batteries,60000 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
MinCapReqConstraint,ConstraintDescription,Min_MW | ||
1,PV,5000 | ||
2,Wind,10000 | ||
3,Batteries,6000 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
# Small New England: One Zone with resources that can use multiple fuels | ||
|
||
**SmallNewEngland** is set of a simplified versions of the more detailed example system RealSystemExample. It is condensed for easy comprehension and quick testing of different components of the GenX. **SmallNewEngland/OneZone_MultiFules** is one of our most basic models, a 24-hour example with hourly resolution containing only one zone representing New England. The model includes only natural gas (cofiring with H2), solar PV, wind, and lithium-ion battery storage with no initial capacity. | ||
|
||
To run the model, first navigate to the example directory at `GenX/Example_Systems/SmallNewEngland/OneZone_MultiFuels`: | ||
|
||
`cd("Example_Systems/SmallNewEngland/OneZone_MultiFuels")` | ||
|
||
Next, ensure that your settings in `GenX_settings.yml` are correct. The default settings use the solver HiGHS (`Solver: HiGHS`). Other optional policies include minimum capacity requirements, a capacity reserve margin, and more. | ||
|
||
Once the settings are confirmed, run the model with the `Run.jl` script in the example directory: | ||
|
||
`include("Run.jl")` | ||
|
||
Once the model has completed, results will write to the `Results` directory. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
Reg_Req_Percent_Demand,Reg_Req_Percent_VRE,Rsv_Req_Percent_Demand,Rsv_Req_Percent_VRE,Unmet_Rsv_Penalty_Dollar_per_MW,Dynamic_Contingency,Static_Contingency_MW | ||
0.01,0.0032,0.033,0.0795,1000,0,0 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
using GenX | ||
|
||
run_genx_case!(dirname(@__FILE__)) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
# CPLEX Solver Parameters | ||
Feasib_Tol: 1.0e-05 # Constraint (primal) feasibility tolerances. | ||
Optimal_Tol: 1e-5 # Dual feasibility tolerances. | ||
Pre_Solve: 1 # Controls presolve level. | ||
TimeLimit: 110000 # Limits total time solver. | ||
MIPGap: 1e-3 # Relative (p.u. of optimal) mixed integer optimality tolerance for MIP problems (ignored otherwise). | ||
Method: 2 # Algorithm used to solve continuous models (including MIP root relaxation). | ||
BarConvTol: 1.0e-08 # Barrier convergence tolerance (determines when barrier terminates). | ||
NumericFocus: 0 # Numerical precision emphasis. | ||
SolutionType: 2 # Solution type for LP or QP. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
OverwriteResults: 0 # Overwrite existing results in output folder or create a new one; 0 = create new folder; 1 = overwrite existing results | ||
PrintModel: 0 # Write the model formulation as an output; 0 = active; 1 = not active | ||
NetworkExpansion: 0 # Transmission network expansionl; 0 = not active; 1 = active systemwide | ||
Trans_Loss_Segments: 1 # Number of segments used in piecewise linear approximation of transmission losses; 1 = linear, >2 = piecewise quadratic | ||
Reserves: 0 # Regulation (primary) and operating (secondary) reserves; 0 = not active, 1 = active systemwide | ||
EnergyShareRequirement: 1 # Minimum qualifying renewables penetration; 0 = not active; 1 = active systemwide | ||
CapacityReserveMargin: 1 # Number of capacity reserve margin constraints; 0 = not active; 1 = active systemwide | ||
CO2Cap: 0 # CO2 emissions cap; 0 = not active (no CO2 emission limit); 1 = mass-based emission limit constraint; 2 = demand + rate-based emission limit constraint; 3 = generation + rate-based emission limit constraint | ||
StorageLosses: 1 # Energy Share Requirement and CO2 constraints account for energy lost; 0 = not active (DO NOT account for energy lost); 1 = active systemwide (DO account for energy lost) | ||
MinCapReq: 1 # Activate minimum technology carveout constraints; 0 = not active; 1 = active | ||
MaxCapReq: 1 # Activate maximum technology carveout constraints; 0 = not active; 1 = active | ||
ParameterScale: 1 # Turn on parameter scaling wherein load, capacity and power variables are defined in GW rather than MW. 0 = not active; 1 = active systemwide | ||
WriteShadowPrices: 1 # Write shadow prices of LP or relaxed MILP; 0 = not active; 1 = active | ||
UCommit: 2 # Unit committment of thermal power plants; 0 = not active; 1 = active using integer clestering; 2 = active using linearized clustering | ||
TimeDomainReductionFolder: "TDR_Results" # Directory name where results from time domain reduction will be saved. If results already exist here, these will be used without running time domain reduction script again. | ||
TimeDomainReduction: 0 # Time domain reduce (i.e. cluster) inputs based on Demand_data.csv, Generators_variability.csv, and Fuels_data.csv; 0 = not active (use input data as provided); 0 = active (cluster input data, or use data that has already been clustered) | ||
ModelingToGenerateAlternatives: 0 # Modeling to generate alternatives; 0 = not active; 1 = active. Note: produces a single solution as output | ||
ModelingtoGenerateAlternativeSlack: 0.1 # Slack value as a fraction of least-cost objective in budget constraint used for evaluating alternative model solutions; positive float value | ||
ModelingToGenerateAlternativeIterations: 3 # Number of MGA iterations with maximization and minimization objective | ||
MethodofMorris: 0 #Flag for turning on the Method of Morris analysis |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
# Gurobi Solver Parameters | ||
# Common solver settings | ||
Feasib_Tol: 1.0e-05 # Constraint (primal) feasibility tolerances. | ||
Optimal_Tol: 1e-5 # Dual feasibility tolerances. | ||
TimeLimit: 110000 # Limits total time solver. | ||
Pre_Solve: 1 # Controls presolve level. | ||
Method: 2 # Algorithm used to solve continuous models (including MIP root relaxation). | ||
|
||
#Gurobi-specific solver settings | ||
MIPGap: 1e-3 # Relative (p.u. of optimal) mixed integer optimality tolerance for MIP problems (ignored otherwise). | ||
BarConvTol: 1.0e-08 # Barrier convergence tolerance (determines when barrier terminates). | ||
NumericFocus: 0 # Numerical precision emphasis. | ||
Crossover: 0 # Barrier crossver strategy. | ||
PreDual: 0 # Decides whether presolve should pass the primal or dual linear programming problem to the LP optimization algorithm. | ||
AggFill: 10 # Allowed fill during presolve aggregation. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
# HiGHS Solver Parameters | ||
# Common solver settings | ||
Feasib_Tol: 1.0e-05 # Primal feasibility tolerance # [type: double, advanced: false, range: [1e-10, inf], default: 1e-07] | ||
Optimal_Tol: 1.0e-05 # Dual feasibility tolerance # [type: double, advanced: false, range: [1e-10, inf], default: 1e-07] | ||
TimeLimit: 1.0e23 # Time limit # [type: double, advanced: false, range: [0, inf], default: inf] | ||
Pre_Solve: choose # Presolve option: "off", "choose" or "on" # [type: string, advanced: false, default: "choose"] | ||
Method: choose #HiGHS-specific solver settings # Solver option: "simplex", "choose" or "ipm" # [type: string, advanced: false, default: "choose"] | ||
|
||
#highs-specific solver settings | ||
|
||
# run the crossover routine for ipx | ||
# [type: string, advanced: "on", range: {"off", "on"}, default: "off"] | ||
run_crossover: "on" |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -23,7 +23,7 @@ | |
|
||
# Add Resource IDs after reading to prevent user errors | ||
gen_in[!,:R_ID] = 1:G | ||
|
||
scale_factor = setup["ParameterScale"] == 1 ? ModelScalingFactor : 1 | ||
## Defining sets of generation and storage resources | ||
|
||
|
@@ -66,13 +66,18 @@ | |
if !("RETRO" in names(gen_in)) | ||
gen_in[!, "RETRO"] = zero(gen_in[!, "R_ID"]) | ||
end | ||
|
||
inputs_gen["RETRO"] = gen_in[gen_in.RETRO.==1,:R_ID] | ||
# Disable Retrofit while it's under development | ||
if !(isempty(inputs_gen["RETRO"])) | ||
error("The Retrofits feature, which is activated by nonzero data in a 'RETRO' column in Generators_data.csv, is under development and is not ready for public use. Disable this message to enable this *experimental* feature.") | ||
end | ||
|
||
# Set of multi-fuel resources | ||
if "MULTI_FUELS" ∉ names(gen_in) | ||
gen_in[!, "MULTI_FUELS"] = zero(gen_in[!, "R_ID"]) | ||
end | ||
|
||
# Set of thermal generator resources | ||
if setup["UCommit"]>=1 | ||
# Set of thermal resources eligible for unit committment | ||
|
@@ -158,7 +163,6 @@ | |
|
||
inputs_gen["RETROFIT_INV_CAP_COSTS"] = [ [ inv_cap[i][y] for i in 1:max_retro_sources if inv_cap[i][y] >= 0 ] for y in 1:G ] # The set of investment costs (capacity $/MWyr) of each retrofit by source | ||
end | ||
|
||
# See documentation for descriptions of each column | ||
# Generally, these scalings converts energy and power units from MW to GW | ||
# and $/MW to $M/GW. Both are done by dividing the values by 1000. | ||
|
@@ -219,7 +223,7 @@ | |
end | ||
|
||
load_vre_stor_data!(inputs_gen, setup, path) | ||
|
||
load_multi_fuels_data!(inputs_gen, setup, path) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'd suggest defining here the two entries
|
||
|
||
# write zeros if col names are not in the gen_in dataframe | ||
required_cols_for_co2 = ["Biomass", "CO2_Capture_Fraction", "CO2_Capture_Fraction_Startup", "CCS_Disposal_Cost_per_Metric_Ton"] | ||
|
@@ -241,6 +245,51 @@ | |
println(filename * " Successfully Read!") | ||
end | ||
|
||
@doc raw""" | ||
load_multi_fuels_data!(inputs_gen::Dict, setup::Dict, path::AbstractString) | ||
|
||
Function for reading input parameters related to multi fuels | ||
""" | ||
function load_multi_fuels_data!(inputs_gen::Dict, setup::Dict, path::AbstractString) | ||
gen_in = inputs_gen["dfGen"] | ||
inputs_gen["MULTI_FUELS"] = gen_in[gen_in.MULTI_FUELS.==1,:R_ID] | ||
inputs_gen["SINGLE_FUEL"] = gen_in[gen_in.MULTI_FUELS.!=1,:R_ID] | ||
|
||
if !isempty(inputs_gen["MULTI_FUELS"]) # If there are any resources using multi fuels, read relevant data | ||
inputs_gen["NUM_FUELS"] = gen_in[!,:Num_Fuels] # Number of fuels that this resource can use | ||
max_fuels = maximum(inputs_gen["NUM_FUELS"]) | ||
fuel_cols = [ Symbol(string("Fuel",i)) for i in 1:max_fuels ] | ||
heat_rate_cols = [ Symbol(string("Heat_Rate",i, "_MMBTU_per_MWh")) for i in 1:max_fuels ] | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
max_cofire_cols = [ Symbol(string("Fuel",i, "_Max_Cofire_Level")) for i in 1:max_fuels ] | ||
min_cofire_cols = [ Symbol(string("Fuel",i, "_Min_Cofire_Level")) for i in 1:max_fuels ] | ||
max_cofire_start_cols = [ Symbol(string("Fuel",i, "_Max_Cofire_Level_Start")) for i in 1:max_fuels ] | ||
min_cofire_start_cols = [ Symbol(string("Fuel",i, "_Min_Cofire_Level_Start")) for i in 1:max_fuels ] | ||
fuel_types = [ gen_in[!,f] for f in fuel_cols ] | ||
heat_rates = [ gen_in[!,f] for f in heat_rate_cols ] | ||
max_cofire = [ gen_in[!,f] for f in max_cofire_cols ] | ||
min_cofire = [ gen_in[!,f] for f in min_cofire_cols ] | ||
max_cofire_start = [ gen_in[!,f] for f in max_cofire_start_cols ] | ||
min_cofire_start = [ gen_in[!,f] for f in min_cofire_start_cols ] | ||
inputs_gen["HEAT_RATES"] = heat_rates | ||
inputs_gen["MAX_COFIRE"] = max_cofire | ||
inputs_gen["MIN_COFIRE"] = min_cofire | ||
inputs_gen["MAX_COFIRE_START"] = max_cofire_start | ||
inputs_gen["MIN_COFIRE_START"] = min_cofire_start | ||
inputs_gen["FUEL_TYPES"] = fuel_types | ||
inputs_gen["FUEL_COLS"] = fuel_cols | ||
inputs_gen["MAX_NUM_FUELS"] = max_fuels | ||
|
||
# check whether non-zero heat rates are used for resources that only use a single fuel | ||
for i in 1:max_fuels | ||
for hr in heat_rates[i][inputs_gen["SINGLE_FUEL"]] | ||
if hr > 0 | ||
error("Heat rates for multi fuels must be zero when only one fuel is used") | ||
end | ||
end | ||
end | ||
end | ||
end | ||
|
||
|
||
@doc raw""" | ||
check_vre_stor_validity(df::DataFrame, setup::Dict) | ||
|
@@ -369,7 +418,7 @@ | |
Function for reading input parameters related to co-located VRE-storage resources | ||
""" | ||
function load_vre_stor_data!(inputs_gen::Dict, setup::Dict, path::AbstractString) | ||
|
||
error_strings = String[] | ||
dfGen = inputs_gen["dfGen"] | ||
inputs_gen["VRE_STOR"] = "VRE_STOR" in names(dfGen) ? dfGen[dfGen.VRE_STOR.==1,:R_ID] : Int[] | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You could use
zeros(G)
to create a vector of zero elements of lengthG
(it should be faster because it doesn't read the data frame)