Minsky
minsky::anonymous_namespace{minskyTensorOps.cc} Namespace Reference

Classes

struct  is_equal
 
struct  TensorOpError
 

Functions

void meldArgsIntoCommonHypercube (vector< TensorPtr > &args)
 

Function Documentation

◆ meldArgsIntoCommonHypercube()

void minsky::anonymous_namespace{minskyTensorOps.cc}::meldArgsIntoCommonHypercube ( vector< TensorPtr > &  args)

Definition at line 1322 of file minskyTensorOps.cc.

Referenced by minsky::GeneralTensorOp< OperationType::meld >::setArguments(), and minsky::GeneralTensorOp< OperationType::merge >::setArguments().

1322  {
1323  Hypercube hc;
1324  for (auto& i: args)
1325  unionHypercube(hc, i->hypercube(), false);
1326 
1327  // list of final dimension names in order
1328  vector<string> unionDims; unionDims.reserve(hc.xvectors.size());
1329  for (auto& i: hc.xvectors) unionDims.push_back(i.name);
1330 
1331  // create tensor chains for each argument to permute it into the common hypercube
1332  for (auto& i: args)
1333  {
1334  set <string> argDims;
1335  for (auto& j: i->hypercube().xvectors) argDims.insert(j.name);
1336  auto spread=make_shared<SpreadLast>();
1337  Hypercube spreadHC;
1338  for (auto& j: hc.xvectors)
1339  if (!argDims.contains(j.name))
1340  spreadHC.xvectors.push_back(j);
1341  spread->setArgument(i,{});
1342  spread->setSpreadDimensions(spreadHC);
1343 
1344  auto pivot=make_shared<Pivot>();
1345  pivot->setArgument(spread,{});
1346  pivot->setOrientation(unionDims);
1347 
1348  if (pivot->hypercube()==hc)
1349  i=pivot;
1350  else
1351  {
1352  auto spreadOverHC=make_shared<SpreadOverHC>();
1353  spreadOverHC->hypercube(hc);
1354  spreadOverHC->setArgument(pivot,{});
1355  i=spreadOverHC;
1356  }
1357  }
1358  }
Here is the caller graph for this function: