diff --git a/cereal/log.capnp b/cereal/log.capnp index b059218feba89c..29c3e55be4da8f 100644 --- a/cereal/log.capnp +++ b/cereal/log.capnp @@ -745,6 +745,8 @@ struct PathPlan { desire @17 :Desire; laneChangeState @18 :LaneChangeState; laneChangeDirection @19 :LaneChangeDirection; + deltaDesired @20 :Float32; + angleOffsetLive @21 :Float32; enum Desire { none @0; diff --git a/selfdrive/car/toyota/carcontroller.py b/selfdrive/car/toyota/carcontroller.py index 0a8f7979d498e7..eac213d30a6b4f 100644 --- a/selfdrive/car/toyota/carcontroller.py +++ b/selfdrive/car/toyota/carcontroller.py @@ -6,6 +6,10 @@ create_acc_cancel_command, create_fcw_command from selfdrive.car.toyota.values import CAR, ECU, STATIC_MSGS, SteerLimitParams from opendbc.can.packer import CANPacker +import math +from selfdrive.smart_torque import st_wrapper +import numpy as np +import cereal.messaging as messaging VisualAlert = car.CarControl.HUDControl.VisualAlert @@ -107,13 +111,50 @@ def __init__(self, dbc_name, car_fingerprint, enable_camera, enable_dsu, enable_ self.packer = CANPacker(dbc_name) + self.sm = messaging.SubMaster(['pathPlan']) + self.st_model = st_wrapper.get_wrapper() + self.st_model.init_model() + self.st_scales = {'angle_offset': [-1.5868093967437744, 2.339749574661255], + 'angle_steers': [-59.099998474121094, 75.9000015258789], + 'delta_desired': [-5.2593878142219195, 6.793199853675723], + 'driver_torque': [-365.0, 372.0], + 'v_ego': [6.437766075134277, 32.0827522277832]} + self.last_st_output = None + self.st_data = [] + self.st_seq_len = 200 # seq length (2 seconds) + + def handle_st(self, CS, path_plan): + v_ego = np.interp(CS.v_ego, self.st_scales['v_ego'], [0, 1]) + angle_steers = np.interp(CS.angle_steers, self.st_scales['angle_steers'], [0, 1]) + delta_desired = np.interp(math.degrees(path_plan.deltaDesired), self.st_scales['delta_desired'], [0, 1]) + angle_offset = np.interp(path_plan.angleOffsetLive, self.st_scales['angle_offset'], [0, 1]) + if self.last_st_output is None: + driver_torque = CS.steer_torque_driver + else: + driver_torque = self.last_st_output + driver_torque = np.interp(driver_torque, self.st_scales['driver_torque'], [0, 1]) + + self.st_data.append([v_ego, angle_steers, delta_desired, angle_offset, driver_torque]) + + with open('/data/delta_desired', 'a') as f: + f.write('{}\n'.format(math.degrees(path_plan.deltaDesired))) + + while len(self.st_data) > self.st_seq_len: + del self.st_data[0] + + if len(self.st_data) != self.st_seq_len: + return 0.0 + + self.last_st_output = self.st_model.run_model(np.array(self.st_data).flatten().tolist()) + return np.interp(self.last_st_output, [0, 1], self.st_scales['driver_torque']) + def update(self, enabled, CS, frame, actuators, pcm_cancel_cmd, hud_alert, left_line, right_line, lead, left_lane_depart, right_lane_depart): # *** compute control surfaces *** # gas and brake - + self.sm.update(0) apply_gas = clip(actuators.gas, 0., 1.) if CS.CP.enableGasInterceptor: @@ -127,16 +168,16 @@ def update(self, enabled, CS, frame, actuators, pcm_cancel_cmd, hud_alert, apply_accel = clip(apply_accel * ACCEL_SCALE, ACCEL_MIN, ACCEL_MAX) # steer torque - new_steer = int(round(actuators.steer * SteerLimitParams.STEER_MAX)) - apply_steer = apply_toyota_steer_torque_limits(new_steer, self.last_steer, CS.steer_torque_motor, SteerLimitParams) - self.steer_rate_limited = new_steer != apply_steer + # new_steer = int(round(actuators.steer * SteerLimitParams.STEER_MAX)) + # apply_steer = apply_toyota_steer_torque_limits(new_steer, self.last_steer, CS.steer_torque_motor, SteerLimitParams) + apply_steer = self.handle_st(CS, self.sm['pathPlan']) # only cut torque when steer state is a known fault if CS.steer_state in [9, 25]: self.last_fault_frame = frame # Cut steering for 2s after fault - if not enabled or (frame - self.last_fault_frame < 200): + if not enabled or (frame - self.last_fault_frame < 200) or CS.angle_steers_rate > 125: apply_steer = 0 apply_steer_req = 0 else: diff --git a/selfdrive/controls/lib/pathplanner.py b/selfdrive/controls/lib/pathplanner.py index 87e3c520fca08f..e21fe4cb5d6eea 100644 --- a/selfdrive/controls/lib/pathplanner.py +++ b/selfdrive/controls/lib/pathplanner.py @@ -209,6 +209,8 @@ def update(self, sm, pm, CP, VM): plan_send.pathPlan.paramsValid = bool(sm['liveParameters'].valid) plan_send.pathPlan.sensorValid = bool(sm['liveParameters'].sensorValid) plan_send.pathPlan.posenetValid = bool(sm['liveParameters'].posenetValid) + plan_send.pathPlan.deltaDesired = float(delta_desired) + plan_send.pathPlan.angleOffsetLive = float(angle_offset) plan_send.pathPlan.desire = desire plan_send.pathPlan.laneChangeState = self.lane_change_state diff --git a/selfdrive/smart_torque/Makefile b/selfdrive/smart_torque/Makefile new file mode 100644 index 00000000000000..ce767cf4e7bfdb --- /dev/null +++ b/selfdrive/smart_torque/Makefile @@ -0,0 +1,42 @@ +CXX = clang++ + +PHONELIBS = ../../phonelibs + +WARN_FLAGS = -Werror=implicit-function-declaration \ + -Werror=incompatible-pointer-types \ + -Werror=int-conversion \ + -Werror=return-type \ + -Werror=format-extra-args \ + -Wno-deprecated-declarations + +CFLAGS = -std=gnu11 -fPIC -O2 $(WARN_FLAGS) +CXXFLAGS = -std=c++14 -fPIC -O2 $(WARN_FLAGS) + +SNPE_FLAGS = -I$(PHONELIBS)/snpe/include/ +SNPE_LIBS = -lSNPE -lsymphony-cpu -lsymphonypower + +OBJS = smart_torque.o +OUTPUT = smart_torque.so + +.PHONY: all +all: $(OUTPUT) + +DEPS := $(OBJS:.o=.d) + +$(OUTPUT): $(OBJS) + @echo "[ LINK ] $@" + $(CXX) -fPIC -o '$@' $^ \ + $(LDFLAGS) \ + $(SNPE_LIBS) \ + -shared + +%.o: %.cc + @echo "[ CXX ] $@" + $(CXX) $(CXXFLAGS) -MMD \ + -Iinclude -I.. -I../.. \ + $(SNPE_FLAGS) \ + -c -o '$@' '$<' + +.PHONY: clean +clean: + rm -f $(OBJS) $(DEPS) \ No newline at end of file diff --git a/selfdrive/smart_torque/__init__.py b/selfdrive/smart_torque/__init__.py new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/selfdrive/smart_torque/smart_torque.cc b/selfdrive/smart_torque/smart_torque.cc new file mode 100644 index 00000000000000..23984bbead6f0c --- /dev/null +++ b/selfdrive/smart_torque/smart_torque.cc @@ -0,0 +1,89 @@ +#include "smart_torque.h" +using namespace std; + +std::unique_ptr snpe; + +float *output; + +zdl::DlSystem::Runtime_t checkRuntime() +{ + static zdl::DlSystem::Version_t Version = zdl::SNPE::SNPEFactory::getLibraryVersion(); + static zdl::DlSystem::Runtime_t Runtime; + std::cout << "SNPE Version: " << Version.asString().c_str() << std::endl; //Print Version number + if (zdl::SNPE::SNPEFactory::isRuntimeAvailable(zdl::DlSystem::Runtime_t::GPU)) { + Runtime = zdl::DlSystem::Runtime_t::GPU; + } else { + Runtime = zdl::DlSystem::Runtime_t::CPU; + } + return Runtime; +} + +void initializeSNPE(zdl::DlSystem::Runtime_t runtime) { + std::unique_ptr container; + container = zdl::DlContainer::IDlContainer::open("/data/openpilot/selfdrive/smart_torque/st_modelv1.dlc"); + //printf("loaded model\n"); + int counter = 0; + zdl::SNPE::SNPEBuilder snpeBuilder(container.get()); + snpe = snpeBuilder.setOutputLayers({}) + .setRuntimeProcessor(runtime) + .setUseUserSuppliedBuffers(false) + .setPerformanceProfile(zdl::DlSystem::PerformanceProfile_t::HIGH_PERFORMANCE) + .build(); +} + + +std::unique_ptr loadInputTensor(std::unique_ptr &snpe, std::vector inputVec) { + std::unique_ptr input; + const auto &strList_opt = snpe->getInputTensorNames(); + if (!strList_opt) throw std::runtime_error("Error obtaining Input tensor names"); + const auto &strList = *strList_opt; + + const auto &inputDims_opt = snpe->getInputDimensions(strList.at(0)); + const auto &inputShape = *inputDims_opt; + + input = zdl::SNPE::SNPEFactory::getTensorFactory().createTensor(inputShape); + std::copy(inputVec.begin(), inputVec.end(), input->begin()); + + return input; +} + +float returnOutput(const zdl::DlSystem::ITensor* tensor) { + float op = *tensor->cbegin(); + return op; +} + +zdl::DlSystem::ITensor* executeNetwork(std::unique_ptr& snpe, + std::unique_ptr& input) { + static zdl::DlSystem::TensorMap outputTensorMap; + snpe->execute(input.get(), outputTensorMap); + zdl::DlSystem::StringList tensorNames = outputTensorMap.getTensorNames(); + + const char* name = tensorNames.at(0); // only should the first + auto tensorPtr = outputTensorMap.getTensor(name); + return tensorPtr; +} + +extern "C" { + void init_model(){ + zdl::DlSystem::Runtime_t runt=checkRuntime(); + initializeSNPE(runt); + } + + float run_model(float inputData[1000]){ + int size = 1000; + std::vector inputVec; + for (int i = 0; i < size; i++ ) { + inputVec.push_back(inputData[i]); + } + + std::unique_ptr inputTensor = loadInputTensor(snpe, inputVec); + zdl::DlSystem::ITensor* oTensor = executeNetwork(snpe, inputTensor); + return returnOutput(oTensor); + } + +int main(){ + std::cout << "hello"; + return 0; +} + +} \ No newline at end of file diff --git a/selfdrive/smart_torque/smart_torque.h b/selfdrive/smart_torque/smart_torque.h new file mode 100644 index 00000000000000..a805c2db4251ed --- /dev/null +++ b/selfdrive/smart_torque/smart_torque.h @@ -0,0 +1,19 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern "C"{ + void init_model(); + float run_model(float inputData[1000]); +} \ No newline at end of file diff --git a/selfdrive/smart_torque/st_modelv1.dlc b/selfdrive/smart_torque/st_modelv1.dlc new file mode 100644 index 00000000000000..e97fb801fcc387 Binary files /dev/null and b/selfdrive/smart_torque/st_modelv1.dlc differ diff --git a/selfdrive/smart_torque/st_wrapper.py b/selfdrive/smart_torque/st_wrapper.py new file mode 100644 index 00000000000000..81176213455bae --- /dev/null +++ b/selfdrive/smart_torque/st_wrapper.py @@ -0,0 +1,18 @@ +from cffi import FFI +import subprocess +try: + subprocess.check_call(["make", "-j4"], cwd="/data/openpilot/selfdrive/smart_torque") +except: + pass + + +def get_wrapper(): # initialize st model and process long predictions + libmpc_fn = "/data/openpilot/selfdrive/smart_torque/smart_torque.so" + + ffi = FFI() + ffi.cdef(""" + void init_model(); + float run_model(float inputData[1000]); + """) + + return ffi.dlopen(libmpc_fn) \ No newline at end of file diff --git a/selfdrive/smart_torque/test.py b/selfdrive/smart_torque/test.py new file mode 100644 index 00000000000000..52845771c6c45d --- /dev/null +++ b/selfdrive/smart_torque/test.py @@ -0,0 +1,212 @@ +import time +from selfdrive.smart_torque import st_wrapper + +st_model = st_wrapper.get_wrapper() +st_model.init_model() +start = time.time() +for i in range(100): + model_output = st_model.run_model([0.65744268, 0.43555554, 0.43210764, 0.60105172, 0.52781547, + 0.65735246, 0.43555554, 0.43210764, 0.60105172, 0.53459973, + 0.65733015, 0.43555554, 0.43210764, 0.60105172, 0.53459973, + 0.65719932, 0.43555554, 0.43210764, 0.60105172, 0.5468114 , + 0.65719032, 0.43555554, 0.43210764, 0.60105172, 0.5468114 , + 0.65722111, 0.43629628, 0.43284354, 0.60145077, 0.55902307, + 0.65696512, 0.43629628, 0.43284354, 0.60145077, 0.55902307, + 0.65673664, 0.43629628, 0.43284354, 0.60145077, 0.56037992, + 0.65659294, 0.43703703, 0.43284354, 0.60145077, 0.56987788, + 0.65650585, 0.43703703, 0.43284354, 0.60145077, 0.56987788, + 0.65648302, 0.43703703, 0.43363638, 0.60238893, 0.56987788, + 0.65639168, 0.43703703, 0.43363638, 0.60238893, 0.57259159, + 0.65631508, 0.43703703, 0.43363638, 0.60238893, 0.58480326, + 0.65624851, 0.43777777, 0.43363638, 0.60238893, 0.58480326, + 0.65619749, 0.43777777, 0.43363638, 0.60238893, 0.58480326, + 0.65589106, 0.43777777, 0.43451212, 0.60354625, 0.58887381, + 0.65568705, 0.43777777, 0.43451212, 0.60354625, 0.58887381, + 0.6555656 , 0.43851851, 0.43451212, 0.60354625, 0.59972863, + 0.6553987 , 0.43851851, 0.43451212, 0.60354625, 0.60379919, + 0.65525084, 0.43851851, 0.43451212, 0.60354625, 0.60379919, + 0.65507695, 0.43851851, 0.43551335, 0.60495137, 0.60379919, + 0.65495267, 0.43851851, 0.43551335, 0.60495137, 0.60244233, + 0.65485666, 0.43851851, 0.43551335, 0.60495137, 0.60108548, + 0.65455648, 0.43851851, 0.43551335, 0.60495137, 0.60108548, + 0.65437508, 0.43851851, 0.43551335, 0.60495137, 0.60108548, + 0.65421435, 0.43925925, 0.43656156, 0.60547066, 0.60108548, + 0.65412882, 0.43925925, 0.43656156, 0.60547066, 0.60108548, + 0.65400796, 0.43925925, 0.43656156, 0.60547066, 0.60515604, + 0.65389186, 0.43925925, 0.43656156, 0.60547066, 0.60651289, + 0.65385653, 0.43925925, 0.43656156, 0.60547066, 0.60651289, + 0.65382753, 0.43925925, 0.43656156, 0.60547066, 0.60651289, + 0.65374757, 0.43999999, 0.43755265, 0.60609337, 0.61329715, + 0.65356171, 0.43999999, 0.43755265, 0.60609337, 0.62143826, + 0.6535034 , 0.43999999, 0.43755265, 0.60609337, 0.62143826, + 0.65350347, 0.44074073, 0.43755265, 0.60609337, 0.62143826, + 0.65342969, 0.44074073, 0.43851567, 0.60637751, 0.63229308, + 0.65336581, 0.44148147, 0.43851567, 0.60637751, 0.63229308, + 0.65331084, 0.44222221, 0.43851567, 0.60637751, 0.64179104, + 0.65334379, 0.44296295, 0.43851567, 0.60637751, 0.64857531, + 0.65322628, 0.44296295, 0.43851567, 0.60637751, 0.64857531, + 0.6530097 , 0.44370369, 0.43945456, 0.6082163 , 0.64857531, + 0.65290014, 0.44518517, 0.43945456, 0.6082163 , 0.64043419, + 0.65280398, 0.44592591, 0.43945456, 0.6082163 , 0.64857531, + 0.65278635, 0.44666666, 0.43945456, 0.6082163 , 0.64857531, + 0.65262332, 0.44666666, 0.43945456, 0.6082163 , 0.64857531, + 0.6525421 , 0.4474074 , 0.43945456, 0.6082163 , 0.65264586, + 0.65254798, 0.44814814, 0.44035562, 0.61075526, 0.65264586, + 0.65234947, 0.44962962, 0.44035562, 0.61075526, 0.65535957, + 0.65217298, 0.44962962, 0.44035562, 0.61075526, 0.65264586, + 0.65195989, 0.4511111 , 0.44035562, 0.61075526, 0.65264586, + 0.6518635 , 0.4511111 , 0.44119003, 0.6124398 , 0.65264586, + 0.65182252, 0.4511111 , 0.44119003, 0.6124398 , 0.65264586, + 0.65164514, 0.45185184, 0.44119003, 0.6124398 , 0.65400271, + 0.65151111, 0.45259258, 0.44119003, 0.6124398 , 0.65400271, + 0.65139293, 0.45259258, 0.44119003, 0.6124398 , 0.65400271, + 0.65133232, 0.45259258, 0.44203556, 0.61375498, 0.65400271, + 0.65109729, 0.45259258, 0.44203556, 0.61375498, 0.65400271, + 0.65087803, 0.45259258, 0.44203556, 0.61375498, 0.64450475, + 0.65073635, 0.45259258, 0.44203556, 0.61375498, 0.62822252, + 0.65065803, 0.45333332, 0.44203556, 0.61375498, 0.62822252, + 0.6505902 , 0.45333332, 0.44278485, 0.61388545, 0.62822252, + 0.65041527, 0.45259258, 0.44278485, 0.61388545, 0.60922659, + 0.65035354, 0.45259258, 0.44278485, 0.61388545, 0.60922659, + 0.65034052, 0.45333332, 0.44278485, 0.61388545, 0.59701493, + 0.6501386 , 0.45259258, 0.44278485, 0.61388545, 0.59701493, + 0.64998583, 0.45259258, 0.44278485, 0.61388545, 0.58616011, + 0.64985084, 0.45333332, 0.44335908, 0.61486789, 0.58616011, + 0.64978182, 0.45259258, 0.44335908, 0.61486789, 0.58616011, + 0.64974233, 0.45259258, 0.44335908, 0.61486789, 0.58616011, + 0.64965293, 0.45333332, 0.44335908, 0.61486789, 0.58616011, + 0.64962823, 0.45259258, 0.4437073 , 0.61624474, 0.58616011, + 0.6496086 , 0.45259258, 0.4437073 , 0.61624474, 0.5807327 , + 0.64957699, 0.45259258, 0.4437073 , 0.61624474, 0.57394844, + 0.64932136, 0.45333332, 0.4437073 , 0.61624474, 0.57394844, + 0.64924662, 0.45333332, 0.4437073 , 0.61624474, 0.57394844, + 0.64917514, 0.45259258, 0.44383229, 0.61582971, 0.55766621, + 0.64909006, 0.45259258, 0.44383229, 0.61582971, 0.55766621, + 0.64901598, 0.45259258, 0.44383229, 0.61582971, 0.55630936, + 0.64890516, 0.45259258, 0.44383229, 0.61582971, 0.54816825, + 0.64888761, 0.45259258, 0.44383229, 0.61582971, 0.54816825, + 0.64882781, 0.45259258, 0.44383229, 0.61582971, 0.54816825, + 0.64856013, 0.45259258, 0.44381199, 0.61496459, 0.55088195, + 0.64843779, 0.45259258, 0.44381199, 0.61496459, 0.5495251 , + 0.64833009, 0.45259258, 0.44381199, 0.61496459, 0.5495251 , + 0.64823891, 0.45259258, 0.44381199, 0.61496459, 0.5495251 , + 0.64807275, 0.45259258, 0.44372724, 0.61455918, 0.55359566, + 0.64791233, 0.45259258, 0.44372724, 0.61455918, 0.56309362, + 0.64779355, 0.45259258, 0.44372724, 0.61455918, 0.56309362, + 0.64764257, 0.45259258, 0.44372724, 0.61455918, 0.5807327 , + 0.64750914, 0.45259258, 0.44372724, 0.61455918, 0.5807327 , + 0.64716196, 0.45259258, 0.44356616, 0.61466931, 0.5807327 , + 0.64699149, 0.45259258, 0.44356616, 0.61466931, 0.59701493, + 0.64683061, 0.45259258, 0.44356616, 0.61466931, 0.62279512, + 0.64662534, 0.45259258, 0.44356616, 0.61466931, 0.62279512, + 0.64640318, 0.45259258, 0.44356616, 0.61466931, 0.6458616 , + 0.64620586, 0.45259258, 0.44345794, 0.61562666, 0.6458616 , + 0.64608761, 0.45259258, 0.44345794, 0.61562666, 0.66892809, + 0.64590754, 0.45259258, 0.44345794, 0.61562666, 0.66892809, + 0.64556854, 0.45333332, 0.44345794, 0.61562666, 0.6797829 , + 0.6454125 , 0.45333332, 0.44345794, 0.61562666, 0.6797829 , + 0.64527833, 0.45333332, 0.44345794, 0.61562666, 0.6797829 , + 0.6451606 , 0.45407406, 0.44326944, 0.61627473, 0.68928087, + 0.6449612 , 0.45407406, 0.44326944, 0.61627473, 0.68656716, + 0.64480464, 0.45407406, 0.44326944, 0.61627473, 0.68656716, + 0.64466675, 0.4548148 , 0.44326944, 0.61627473, 0.68521031, + 0.64445247, 0.4548148 , 0.44309842, 0.61669872, 0.68521031, + 0.64426267, 0.45555554, 0.44309842, 0.61669872, 0.6770692 , + 0.64397171, 0.45555554, 0.44309842, 0.61669872, 0.6770692 , + 0.64380266, 0.45629628, 0.44309842, 0.61669872, 0.67842605, + 0.64371363, 0.45629628, 0.44309842, 0.61669872, 0.67842605, + 0.64347035, 0.45629628, 0.44291634, 0.61749562, 0.67164179, + 0.6433477 , 0.45629628, 0.44291634, 0.61749562, 0.67164179, + 0.6432406 , 0.45629628, 0.44291634, 0.61749562, 0.65807327, + 0.64324068, 0.45629628, 0.44291634, 0.61749562, 0.65807327, + 0.64313767, 0.45629628, 0.44291634, 0.61749562, 0.63364993, + 0.6430116 , 0.45629628, 0.44280074, 0.61836401, 0.63364993, + 0.64304767, 0.45629628, 0.44280074, 0.61836401, 0.63364993, + 0.64307348, 0.45629628, 0.44280074, 0.61836401, 0.6119403 , + 0.642917 , 0.45629628, 0.44280074, 0.61836401, 0.59294437, + 0.64277903, 0.45555554, 0.44280074, 0.61836401, 0.59294437, + 0.6426578 , 0.45629628, 0.44280074, 0.61836401, 0.59294437, + 0.64249514, 0.45629628, 0.44273902, 0.62024658, 0.5807327 , + 0.64217867, 0.45629628, 0.44273902, 0.62024658, 0.57666214, + 0.64177675, 0.45629628, 0.44273902, 0.62024658, 0.57666214, + 0.64141782, 0.45555554, 0.44273902, 0.62024658, 0.578019 , + 0.64121083, 0.45629628, 0.44273902, 0.62024658, 0.578019 , + 0.64106773, 0.45555554, 0.44260427, 0.62065296, 0.578019 , + 0.64082921, 0.45555554, 0.44260427, 0.62065296, 0.57530529, + 0.64072762, 0.45555554, 0.44260427, 0.62065296, 0.56987788, + 0.6407262 , 0.45555554, 0.44260427, 0.62065296, 0.56987788, + 0.64072858, 0.45555554, 0.44240738, 0.62047144, 0.56987788, + 0.64059441, 0.45555554, 0.44240738, 0.62047144, 0.56445047, + 0.64055678, 0.45555554, 0.44240738, 0.62047144, 0.56445047, + 0.64063279, 0.45555554, 0.44240738, 0.62047144, 0.55223881, + 0.64071125, 0.45555554, 0.44240738, 0.62047144, 0.55223881, + 0.6406255 , 0.45555554, 0.44214386, 0.62008415, 0.55223881, + 0.64055135, 0.4548148 , 0.44214386, 0.62008415, 0.55766621, + 0.64050754, 0.4548148 , 0.44214386, 0.62008415, 0.55766621, + 0.64046448, 0.4548148 , 0.44214386, 0.62008415, 0.55223881, + 0.64017575, 0.45407406, 0.44214386, 0.62008415, 0.55223881, + 0.63998178, 0.45407406, 0.44178805, 0.62002311, 0.54274084, + 0.63982664, 0.45407406, 0.44178805, 0.62002311, 0.54274084, + 0.63968986, 0.45407406, 0.44178805, 0.62002311, 0.53867028, + 0.63958633, 0.45407406, 0.44178805, 0.62002311, 0.53867028, + 0.63934312, 0.45407406, 0.44178805, 0.62002311, 0.54002714, + 0.63922345, 0.45407406, 0.44178805, 0.62002311, 0.54002714, + 0.63920203, 0.45407406, 0.44178805, 0.62002311, 0.54002714, + 0.63892298, 0.45407406, 0.44130044, 0.62048537, 0.54002714, + 0.63867457, 0.45407406, 0.44130044, 0.62048537, 0.54274084, + 0.63849049, 0.45407406, 0.44130044, 0.62048537, 0.54274084, + 0.63837439, 0.45407406, 0.44130044, 0.62048537, 0.54274084, + 0.63827301, 0.45407406, 0.44087359, 0.61970895, 0.54274084, + 0.63801196, 0.45407406, 0.44087359, 0.61970895, 0.54274084, + 0.63786975, 0.45407406, 0.44087359, 0.61970895, 0.54274084, + 0.63774488, 0.45407406, 0.44087359, 0.61970895, 0.53731343, + 0.63771885, 0.45407406, 0.44050703, 0.61965063, 0.53731343, + 0.63747244, 0.45407406, 0.44050703, 0.61965063, 0.52917232, + 0.63728695, 0.45407406, 0.44050703, 0.61965063, 0.52917232, + 0.63710971, 0.45407406, 0.44050703, 0.61965063, 0.51153324, + 0.6369533 , 0.45333332, 0.44050703, 0.61965063, 0.51153324, + 0.63686896, 0.45333332, 0.44020673, 0.61948737, 0.48846676, + 0.63662003, 0.45259258, 0.44020673, 0.61948737, 0.48846676, + 0.63650542, 0.45259258, 0.44020673, 0.61948737, 0.47218453, + 0.63642888, 0.45259258, 0.44020673, 0.61948737, 0.47218453, + 0.63614366, 0.45185184, 0.44020673, 0.61948737, 0.45183175, + 0.63588996, 0.4511111 , 0.43998724, 0.61993128, 0.45183175, + 0.63569138, 0.4511111 , 0.43998724, 0.61993128, 0.43554953, + 0.63553259, 0.45037036, 0.43998724, 0.61993128, 0.43554953, + 0.63541627, 0.45037036, 0.43998724, 0.61993128, 0.42876526, + 0.6351619 , 0.44962962, 0.43998724, 0.61993128, 0.42876526, + 0.63505599, 0.44962962, 0.43998724, 0.61993128, 0.42469471, + 0.63496407, 0.44962962, 0.43984475, 0.61994483, 0.42469471, + 0.63490152, 0.44888888, 0.43984475, 0.61994483, 0.42469471, + 0.63463235, 0.44814814, 0.43984475, 0.61994483, 0.42469471, + 0.63441986, 0.44814814, 0.43984475, 0.61994483, 0.42333786, + 0.63427848, 0.44814814, 0.43971466, 0.61853725, 0.42333786, + 0.63417792, 0.44814814, 0.43971466, 0.61853725, 0.42876526, + 0.6340909 , 0.44814814, 0.43971466, 0.61853725, 0.42876526, + 0.63384308, 0.44814814, 0.43971466, 0.61853725, 0.43826323, + 0.63376625, 0.44814814, 0.43971466, 0.61853725, 0.43826323, + 0.6337339 , 0.44814814, 0.43947 , 0.61715659, 0.44911805, + 0.63342881, 0.44814814, 0.43947 , 0.61715659, 0.44911805, + 0.63325374, 0.44814814, 0.43947 , 0.61715659, 0.44911805, + 0.63309963, 0.44814814, 0.43947 , 0.61715659, 0.44911805, + 0.63297758, 0.44814814, 0.43947 , 0.61715659, 0.45183175, + 0.63288446, 0.44814814, 0.43947 , 0.61715659, 0.45183175, + 0.63265769, 0.44814814, 0.43914493, 0.61586306, 0.44911805, + 0.63259998, 0.4474074 , 0.43914493, 0.61586306, 0.44911805, + 0.63257484, 0.4474074 , 0.43914493, 0.61586306, 0.44911805, + 0.63255573, 0.44814814, 0.43914493, 0.61586306, 0.44911805, + 0.63232896, 0.4474074 , 0.43879742, 0.61518704, 0.44369064, + 0.63222453, 0.4474074 , 0.43879742, 0.61518704, 0.44369064, + 0.63214049, 0.44814814, 0.43879742, 0.61518704, 0.44640434, + 0.6320981 , 0.4474074 , 0.43879742, 0.61518704, 0.44640434, + 0.63206329, 0.4474074 , 0.43879742, 0.61518704, 0.44504749, + 0.63186895, 0.4474074 , 0.43841565, 0.61441433, 0.44504749, + 0.63179345, 0.4474074 , 0.43841565, 0.61441433, 0.44504749, + 0.63176534, 0.4474074 , 0.43841565, 0.61441433, 0.44504749, + 0.63145721, 0.4474074 , 0.43841565, 0.61441433, 0.44640434, + 0.63133233, 0.4474074 , 0.43841565, 0.61441433, 0.44640434]) + +print('Took: {} seconds'.format(time.time() - start)) +print(model_output) + +