Skip to content

Commit

Permalink
Added edit to update the input of optim
Browse files Browse the repository at this point in the history
  • Loading branch information
ColasPinson committed Aug 18, 2022
1 parent 02f25f5 commit f8ca65f
Show file tree
Hide file tree
Showing 7 changed files with 154 additions and 71 deletions.
6 changes: 4 additions & 2 deletions app/controllers/optimization_exports_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,12 @@ def new
redirect_to optimization_path(optim), notice: "There isn't a log file"
end
elsif format == "csv"
attributes = %w{kind config inputs outputs}
attributes = %w{x[] y}
content = CSV.generate(headers: true) do |csv|
csv << attributes
csv << attributes.map{ |attr| optim.send(attr) }
optim.inputs["x"].each_with_index do |x, i|
csv << x + optim.inputs["y"][i]
end
end
send_data content, filename: "optim_#{optim_id}.csv"
end
Expand Down
33 changes: 31 additions & 2 deletions app/controllers/optimizations_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -81,9 +81,38 @@ def create

def edit
set_optimization
end

def update
set_optimization
if params[:cancel_button]
skip_authorization
redirect_to optimizations_url, notice: "Optimization update cancelled."
redirect_to optimization_path(@optimization), notice: "Optimization update cancelled."
else
errors = ""
params[:optimization][:inputs][:x].each_with_index do |x, i|
new_x = x.delete(' ').split(',').map{|s| s.to_f}
if new_x.length == @optimization.config['xlimits'].length + @optimization.config['xtypes'].length
if params[:optimization][:inputs][:y][i] != ""
new_y = [params[:optimization][:inputs][:y][i].to_f]
if @optimization.inputs.empty? or @optimization.inputs['x'].nil?
@optimization.inputs = {"x" => [], "y" => []}
end
@optimization.inputs['x'].append(new_x)
@optimization.inputs['y'].append(new_y)
else
errors += "the input n°#{i + 1} is missing a y. "
end
else
errors += "the input n°#{i + 1} has a wrong x dimension, expected #{@optimization.config['xlimits'].length + @optimization.config['xtypes'].length}, was #{new_x.length}. "
end
end
if errors != ""
redirect_to edit_optimization_path(@optimization), notice: "Optimization update failed, #{errors}"
elsif @optimization.save
redirect_to optimization_path(@optimization), notice: "Optimization update was succesful, added #{params[:optimization][:inputs][:x].length} inputs"
else
redirect_to optimization_path(@optimization), notice: "Optimization update failed due to an unkown error"
end
end
end

Expand Down
65 changes: 0 additions & 65 deletions app/views/optimizations/_form.html.erb

This file was deleted.

41 changes: 41 additions & 0 deletions app/views/optimizations/edit.html.erb
Original file line number Diff line number Diff line change
@@ -1 +1,42 @@
<h2>Add inputs to optimization #<%= @optimization.id %></h2>
<%= form_for(@optimization, url: (optimization_path(@optimization)), :html => { :multipart => true, :role => "form" }) do |f| %>
<% if @optimization.errors.any? %>
<% @optimization.errors.full_messages.each do |message| %>
<div class="alert <%= bootstrap_class_for :error %>" role="alert">
<a href="#" data-dismiss="alert" class="close">×</a>
<%= message %>
</div>
<% end %>
<% end %>

<table class="inputs">
<thead>
<tr>
<td><label for='optimization_inputs'>Inputs <a href='#' data-bs-toggle='tooltip' style='color:#000000;' title='Add a value x with the correct dimension associated with the result y'><i class='fas fa-question-circle'></i></a></label></td>
</tr>
</thead>
<tbody>
</tbody>
<tfoot>
<tr><td>
<%= f.submit "Submit", class: "btn btn-primary submit" %>
<%= f.submit "Cancel", class: "btn btn-secondary", name: "cancel_button" %>
</td></tr>
</tfoot>
</table>
<% end %>
<% content_for :document_ready do %>
<script type="text/javascript">

$(document).ready(addField());

function addField() {
$('.add_input_cell').remove()
$('.inputs').children('tbody').append("<tr><td><input class='form-control' type='text' name='optimization[inputs][x][]' id='optimization_inputs_x' placeholder='x'></td>" +
"<td><input class='form-control' type='text' name='optimization[inputs][y][]' id='optimization_inputs_y' placeholder='y'></td></tr>" +
"<tr class='add_input_cell'><td><a href='#' class='add_input'>Add input</a>");
$('.add_input').click(function(){addField();});
}
</script>
<% end %>
66 changes: 65 additions & 1 deletion app/views/optimizations/new.html.erb
Original file line number Diff line number Diff line change
@@ -1,3 +1,67 @@
<h1>New Optimization</h1>

<%= render 'form', optimization: @optimization %>
<%= form_for(@optimization, url: (@optimization.new_record? ? optimizations_path : optimization_path(@optimization)), :html => { :multipart => true, :role => "form" }) do |f| %>
<% if @optimization.errors.any? %>
<% @optimization.errors.full_messages.each do |message| %>
<div class="alert <%= bootstrap_class_for :error %>" role="alert">
<a href="#" data-dismiss="alert" class="close">×</a>
<%= message %>
</div>
<% end %>
<% end %>

<div class="row">
<div class=" col-4">

<div class="form-group">
<%= f.label :kind %>
<%= f.select :kind , Optimization::OPTIMIZER_KINDS.each_key, {}, {class: "form-control"} %>
</div>

<div id="options" class="form-group">
</div>

<div class="form-group">
<%= f.submit "Submit", class: "btn btn-primary submit" %>
<%= f.submit "Cancel", class: "btn btn-secondary", name: "cancel_button" %>
</div>
</div>
</div>
<% end %>
<% content_for :document_ready do %>
<script type="text/javascript">

$(document).ready(updateOptions());
$("#optimization_kind").change(function() {updateOptions();});

function updateOptions() {
$("#options").empty()
if ($("#optimization_kind").val() == "SEGOMOE") {
$("#options").html(
"<label>Xlimits <a href='#' data-bs-toggle='tooltip' style='color:#000000;' title='For each field : min, max'><i class='fas fa-question-circle'></i></a></label>" +
"<div id='xlimits'></div>" +
"<label for='optimization_options'>Options <a href='#' data-bs-toggle='tooltip' style='color:#000000;' title='For example : constant, cobyla'><i class='fas fa-question-circle'></i></a></label>" +
"<input class='form-control' type='text' name='optimization[options][]' id='optimization_options_mod_obj__regr' placeholder='mod_obj__regr''>" +
"<input class='form-control' type='text' name='optimization[options][]' id='optimization_options_optimizer' placeholder='optimizer'>"
)
addField('xlimits', 'Add a dimension to the input')
} else {
$("#options").html(
"<label>Xtypes <a href='#' data-bs-toggle='tooltip' style='color:#000000;' title='For each field : type, min, max ex: float_type, 1.0, 2.0'><i class='fas fa-question-circle'></i></a></label>" +
"<div id='xtypes'></div>" +
"<label>cstr_specs <a href='#' data-bs-toggle='tooltip' style='color:#000000;' title='For each field : type, bound, tol ex: <, 0.0, 0.0001'><i class='fas fa-question-circle'></i></a></label>" +
"<div id='cstr_specs'></div>"
)
addField('xtypes', 'Add a dimension to the input')
addField('cstr_specs', 'Add a spec')
}
}

function addField(type, message) {
$('.add' + type).remove()
$('#' + type).append("<input class='form-control' type='text' name='optimization[" + type + "][]'><a href='#' class='add" + type + "'>" + message + "</a>");
$('.add' + type).click(function(){addField(type, message);});
}
</script>
<% end %>
4 changes: 3 additions & 1 deletion app/views/optimizations/show.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@
</h2>

<%= link_to "Download Log", optimization_download_url(@optimization.id, format: "log"), class: "btn btn-secondary ml-2" %>
<%= link_to "Get CSV", optimization_download_url(@optimization.id, format: "csv"), class: "btn btn-secondary ml-2" %>
<% if nb_points(@optimization.inputs).to_i > 0 %>
<%= link_to "Get CSV", optimization_download_url(@optimization.id, format: "csv"), class: "btn btn-secondary ml-2" %>
<% end %>
<%= link_to "Add Input", edit_optimization_path(@optimization), class: "btn btn-primary ml-2"%>
<%= content_tag :div,
Expand Down
10 changes: 10 additions & 0 deletions test/controllers/optimizations_controller_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -68,4 +68,14 @@ class OptimizationsControllerTest < ActionDispatch::IntegrationTest
post select_optimizations_path, params: {optimization_request_ids: [@ack.id, @unstat.id] }
assert_redirected_to controller: 'optimizations', action: 'compare', optim_list: [@ack.id, @unstat.id]
end

test "should add an input to the optimization" do
put optimization_path(@ack), params: {optimization: { inputs: { x: ["0, 0"], y: ["0"]} } }
assert_redirected_to optimization_path(@ack)
end

test "should not add invalid input" do
put optimization_path(@ack), params: {optimization: { inputs: { x: ["0"], y: ["0"]} } }
assert_redirected_to edit_optimization_path(@ack)
end
end

0 comments on commit f8ca65f

Please sign in to comment.