std::vector< std::pair< std::string, tk::real > > writeUnsMesh( const tk::Print& print, const std::string& filename, UnsMesh& mesh, bool reorder ) // ***************************************************************************** // Write unstructured mesh to file //! \param[in] print Pretty printer //! \param[in] filename Filename to write mesh to //! \param[in] mesh Unstructured mesh object to write from //! \param[in] reorder Whether to also reorder mesh nodes //! \return Vector of time stamps consisting of a timer label (a string), and a //! time state (a tk::real in seconds) measuring the renumber and the mesh //! write time //! \author J. Bakosi // ***************************************************************************** { std::vector< std::pair< std::string, tk::real > > times; tk::Timer t; if (reorder) { print.diagstart( "Reordering mesh nodes ..." ); auto& inpoel = mesh.tetinpoel(); const auto psup = tk::genPsup( inpoel, 4, tk::genEsup( inpoel, 4 ) ); std::vector< std::size_t > map, invmap; std::tie( map, invmap ) = tk::renumber( psup ); tk::remap( inpoel, map ); print.diagend( "done" ); times.emplace_back( "Renumber mesh", t.dsec() ); t.zero(); } print.diagstart( "Writing mesh to file ..." ); const auto meshtype = pickOutput( filename ); if (meshtype == MeshWriter::GMSH) GmshMeshWriter( filename ).writeMesh( mesh ); else if (meshtype == MeshWriter::NETGEN) NetgenMeshWriter( filename ).writeMesh( mesh ); else if (meshtype== MeshWriter::EXODUSII) ExodusIIMeshWriter( filename, ExoWriter::CREATE ).writeMesh( mesh ); print.diagend( "done" ); times.emplace_back( "Write mesh to file", t.dsec() ); return times; }
nd4j::graph::Node::Node(nd4j::ops::DeclarableOp *customOp, int id, std::initializer_list<int> input, std::initializer_list<int> output, std::initializer_list<int> dimensions, float scalar, std::initializer_list<double> tArgs, std::initializer_list<int> iArgs) { this->_opType = OpType_CUSTOM; this->_id = id; this->_opNum = customOp->getOpHash(); this->_extraParams = nullptr; this->_dataType = nd4j::DataType::FLOAT32; // float as default this->_dim = nullptr; this->_customOp = customOp; _hasExternalInputs = false; _hasExternalOutputs = false; _hasInternalInputs = false; _hasInternalOutputs = false; _scalar = scalar; for (auto i: input) pickInput(i); for (auto o: output) pickOutput(o); if (dimensions.size() > 0) { _dim = new int[dimensions.size()]; int cnt = 0; for (auto d: dimensions) { _dimensions.push_back(d); _dim[cnt++] = d; } } auto block = new ContextPrototype(this->getCustomOp()->getOpDescriptor(), this->id(), false); for (auto v: dimensions) block->getAxis()->emplace_back(v); for (auto v: iArgs) block->getIArguments()->emplace_back(v); for (auto v: tArgs) block->getTArguments()->emplace_back(v); this->setContextPrototype(block); }
nd4j::graph::Node::Node(OpType opType, int opNum, int id, std::initializer_list<int> input, std::initializer_list<int> output, std::initializer_list<int> dimensions, float scalar, std::initializer_list<double> tArgs, std::initializer_list<int> iArgs) { this->_opType = opType; this->_id = id; this->_opNum = opNum; this->_extraParams = nullptr; this->_dataType = nd4j::DataType::FLOAT32; // float as default this->_dim = nullptr; _hasExternalInputs = false; _hasExternalOutputs = false; _hasInternalInputs = false; _hasInternalOutputs = false; _scalar = scalar; for (auto i: input) pickInput(i); for (auto o: output) pickOutput(o); if (dimensions.size() > 0) { _dim = new int[dimensions.size()]; int cnt = 0; for (auto d: dimensions) { _dimensions.push_back(d); _dim[cnt++] = d; } } // these ops allow in-place execution by design if (opType == OpType_TRANSFORM_SAME || opType == OpType_TRANSFORM_FLOAT || opType == OpType_TRANSFORM_STRICT || opType == OpType_TRANSFORM_BOOL || opType == OpType_SCALAR || opType == OpType_BROADCAST) { if (_output.size() <= 1) { _isInplace = true; } _opClass = OpClass_TRANSFORM; } else if (opType == OpType_REDUCE_SAME || opType == OpType_REDUCE_FLOAT || opType == OpType_REDUCE_BOOL || opType == OpType_REDUCE_LONG || opType == OpType_SUMMARYSTATS) { _opClass = OpClass_REDUCTION; } if (opType == OpType_BROADCAST || opType == OpType_BROADCAST_BOOL || opType == OpType_INDEX_REDUCE || opType == OpType_SUMMARYSTATS || opType == OpType_REDUCE_BOOL || opType == OpType_REDUCE_SAME || opType == OpType_REDUCE_FLOAT || opType == OpType_REDUCE_3 || opType == OpType_TRANSFORM_STRICT || opType == OpType_TRANSFORM_SAME || opType == OpType_TRANSFORM_FLOAT || opType == OpType_TRANSFORM_BOOL || opType == OpType_RANDOM || opType == OpType_PAIRWISE || opType == OpType_PAIRWISE_BOOL || opType == OpType_SCALAR_BOOL || opType == OpType_SCALAR) { this->_isDeductable = true; auto block = new ContextPrototype(nullptr, this->id(), false); for (auto v: dimensions) block->getAxis()->emplace_back(v); for (auto v: iArgs) block->getIArguments()->emplace_back(v); for (auto v: tArgs) block->getTArguments()->emplace_back(v); this->setContextPrototype(block); this->setCustomOp(Node::buildOpByType(opType, (int) input.size(), (int) block->getIArguments()->size(), (int) block->getTArguments()->size(), opNum, &_scalar)); block->setOpDescriptor(this->getCustomOp()->getOpDescriptor()); } else if (opType == OpType_CUSTOM) { if (this->getCustomOp()) { auto block = new ContextPrototype(this->getCustomOp()->getOpDescriptor(), this->id(), false); for (auto v: dimensions) block->getAxis()->emplace_back(v); for (auto v: iArgs) block->getIArguments()->emplace_back(v); for (auto v: tArgs) block->getTArguments()->emplace_back(v); this->setContextPrototype(block); } else throw std::runtime_error("wrong custom operation given"); } };
void nd4j::graph::Node::pickOutputOnce(int outputId) { std::pair<int, int> pair(outputId, 0); if (std::find(_output.begin(), _output.end(), pair) == _output.end()) pickOutput(outputId); }