Skip to content

Commit

Permalink
Split name2id and id2name into a separate source file.
Browse files Browse the repository at this point in the history
PiperOrigin-RevId: 647373431
Change-Id: I3bab0ea7157750b79826739e3d739e4114fa0af7
  • Loading branch information
saran-t authored and Copybara-Service committed Jun 27, 2024
1 parent 44be878 commit 0e19722
Show file tree
Hide file tree
Showing 8 changed files with 330 additions and 278 deletions.
2 changes: 2 additions & 0 deletions src/engine/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ set(MUJOCO_ENGINE_SRCS
engine_io.c
engine_io.h
engine_macro.h
engine_name.c
engine_name.h
engine_passive.c
engine_passive.h
engine_plugin.cc
Expand Down
284 changes: 284 additions & 0 deletions src/engine/engine_name.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,284 @@
// Copyright 2021 DeepMind Technologies Limited
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "engine/engine_name.h"

#include <stdint.h>
#include <string.h>

#include <mujoco/mjmodel.h>
#include "engine/engine_crossplatform.h"
#include "engine/engine_io.h"



//-------------------------- name functions --------------------------------------------------------
// get number of objects and name addresses for given object type
static int _getnumadr(const mjModel* m, mjtObj type, int** padr, int* mapadr) {
int num = -1;
// map address starts at the end, subtract with explicit switch fallthrough below
*mapadr = m->nnames_map;

// get address list and size for object type
switch (type) {
case mjOBJ_BODY:
case mjOBJ_XBODY:
*mapadr -= mjLOAD_MULTIPLE*m->nbody;
*padr = m->name_bodyadr;
num = m->nbody;
mjFALLTHROUGH;

case mjOBJ_JOINT:
*mapadr -= mjLOAD_MULTIPLE*m->njnt;
if (num < 0) {
*padr = m->name_jntadr;
num = m->njnt;
}
mjFALLTHROUGH;

case mjOBJ_GEOM:
*mapadr -= mjLOAD_MULTIPLE*m->ngeom;
if (num < 0) {
*padr = m->name_geomadr;
num = m->ngeom;
}
mjFALLTHROUGH;

case mjOBJ_SITE:
*mapadr -= mjLOAD_MULTIPLE*m->nsite;
if (num < 0) {
*padr = m->name_siteadr;
num = m->nsite;
}
mjFALLTHROUGH;

case mjOBJ_CAMERA:
*mapadr -= mjLOAD_MULTIPLE*m->ncam;
if (num < 0) {
*padr = m->name_camadr;
num = m->ncam;
}
mjFALLTHROUGH;

case mjOBJ_LIGHT:
*mapadr -= mjLOAD_MULTIPLE*m->nlight;
if (num < 0) {
*padr = m->name_lightadr;
num = m->nlight;
}
mjFALLTHROUGH;

case mjOBJ_FLEX:
*mapadr -= mjLOAD_MULTIPLE*m->nflex;
if (num < 0) {
*padr = m->name_flexadr;
num = m->nflex;
}
mjFALLTHROUGH;

case mjOBJ_MESH:
*mapadr -= mjLOAD_MULTIPLE*m->nmesh;
if (num < 0) {
*padr = m->name_meshadr;
num = m->nmesh;
}
mjFALLTHROUGH;

case mjOBJ_SKIN:
*mapadr -= mjLOAD_MULTIPLE*m->nskin;
if (num < 0) {
*padr = m->name_skinadr;
num = m->nskin;
}
mjFALLTHROUGH;

case mjOBJ_HFIELD:
*mapadr -= mjLOAD_MULTIPLE*m->nhfield;
if (num < 0) {
*padr = m->name_hfieldadr;
num = m->nhfield;
}
mjFALLTHROUGH;

case mjOBJ_TEXTURE:
*mapadr -= mjLOAD_MULTIPLE*m->ntex;
if (num < 0) {
*padr = m->name_texadr;
num = m->ntex;
}
mjFALLTHROUGH;

case mjOBJ_MATERIAL:
*mapadr -= mjLOAD_MULTIPLE*m->nmat;
if (num < 0) {
*padr = m->name_matadr;
num = m->nmat;
}
mjFALLTHROUGH;

case mjOBJ_PAIR:
*mapadr -= mjLOAD_MULTIPLE*m->npair;
if (num < 0) {
*padr = m->name_pairadr;
num = m->npair;
}
mjFALLTHROUGH;

case mjOBJ_EXCLUDE:
*mapadr -= mjLOAD_MULTIPLE*m->nexclude;
if (num < 0) {
*padr = m->name_excludeadr;
num = m->nexclude;
}
mjFALLTHROUGH;

case mjOBJ_EQUALITY:
*mapadr -= mjLOAD_MULTIPLE*m->neq;
if (num < 0) {
*padr = m->name_eqadr;
num = m->neq;
}
mjFALLTHROUGH;

case mjOBJ_TENDON:
*mapadr -= mjLOAD_MULTIPLE*m->ntendon;
if (num < 0) {
*padr = m->name_tendonadr;
num = m->ntendon;
}
mjFALLTHROUGH;

case mjOBJ_ACTUATOR:
*mapadr -= mjLOAD_MULTIPLE*m->nu;
if (num < 0) {
*padr = m->name_actuatoradr;
num = m->nu;
}
mjFALLTHROUGH;

case mjOBJ_SENSOR:
*mapadr -= mjLOAD_MULTIPLE*m->nsensor;
if (num < 0) {
*padr = m->name_sensoradr;
num = m->nsensor;
}
mjFALLTHROUGH;

case mjOBJ_NUMERIC:
*mapadr -= mjLOAD_MULTIPLE*m->nnumeric;
if (num < 0) {
*padr = m->name_numericadr;
num = m->nnumeric;
}
mjFALLTHROUGH;

case mjOBJ_TEXT:
*mapadr -= mjLOAD_MULTIPLE*m->ntext;
if (num < 0) {
*padr = m->name_textadr;
num = m->ntext;
}
mjFALLTHROUGH;

case mjOBJ_TUPLE:
*mapadr -= mjLOAD_MULTIPLE*m->ntuple;
if (num < 0) {
*padr = m->name_tupleadr;
num = m->ntuple;
}
mjFALLTHROUGH;

case mjOBJ_KEY:
*mapadr -= mjLOAD_MULTIPLE*m->nkey;
if (num < 0) {
*padr = m->name_keyadr;
num = m->nkey;
}
mjFALLTHROUGH;

case mjOBJ_PLUGIN:
*mapadr -= mjLOAD_MULTIPLE*m->nplugin;
if (num < 0) {
*padr = m->name_pluginadr;
num = m->nplugin;
}
mjFALLTHROUGH;

default:
if (num < 0) {
*padr = 0;
num = 0;
}
}

return num;
}

// get string hash, see http://www.cse.yorku.ca/~oz/hash.html
uint64_t mj_hashString(const char* s, uint64_t n) {
uint64_t h = 5381;
int c;
while ((c = *s++)) {
h = ((h << 5) + h) ^ c;
}
return h % n;
}

// get id of object with the specified mjtObj type and name,
// returns -1 if id not found
int mj_name2id(const mjModel* m, int type, const char* name) {
int mapadr;
int* adr = 0;

// get number of objects and name addresses
int num = mjLOAD_MULTIPLE*_getnumadr(m, type, &adr, &mapadr);

// search
if (num) { // look up at hash address
uint64_t hash = mj_hashString(name, num);
uint64_t i = hash;

do {
int j = m->names_map[mapadr + i];
if (j < 0) {
return -1;
}

if (!strncmp(name, m->names+adr[j], m->nnames-adr[j])) {
return j;
}
if ((++i) == num)i = 0;
} while (i != hash);
}
return -1;
}



// get name of object with the specified mjtObj type and id,
// returns NULL if name not found
const char* mj_id2name(const mjModel* m, int type, int id) {
int mapadr;
int* adr = 0;

// get number of objects and name addresses
int num = _getnumadr(m, type, &adr, &mapadr);

// id is in [0, num) and the found name is not the empty string "\0"
if (id >= 0 && id < num && m->names[adr[id]]) {
return m->names+adr[id];
}

return NULL;
}
41 changes: 41 additions & 0 deletions src/engine/engine_name.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// Copyright 2021 DeepMind Technologies Limited
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef MUJOCO_SRC_ENGINE_ENGINE_NAME_H_
#define MUJOCO_SRC_ENGINE_ENGINE_NAME_H_

#include <stdint.h>

#include <mujoco/mjexport.h>
#include <mujoco/mjmodel.h>

#ifdef __cplusplus
extern "C" {
#endif

//-------------------------- name functions --------------------------------------------------------

// get string hash, see http://www.cse.yorku.ca/~oz/hash.html
uint64_t mj_hashString(const char* s, uint64_t n);

// get id of object with the specified mjtObj type and name, returns -1 if id not found
MJAPI int mj_name2id(const mjModel* m, int type, const char* name);

// get name of object with the specified mjtObj type and id, returns NULL if name not found
MJAPI const char* mj_id2name(const mjModel* m, int type, int id);
#ifdef __cplusplus
}
#endif

#endif // MUJOCO_SRC_ENGINE_ENGINE_NAME_H_
1 change: 1 addition & 0 deletions src/engine/engine_print.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include <mujoco/mjxmacro.h>
#include "engine/engine_core_constraint.h"
#include "engine/engine_io.h"
#include "engine/engine_name.h"
#include "engine/engine_support.h"
#include "engine/engine_util_errmem.h"
#include "engine/engine_util_misc.h"
Expand Down
Loading

0 comments on commit 0e19722

Please sign in to comment.